mirror of
https://github.com/nlohmann/json.git
synced 2026-10-13 17:57:14 +00:00
299 lines
9.8 KiB
Markdown
299 lines
9.8 KiB
Markdown
# <small>nlohmann::basic_json::</small>swap
|
|
|
|
```cpp
|
|
// (1)
|
|
void swap(reference other) noexcept (
|
|
std::is_nothrow_move_constructible<value_t>::value &&
|
|
std::is_nothrow_move_assignable<value_t>::value &&
|
|
std::is_nothrow_move_constructible<json_value>::value &&
|
|
std::is_nothrow_move_assignable<json_value>::value &&
|
|
std::is_nothrow_move_constructible<json_base_class_t>::value &&
|
|
std::is_nothrow_move_assignable<json_base_class_t>::value
|
|
);
|
|
|
|
// (2)
|
|
friend void swap(reference left, reference right) noexcept (
|
|
std::is_nothrow_move_constructible<value_t>::value &&
|
|
std::is_nothrow_move_assignable<value_t>::value &&
|
|
std::is_nothrow_move_constructible<json_value>::value &&
|
|
std::is_nothrow_move_assignable<json_value>::value &&
|
|
std::is_nothrow_move_constructible<json_base_class_t>::value &&
|
|
std::is_nothrow_move_assignable<json_base_class_t>::value
|
|
);
|
|
|
|
// (3)
|
|
void swap(array_t& other);
|
|
|
|
// (4)
|
|
void swap(object_t& other);
|
|
|
|
// (5)
|
|
void swap(string_t& other);
|
|
|
|
// (6)
|
|
void swap(binary_t& other);
|
|
|
|
// (7)
|
|
void swap(typename binary_t::container_type& other);
|
|
```
|
|
|
|
1. Exchanges the contents of the JSON value with those of `other`. Does not invoke any move, copy, or swap operations on
|
|
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated. If macro
|
|
[`JSON_DIAGNOSTIC_POSITIONS`](../macros/json_diagnostic_positions.md) is defined to `#!cpp 1`, the
|
|
[`start_pos()`](start_pos.md)/[`end_pos()`](end_pos.md) diagnostic positions are exchanged along with the value.
|
|
The [`json_base_class_t`](json_base_class_t.md) subobject is exchanged along with the value as well, the same way it
|
|
is copied or moved by the copy/move constructors and assignment operators.
|
|
2. Exchanges the contents of the JSON value from `left` with those of `right`. Does not invoke any move, copy, or swap
|
|
operations on individual elements. All iterators and references remain valid. The past-the-end iterator is
|
|
invalidated. Implemented as a friend function callable via ADL. If macro
|
|
[`JSON_DIAGNOSTIC_POSITIONS`](../macros/json_diagnostic_positions.md) is defined to `#!cpp 1`, the
|
|
[`start_pos()`](start_pos.md)/[`end_pos()`](end_pos.md) diagnostic positions are exchanged along with the value.
|
|
The [`json_base_class_t`](json_base_class_t.md) subobject is exchanged along with the value as well, the same way it
|
|
is copied or moved by the copy/move constructors and assignment operators.
|
|
3. Exchanges the contents of a JSON array with those of `other`. Does not invoke any move, copy, or swap operations on
|
|
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated.
|
|
4. Exchanges the contents of a JSON object with those of `other`. Does not invoke any move, copy, or swap operations on
|
|
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated.
|
|
5. Exchanges the contents of a JSON string with those of `other`. Does not invoke any move, copy, or swap operations on
|
|
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated.
|
|
6. Exchanges the contents of a binary value with those of `other`. Does not invoke any move, copy, or swap operations on
|
|
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated.
|
|
7. Exchanges the contents of a binary value with those of `other`. Does not invoke any move, copy, or swap operations on
|
|
individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated. Unlike
|
|
version (6), no binary subtype is involved.
|
|
|
|
## Parameters
|
|
|
|
`other` (in, out)
|
|
: value to exchange the contents with
|
|
|
|
`left` (in, out)
|
|
: value to exchange the contents with
|
|
|
|
`right` (in, out)
|
|
: value to exchange the contents with
|
|
|
|
## Exception safety
|
|
|
|
1. No-throw guarantee: this function never throws exceptions.
|
|
2. No-throw guarantee: this function never throws exceptions.
|
|
3. Strong guarantee: if an exception is thrown, there are no changes to any JSON value.
|
|
4. Strong guarantee: if an exception is thrown, there are no changes to any JSON value.
|
|
5. Strong guarantee: if an exception is thrown, there are no changes to any JSON value.
|
|
6. Strong guarantee: if an exception is thrown, there are no changes to any JSON value.
|
|
7. Strong guarantee: if an exception is thrown, there are no changes to any JSON value.
|
|
|
|
## Exceptions
|
|
|
|
1. No-throw guarantee: this function never throws exceptions.
|
|
2. No-throw guarantee: this function never throws exceptions.
|
|
3. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than
|
|
arrays; example: `"cannot use swap(array_t&) with boolean"`
|
|
4. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than
|
|
objects; example: `"cannot use swap(object_t&) with boolean"`
|
|
5. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than
|
|
strings; example: `"cannot use swap(string_t&) with boolean"`
|
|
6. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than
|
|
binaries; example: `"cannot use swap(binary_t&) with boolean"`
|
|
7. Throws [`type_error.310`](../../home/exceptions.md#jsonexceptiontype_error310) if called on JSON values other than
|
|
binaries; example: `"cannot use swap(binary_t::container_type&) with boolean"`
|
|
|
|
## Complexity
|
|
|
|
Constant.
|
|
|
|
## Examples
|
|
|
|
??? example "Example: (1, 2) swap JSON values"
|
|
|
|
The example below shows how JSON values can be swapped with `swap()`.
|
|
|
|
```cpp
|
|
#include <iostream>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
using json = nlohmann::json;
|
|
|
|
int main()
|
|
{
|
|
// create two JSON values
|
|
json j1 = {1, 2, 3, 4, 5};
|
|
json j2 = {{"pi", 3.141592653589793}, {"e", 2.718281828459045}};
|
|
|
|
// swap the values
|
|
j1.swap(j2);
|
|
|
|
// output the values
|
|
std::cout << "j1 = " << j1 << '\n';
|
|
std::cout << "j2 = " << j2 << '\n';
|
|
}
|
|
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
j1 = {"e":2.718281828459045,"pi":3.141592653589793}
|
|
j2 = [1,2,3,4,5]
|
|
|
|
```
|
|
|
|
??? example "Example: (3) swap array"
|
|
|
|
The example below shows how arrays can be swapped with `swap()`.
|
|
|
|
```cpp
|
|
#include <iostream>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
using json = nlohmann::json;
|
|
|
|
int main()
|
|
{
|
|
// create a JSON value
|
|
json value = {{"array", {1, 2, 3, 4}}};
|
|
|
|
// create an array_t
|
|
json::array_t array = {"Snap", "Crackle", "Pop"};
|
|
|
|
// swap the array stored in the JSON value
|
|
value["array"].swap(array);
|
|
|
|
// output the values
|
|
std::cout << "value = " << value << '\n';
|
|
std::cout << "array = " << array << '\n';
|
|
}
|
|
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
value = {"array":["Snap","Crackle","Pop"]}
|
|
array = [1,2,3,4]
|
|
|
|
```
|
|
|
|
??? example "Example: (4) swap object"
|
|
|
|
The example below shows how objects can be swapped with `swap()`.
|
|
|
|
```cpp
|
|
#include <iostream>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
using json = nlohmann::json;
|
|
|
|
int main()
|
|
{
|
|
// create a JSON value
|
|
json value = { {"translation", {{"one", "eins"}, {"two", "zwei"}}} };
|
|
|
|
// create an object_t
|
|
json::object_t object = {{"cow", "Kuh"}, {"dog", "Hund"}};
|
|
|
|
// swap the object stored in the JSON value
|
|
value["translation"].swap(object);
|
|
|
|
// output the values
|
|
std::cout << "value = " << value << '\n';
|
|
std::cout << "object = " << object << '\n';
|
|
}
|
|
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
value = {"translation":{"cow":"Kuh","dog":"Hund"}}
|
|
object = {"one":"eins","two":"zwei"}
|
|
|
|
```
|
|
|
|
??? example "Example: (5) swap string"
|
|
|
|
The example below shows how strings can be swapped with `swap()`.
|
|
|
|
```cpp
|
|
#include <iostream>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
using json = nlohmann::json;
|
|
|
|
int main()
|
|
{
|
|
// create a JSON value
|
|
json value = { "the good", "the bad", "the ugly" };
|
|
|
|
// create string_t
|
|
json::string_t string = "the fast";
|
|
|
|
// swap the object stored in the JSON value
|
|
value[1].swap(string);
|
|
|
|
// output the values
|
|
std::cout << "value = " << value << '\n';
|
|
std::cout << "string = " << string << '\n';
|
|
}
|
|
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
value = ["the good","the fast","the ugly"]
|
|
string = the bad
|
|
|
|
```
|
|
|
|
??? example "Example: (6) swap binary"
|
|
|
|
The example below shows how binary values can be swapped with `swap()`.
|
|
|
|
```cpp
|
|
#include <iostream>
|
|
#include <nlohmann/json.hpp>
|
|
|
|
using json = nlohmann::json;
|
|
|
|
int main()
|
|
{
|
|
// create a binary value
|
|
json value = json::binary({1, 2, 3});
|
|
|
|
// create a binary_t
|
|
json::binary_t binary = {{4, 5, 6}};
|
|
|
|
// swap the object stored in the JSON value
|
|
value.swap(binary);
|
|
|
|
// output the values
|
|
std::cout << "value = " << value << '\n';
|
|
std::cout << "binary = " << json(binary) << '\n';
|
|
}
|
|
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
value = {"bytes":[4,5,6],"subtype":null}
|
|
binary = {"bytes":[1,2,3],"subtype":null}
|
|
|
|
```
|
|
|
|
## See also
|
|
|
|
- [std::swap<basic_json\>](std_swap.md)
|
|
- [operator=](operator=.md) copy assignment
|
|
- [basic_json](basic_json.md) create a JSON value
|
|
|
|
## Version history
|
|
|
|
1. Since version 1.0.0. Exchanges the `json_base_class_t` subobject along with the value since version 3.13.0.
|
|
2. Since version 1.0.0. Exchanges the `json_base_class_t` subobject along with the value since version 3.13.0.
|
|
3. Since version 1.0.0.
|
|
4. Since version 1.0.0.
|
|
5. Since version 1.0.0.
|
|
6. Since version 3.8.0.
|
|
7. Since version 3.8.0. |