Files
json/docs/mkdocs/docs/api/basic_json/swap.md
T
Niels Lohmann 52b72b5684 Improve documentation: byte layouts, release pages, See also, dark-mode images (#5906)
- Make the iterator range illustrations legible in dark mode (prefers-color-scheme
  rules inside the SVGs).
- Add a "Byte layout" section with a color-coded byte table to each binary format
  page (BJData, BON8, BSON, CBOR, MessagePack, UBJSON), and highlight the smallest
  size per file in the comparison table.
- Add "See also" sections to the overview pages that lacked one.
- Split the release notes into one page per release, grouped by minor version on
  the overview page, with an "API changes" section per release generated from the
  API pages' version histories (hooks/api_changes.py).
- Fact-check the release notes and version histories against the release tags and
  correct wrong or misleading entries (e.g., json_serializer 2.1.0, merge_patch
  3.1.0, items, count, operator[], to_bjdata, std::string_view key support).

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
2026-10-24 17:57:44 +02:00

7.3 KiB

nlohmann::basic_json::swap

// (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 is defined to #!cpp 1, the start_pos()/end_pos() diagnostic positions are exchanged along with the value. The json_base_class_t 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 is defined to #!cpp 1, the start_pos()/end_pos() diagnostic positions are exchanged along with the value. The json_base_class_t 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 if called on JSON values other than arrays; example: "cannot use swap(array_t&) with boolean"
  4. Throws type_error.310 if called on JSON values other than objects; example: "cannot use swap(object_t&) with boolean"
  5. Throws type_error.310 if called on JSON values other than strings; example: "cannot use swap(string_t&) with boolean"
  6. Throws type_error.310 if called on JSON values other than binaries; example: "cannot use swap(binary_t&) with boolean"
  7. Throws type_error.310 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
--8<-- "examples/swap__reference.cpp"
```

Output:

```json
--8<-- "examples/swap__reference.output"
```

??? example "Example: (3) swap array"

The example below shows how arrays can be swapped with `swap()`.

```cpp
--8<-- "examples/swap__array_t.cpp"
```

Output:

```json
--8<-- "examples/swap__array_t.output"
```

??? example "Example: (4) swap object"

The example below shows how objects can be swapped with `swap()`.

```cpp
--8<-- "examples/swap__object_t.cpp"
```

Output:

```json
--8<-- "examples/swap__object_t.output"
```

??? example "Example: (5) swap string"

The example below shows how strings can be swapped with `swap()`.

```cpp
--8<-- "examples/swap__string_t.cpp"
```

Output:

```json
--8<-- "examples/swap__string_t.output"
```

??? example "Example: (6) swap binary"

The example below shows how binary values can be swapped with `swap()`.

```cpp
--8<-- "examples/swap__binary_t.cpp"
```

Output:

```json
--8<-- "examples/swap__binary_t.output"
```

See also

Version history

  1. Added in version 1.0.0. Exchanges the json_base_class_t subobject along with the value since version 3.13.0.
  2. Added in version 1.0.0. Exchanges the json_base_class_t subobject along with the value since version 3.13.0.
  3. Added in version 1.0.0.
  4. Added in version 1.0.0.
  5. Added in version 1.0.0.
  6. Added in version 3.8.0.
  7. Added in version 3.8.0.