diff --git a/docs/mkdocs/docs/api/basic_json/index.md b/docs/mkdocs/docs/api/basic_json/index.md
index bc4dba153..2191d671f 100644
--- a/docs/mkdocs/docs/api/basic_json/index.md
+++ b/docs/mkdocs/docs/api/basic_json/index.md
@@ -233,9 +233,10 @@ Access to the JSON value
- [**operator==**](operator_eq.md) - comparison: equal
- [**operator!=**](operator_ne.md) - comparison: not equal
- [**operator<**](operator_lt.md) - comparison: less than
-- [**operator<=**](operator_le.md) - comparison: less than or equal
- [**operator>**](operator_gt.md) - comparison: greater than
+- [**operator<=**](operator_le.md) - comparison: less than or equal
- [**operator>=**](operator_ge.md) - comparison: greater than or equal
+- [**operator<=>**](operator_spaceship.md) - comparison: 3-way
### Serialization / Dumping
diff --git a/docs/mkdocs/docs/api/basic_json/operator_eq.md b/docs/mkdocs/docs/api/basic_json/operator_eq.md
index 3eec4fda4..6c86bf13e 100644
--- a/docs/mkdocs/docs/api/basic_json/operator_eq.md
+++ b/docs/mkdocs/docs/api/basic_json/operator_eq.md
@@ -1,21 +1,31 @@
# nlohmann::basic_json::operator==
```cpp
-bool operator==(const_reference lhs, const_reference rhs) noexcept;
+// until C++20
+bool operator==(const_reference lhs, const_reference rhs) noexcept; // (1)
template
-bool operator==(const_reference lhs, const ScalarType rhs) noexcept;
+bool operator==(const_reference lhs, const ScalarType rhs) noexcept; // (2)
template
-bool operator==(ScalarType lhs, const const_reference rhs) noexcept;
+bool operator==(ScalarType lhs, const const_reference rhs) noexcept; // (2)
+
+// since C++20
+class basic_json {
+ bool operator==(const_reference rhs) const noexcept; // (1)
+
+ template
+ bool operator==(ScalarType rhs) const noexcept; // (2)
+};
```
-Compares two JSON values for equality according to the following rules:
+1. Compares two JSON values for equality according to the following rules:
+ - Two JSON values are equal if (1) neither value is discarded, or (2) they are of the same
+ type and their stored values are the same according to their respective `operator==`.
+ - Integer and floating-point numbers are automatically converted before comparison.
-- Two JSON values are equal if (1) they are not discarded, (2) they are from the same type, and (3) their stored values
- are the same according to their respective `operator==`.
-- Integer and floating-point numbers are automatically converted before comparison. Note that two NaN values are always
- treated as unequal.
+2. Compares a JSON value and a scalar or a scalar and a JSON value for equality by converting the
+ scalar to a JSON value and comparing both JSON values according to 1.
## Template parameters
@@ -32,7 +42,7 @@ Compares two JSON values for equality according to the following rules:
## Return value
-whether the values `lhs` and `rhs` are equal
+whether the values `lhs`/`*this` and `rhs` are equal
## Exception safety
@@ -46,7 +56,11 @@ Linear.
!!! note "Comparing special values"
- - NaN values never compare equal to themselves or to other NaN values.
+ - `NaN` values are unordered within the domain of numbers.
+ The following comparisons all yield `#!cpp false`:
+ 1. Comparing a `NaN` with itself.
+ 2. Comparing a `NaN` with another `NaN`.
+ 3. Comparing a `NaN` and any other number.
- JSON `#!cpp null` values are all equal.
- Discarded values never compare equal to themselves.
@@ -117,4 +131,5 @@ Linear.
## Version history
-- Added in version 1.0.0.
+1. Added in version 1.0.0. Added C++20 member functions in version 3.11.0.
+2. Added in version 1.0.0. Added C++20 member functions in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/basic_json/operator_ge.md b/docs/mkdocs/docs/api/basic_json/operator_ge.md
index 68aac6557..6730f6809 100644
--- a/docs/mkdocs/docs/api/basic_json/operator_ge.md
+++ b/docs/mkdocs/docs/api/basic_json/operator_ge.md
@@ -1,17 +1,25 @@
# nlohmann::basic_json::operator>=
```cpp
-bool operator>=(const_reference lhs, const_reference rhs) noexcept,
+// until C++20
+bool operator>=(const_reference lhs, const_reference rhs) noexcept; // (1)
template
-bool operator>=(const_reference lhs, const ScalarType rhs) noexcept;
+bool operator>=(const_reference lhs, const ScalarType rhs) noexcept; // (2)
template
-bool operator>=(ScalarType lhs, const const_reference rhs) noexcept;
+bool operator>=(ScalarType lhs, const const_reference rhs) noexcept; // (2)
```
-Compares whether one JSON value `lhs` is greater than or equal to another JSON value `rhs` by calculating
-`#!cpp !(lhs < rhs)`.
+1. Compares whether one JSON value `lhs` is greater than or equal to another JSON value `rhs`
+ according to the following rules:
+ - The comparison always yields `#!cpp false` if (1) either operand is discarded, or (2) either
+ operand is `NaN` and the other operand is either `NaN` or any other number.
+ - Otherwise, returns the result of `#!cpp !(lhs < rhs)`.
+
+2. Compares wether a JSON value is greater than or equal to a scalar or a scalar is greater than or
+ equal to a JSON value by converting the scalar to a JSON value and comparing both JSON values
+ according to 1.
## Template parameters
@@ -38,6 +46,21 @@ No-throw guarantee: this function never throws exceptions.
Linear.
+## Notes
+
+!!! note "Comparing `NaN`"
+
+ `NaN` values are unordered within the domain of numbers.
+ The following comparisons all yield `#!cpp false`:
+ 1. Comparing a `NaN` with itself.
+ 2. Comparing a `NaN` with another `NaN`.
+ 3. Comparing a `NaN` and any other number.
+
+!!! note "Operator overload resolution"
+
+ Since C++20 overload resolution will consider the _rewritten candidate_ generated from
+ [`operator<=>`](operator_spaceship.md).
+
## Examples
??? example
@@ -54,6 +77,11 @@ Linear.
--8<-- "examples/operator__greaterequal.output"
```
+## See also
+
+- [**operator<=>**](operator_spaceship.md) comparison: 3-way
+
## Version history
-- Added in version 1.0.0.
+1. Added in version 1.0.0. Conditionally removed since C++20 in version 3.11.0.
+2. Added in version 1.0.0. Conditionally removed since C++20 in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/basic_json/operator_gt.md b/docs/mkdocs/docs/api/basic_json/operator_gt.md
index 92ec30594..540e6076d 100644
--- a/docs/mkdocs/docs/api/basic_json/operator_gt.md
+++ b/docs/mkdocs/docs/api/basic_json/operator_gt.md
@@ -1,16 +1,24 @@
# nlohmann::basic_json::operator>
```cpp
-bool operator>(const_reference lhs, const_reference rhs) noexcept,
+// until C++20
+bool operator>(const_reference lhs, const_reference rhs) noexcept; // (1)
template
-bool operator>(const_reference lhs, const ScalarType rhs) noexcept;
+bool operator>(const_reference lhs, const ScalarType rhs) noexcept; // (2)
template
-bool operator>(ScalarType lhs, const const_reference rhs) noexcept;
+bool operator>(ScalarType lhs, const const_reference rhs) noexcept; // (2)
```
-Compares whether one JSON value `lhs` is greater than another JSON value `rhs` by calculating `#!cpp !(lhs <= rhs)`.
+1. Compares whether one JSON value `lhs` is greater than another JSON value `rhs` according to the
+ following rules:
+ - The comparison always yields `#!cpp false` if (1) either operand is discarded, or (2) either
+ operand is `NaN` and the other operand is either `NaN` or any other number.
+ - Otherwise, returns the result of `#!cpp !(lhs <= rhs)`.
+
+2. Compares wether a JSON value is greater than a scalar or a scalar is greater than a JSON value by
+ converting the scalar to a JSON value and comparing both JSON values according to 1.
## Template parameters
@@ -37,6 +45,21 @@ No-throw guarantee: this function never throws exceptions.
Linear.
+## Notes
+
+!!! note "Comparing `NaN`"
+
+ `NaN` values are unordered within the domain of numbers.
+ The following comparisons all yield `#!cpp false`:
+ 1. Comparing a `NaN` with itself.
+ 2. Comparing a `NaN` with another `NaN`.
+ 3. Comparing a `NaN` and any other number.
+
+!!! note "Operator overload resolution"
+
+ Since C++20 overload resolution will consider the _rewritten candidate_ generated from
+ [`operator<=>`](operator_spaceship.md).
+
## Examples
??? example
@@ -53,6 +76,11 @@ Linear.
--8<-- "examples/operator__greater.output"
```
+## See also
+
+- [**operator<=>**](operator_spaceship.md) comparison: 3-way
+
## Version history
-- Added in version 1.0.0.
+1. Added in version 1.0.0. Conditionally removed since C++20 in version 3.11.0.
+2. Added in version 1.0.0. Conditionally removed since C++20 in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/basic_json/operator_le.md b/docs/mkdocs/docs/api/basic_json/operator_le.md
index 54f9a2809..c0f90acb2 100644
--- a/docs/mkdocs/docs/api/basic_json/operator_le.md
+++ b/docs/mkdocs/docs/api/basic_json/operator_le.md
@@ -1,17 +1,25 @@
# nlohmann::basic_json::operator<=
```cpp
-bool operator<=(const_reference lhs, const_reference rhs) noexcept,
+// until C++20
+bool operator<=(const_reference lhs, const_reference rhs) noexcept; // (1)
template
-bool operator<=(const_reference lhs, const ScalarType rhs) noexcept;
+bool operator<=(const_reference lhs, const ScalarType rhs) noexcept; // (2)
template
-bool operator<=(ScalarType lhs, const const_reference rhs) noexcept;
+bool operator<=(ScalarType lhs, const const_reference rhs) noexcept; // (2)
```
-Compares whether one JSON value `lhs` is less than or equal to another JSON value `rhs` by calculating
-`#cpp !(rhs < lhs)`.
+1. Compares whether one JSON value `lhs` is less than or equal to another JSON value `rhs`
+ according to the following rules:
+ - The comparison always yields `#!cpp false` if (1) either operand is discarded, or (2) either
+ operand is `NaN` and the other operand is either `NaN` or any other number.
+ - Otherwise, returns the result of `#!cpp !(rhs < lhs)`.
+
+1. Compares wether a JSON value is less than or equal to a scalar or a scalar is less than or equal
+ to a JSON value by converting the scalar to a JSON value and comparing both JSON values according
+ to 1.
## Template parameters
@@ -38,6 +46,21 @@ No-throw guarantee: this function never throws exceptions.
Linear.
+## Notes
+
+!!! note "Comparing `NaN`"
+
+ `NaN` values are unordered within the domain of numbers.
+ The following comparisons all yield `#!cpp false`:
+ 1. Comparing a `NaN` with itself.
+ 2. Comparing a `NaN` with another `NaN`.
+ 3. Comparing a `NaN` and any other number.
+
+!!! note "Operator overload resolution"
+
+ Since C++20 overload resolution will consider the _rewritten candidate_ generated from
+ [`operator<=>`](operator_spaceship.md).
+
## Examples
??? example
@@ -54,6 +77,11 @@ Linear.
--8<-- "examples/operator__lessequal.output"
```
+## See also
+
+- [**operator<=>**](operator_spaceship.md) comparison: 3-way
+
## Version history
-- Added in version 1.0.0.
+1. Added in version 1.0.0. Conditionally removed since C++20 in version 3.11.0.
+2. Added in version 1.0.0. Conditionally removed since C++20 in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/basic_json/operator_lt.md b/docs/mkdocs/docs/api/basic_json/operator_lt.md
index d1a4999b4..b5d191ec4 100644
--- a/docs/mkdocs/docs/api/basic_json/operator_lt.md
+++ b/docs/mkdocs/docs/api/basic_json/operator_lt.md
@@ -1,31 +1,34 @@
# nlohmann::basic_json::operator<
```cpp
-bool operator<(const_reference lhs, const_reference rhs) noexcept;
+// until C++20
+bool operator<(const_reference lhs, const_reference rhs) noexcept; // (1)
template
-bool operator<(const_reference lhs, const ScalarType rhs) noexcept;
+bool operator<(const_reference lhs, const ScalarType rhs) noexcept; // (2)
template
-bool operator<(ScalarType lhs, const const_reference rhs) noexcept;
+bool operator<(ScalarType lhs, const const_reference rhs) noexcept; // (2)
```
-Compares whether one JSON value `lhs` is less than another JSON value `rhs` according to the following rules:
+1. Compares whether one JSON value `lhs` is less than another JSON value `rhs` according to the
+ following rules:
+ - If either operand is discarded, the comparison yields `#!cpp false`.
+ - If both operands have the same type, the values are compared using their respective `operator<`.
+ - Integer and floating-point numbers are automatically converted before comparison.
+ - In case `lhs` and `rhs` have different types, the values are ignored and the order of the types
+ is considered, which is:
+ 1. null
+ 2. boolean
+ 3. number (all types)
+ 4. object
+ 5. array
+ 6. string
+ 7. binary
+ For instance, any boolean value is considered less than any string.
-- If `lhs` and `rhs` have the same type, the values are compared using the default `<` operator.
-- Integer and floating-point numbers are automatically converted before comparison
-- Discarded values a
-- In case `lhs` and `rhs` have different types, the values are ignored and the order of the types is considered, which
- is:
- 1. null
- 2. boolean
- 3. number (all types)
- 4. object
- 5. array
- 6. string
- 7. binary
-
- For instance, any boolean value is considered less than any string.
+2. Compares wether a JSON value is less than a scalar or a scalar is less than a JSON value by converting
+ the scalar to a JSON value and comparing both JSON values according to 1.
## Template parameters
@@ -52,6 +55,21 @@ No-throw guarantee: this function never throws exceptions.
Linear.
+## Notes
+
+!!! note "Comparing `NaN`"
+
+ `NaN` values are unordered within the domain of numbers.
+ The following comparisons all yield `#!cpp false`:
+ 1. Comparing a `NaN` with itself.
+ 2. Comparing a `NaN` with another `NaN`.
+ 3. Comparing a `NaN` and any other number.
+
+!!! note "Operator overload resolution"
+
+ Since C++20 overload resolution will consider the _rewritten candidate_ generated from
+ [`operator<=>`](operator_spaceship.md).
+
## Examples
??? example
@@ -68,6 +86,11 @@ Linear.
--8<-- "examples/operator__less.output"
```
+## See also
+
+- [**operator<=>**](operator_spaceship.md) comparison: 3-way
+
## Version history
-- Added in version 1.0.0.
+1. Added in version 1.0.0. Conditionally removed since C++20 in version 3.11.0.
+2. Added in version 1.0.0. Conditionally removed since C++20 in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/basic_json/operator_ne.md b/docs/mkdocs/docs/api/basic_json/operator_ne.md
index e94da9b76..f5d989b50 100644
--- a/docs/mkdocs/docs/api/basic_json/operator_ne.md
+++ b/docs/mkdocs/docs/api/basic_json/operator_ne.md
@@ -1,16 +1,32 @@
# nlohmann::basic_json::operator!=
```cpp
-bool operator!=(const_reference lhs, const_reference rhs) noexcept;
+// until C++20
+bool operator!=(const_reference lhs, const_reference rhs) noexcept; // (1)
template
-bool operator!=(const_reference lhs, const ScalarType rhs) noexcept;
+bool operator!=(const_reference lhs, const ScalarType rhs) noexcept; // (2)
template
-bool operator!=(ScalarType lhs, const const_reference rhs) noexcept;
+bool operator!=(ScalarType lhs, const const_reference rhs) noexcept; // (2)
+
+// since C++20
+class basic_json {
+ bool operator!=(const_reference rhs) const noexcept; // (1)
+
+ template
+ bool operator!=(ScalarType rhs) const noexcept; // (2)
+};
```
-Compares two JSON values for inequality by calculating `#!cpp !(lhs == rhs)`.
+1. Compares two JSON values for inequality according to the following rules:
+ - The comparison always yields `#!cpp false` if (1) either operand is discarded, or (2) either
+ operand is `NaN` and the other operand is either `NaN` or any other number.
+ - Otherwise, returns the result of `#!cpp !(lhs == rhs)` (until C++20) or
+ `#!cpp !(*this == rhs)` (since C++20).
+
+2. Compares a JSON value and a scalar or a scalar and a JSON value for inequality by converting the
+ scalar to a JSON value and comparing both JSON values according to 1.
## Template parameters
@@ -27,7 +43,7 @@ Compares two JSON values for inequality by calculating `#!cpp !(lhs == rhs)`.
## Return value
-whether the values `lhs` and `rhs` are not equal
+whether the values `lhs`/`*this` and `rhs` are not equal
## Exception safety
@@ -37,6 +53,16 @@ No-throw guarantee: this function never throws exceptions.
Linear.
+## Notes
+
+!!! note "Comparing `NaN`"
+
+ `NaN` values are unordered within the domain of numbers.
+ The following comparisons all yield `#!cpp false`:
+ 1. Comparing a `NaN` with itself.
+ 2. Comparing a `NaN` with another `NaN`.
+ 3. Comparing a `NaN` and any other number.
+
## Examples
??? example
@@ -69,4 +95,5 @@ Linear.
## Version history
-- Added in version 1.0.0.
+1. Added in version 1.0.0. Added C++20 member functions in version 3.11.0.
+2. Added in version 1.0.0. Added C++20 member functions in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/basic_json/operator_spaceship.md b/docs/mkdocs/docs/api/basic_json/operator_spaceship.md
index 72c5b8232..4beba4f86 100644
--- a/docs/mkdocs/docs/api/basic_json/operator_spaceship.md
+++ b/docs/mkdocs/docs/api/basic_json/operator_spaceship.md
@@ -1,5 +1,70 @@
# nlohmann::basic_json::operator<=>
+```cpp
+// since C++20
+class basic_json {
+ std::partial_ordering operator<=>(const_reference rhs) const noexcept; // (1)
+
+ template
+ std::partial_ordering operator<=>(const ScalarType rhs) const noexcept; // (2)
+};
+```
+
+1. 3-way compares two JSON values producing a result of type `std::partial_ordering` according to the following rules:
+ - Two JSON values compare with a result of `std::partial_ordering::unordered` if either value is discarded.
+ - If both JSON values are of the same type, the result is produced by 3-way comparing their stored values using their
+ respective `operator<=>`.
+ - Integer and floating-point numbers are converted to their common type and then 3-way compared using their respective
+ `operator<=>`.
+ For instance, comparing an integer and a floating-point value will 3-way compare the first value convertered to
+ floating-point with the second value.
+ - Otherwise, yields a result by comparing the type (see [`value_t`](value_t.md)).
+
+2. 3-way compares a JSON value and a scalar or a scalar and a JSON value by converting the scalar to a JSON value and 3-way
+ comparing both JSON values (see 1).
+
+## Template parameters
+
+`ScalarType`
+: a scalar type according to `std::is_scalar::value`
+
+## Parameters
+
+`rhs` (in)
+: second value to consider
+
+## Return value
+
+the `std::partial_ordering` of the 3-way comparison of `*this` and `rhs`
+
+## Exception safety
+
+No-throw guarantee: this function never throws exceptions.
+
+## Complexity
+
+Linear.
+
+## Notes
+
+!!! note "Comparing `NaN`"
+
+ - `NaN` values are unordered within the domain of numbers.
+ The following comparisons all yield `std::partial_ordering::unordered`:
+ 1. Comparing a `NaN` with itself.
+ 2. Comparing a `NaN` with another `NaN`.
+ 3. Comparing a `NaN` and any other number.
+
+## See also
+
+- [**operator==**](operator_eq.md) - comparison: equal
+- [**operator!=**](operator_ne.md) - comparison: not equal
+- [**operator<**](operator_lt.md) - comparison: less than
+- [**operator<=**](operator_le.md) - comparison: less than or equal
+- [**operator>**](operator_gt.md) - comparison: greater than
+- [**operator>=**](operator_ge.md) - comparison: greater than or equal
+
## Version history
-- Added in version 3.11.0.
+1. Added in version 3.11.0.
+2. Added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/basic_json/value_t.md b/docs/mkdocs/docs/api/basic_json/value_t.md
index e7d32c480..f83574083 100644
--- a/docs/mkdocs/docs/api/basic_json/value_t.md
+++ b/docs/mkdocs/docs/api/basic_json/value_t.md
@@ -24,10 +24,41 @@ functions [`is_null`](is_null.md), [`is_object`](is_object.md), [`is_array`](is_
## Notes
-There are three enumeration entries (number_integer, number_unsigned, and number_float), because the library
-distinguishes these three types for numbers: [`number_unsigned_t`](number_unsigned_t.md) is used for unsigned integers,
-[`number_integer_t`](number_integer_t.md) is used for signed integers, and [`number_float_t`](number_float_t.md) is used
-for floating-point numbers or to approximate integers which do not fit in the limits of their respective type.
+!!! note "Ordering"
+
+ The order of types is as follows:
+
+ 1. `null`
+ 2. `boolean`
+ 3. `number_integer`, `number_unsigned`, `number_float`
+ 4. `object`
+ 5. `array`
+ 6. `string`
+ 7. `binary`
+
+ `discarded` is unordered.
+
+!!! note "Types of numbers"
+
+ There are three enumerators for numbers (`number_integer`, `number_unsigned`, and `number_float`) to distinguish
+ between different types of numbers:
+
+ - [`number_unsigned_t`](number_unsigned_t.md) for unsigned integers
+ - [`number_integer_t`](number_integer_t.md) for signed integers
+ - [`number_float_t`](number_float_t.md) for floating-point numbers or to approximate integers which do not fit
+ into the limits of their respective type
+
+!!! warning "Comparison operators"
+
+ `operator<` and `operator<=>` (since C++20) are overloaded and compare according to the ordering described above.
+ Until C++20 all other relational and equality operators yield results according to the integer value of each
+ enumerator.
+ Since C++20 some compilers consider the _rewritten candidates_ generated from `operator<=>` during overload
+ resolution, while others do not.
+ For predictable and portable behavior use:
+
+ - `operator<` or `operator<=>` when wanting to compare according to the order described above
+ - `operator==` or `operator!=` when wanting to compare according to each enumerators integer value
## Examples
diff --git a/docs/mkdocs/docs/api/macros/index.md b/docs/mkdocs/docs/api/macros/index.md
index 56924da44..5f0a7a194 100644
--- a/docs/mkdocs/docs/api/macros/index.md
+++ b/docs/mkdocs/docs/api/macros/index.md
@@ -17,6 +17,8 @@ header. See also the [macro overview page](../../features/macros.md).
- [**JSON_HAS_CPP_11**
**JSON_HAS_CPP_14**
**JSON_HAS_CPP_17**
**JSON_HAS_CPP_20**](json_has_cpp_11.md) - set supported C++ standard
- [**JSON_HAS_FILESYSTEM**
**JSON_HAS_EXPERIMENTAL_FILESYSTEM**](json_has_filesystem.md) - control `std::filesystem` support
+- [**JSON_HAS_RANGES**](json_has_ranges.md) - control `std::ranges` support
+- [**JSON_HAS_THREE_WAY_COMPARISON**](json_has_three_way_comparison.md) - control 3-way comparison support
- [**JSON_NO_IO**](json_no_io.md) - switch off functions relying on certain C++ I/O headers
- [**JSON_SKIP_UNSUPPORTED_COMPILER_CHECK**](json_skip_unsupported_compiler_check.md) - do not warn about unsupported compilers
@@ -29,6 +31,12 @@ header. See also the [macro overview page](../../features/macros.md).
- [**JSON_USE_IMPLICIT_CONVERSIONS**](json_use_implicit_conversions.md) - control implicit conversions
+
+## Comparison behavior
+
+- [**JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON**](json_use_legacy_discarded_value_comparison.md) -
+ control comparison of discarded values
+
## Serialization/deserialization macros
- [**NLOHMANN_DEFINE_TYPE_INTRUSIVE(type, member...)**
**NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(type, member...)**](nlohmann_define_type_intrusive.md) - serialization/deserialization of types _with_ access to private variables
diff --git a/docs/mkdocs/docs/api/macros/json_has_ranges.md b/docs/mkdocs/docs/api/macros/json_has_ranges.md
new file mode 100644
index 000000000..ae596979e
--- /dev/null
+++ b/docs/mkdocs/docs/api/macros/json_has_ranges.md
@@ -0,0 +1,18 @@
+# JSON_HAS_RANGES
+
+```cpp
+#define JSON_HAS_RANGES /* value */
+```
+
+This macro indicates whether the standard library has any support for ranges. Implies support for concepts.
+Possible values are `1` when supported or `0` when unsupported.
+
+## Default definition
+
+The default value is detected based on the preprocessor macro `#!cpp __cpp_lib_ranges`.
+
+When the macro is not defined, the library will define it to its default value.
+
+## Version history
+
+- Added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/macros/json_has_three_way_comparison.md b/docs/mkdocs/docs/api/macros/json_has_three_way_comparison.md
new file mode 100644
index 000000000..fc1dcb43c
--- /dev/null
+++ b/docs/mkdocs/docs/api/macros/json_has_three_way_comparison.md
@@ -0,0 +1,19 @@
+# JSON_HAS_THREE_WAY_COMPARISON
+
+```cpp
+#define JSON_HAS_THREE_WAY_COMPARISON /* value */
+```
+
+This macro indicates whether the compiler and standard library support 3-way comparison.
+Possible values are `1` when supported or `0` when unsupported.
+
+## Default definition
+
+The default value is detected based on the preprocessor macros `#!cpp __cpp_impl_three_way_comparison`
+and `#!cpp __cpp_lib_three_way_comparison`.
+
+When the macro is not defined, the library will define it to its default value.
+
+## Version history
+
+- Added in version 3.11.0.
diff --git a/docs/mkdocs/docs/api/macros/json_use_legacy_discarded_value_comparison.md b/docs/mkdocs/docs/api/macros/json_use_legacy_discarded_value_comparison.md
new file mode 100644
index 000000000..4f630db12
--- /dev/null
+++ b/docs/mkdocs/docs/api/macros/json_use_legacy_discarded_value_comparison.md
@@ -0,0 +1,61 @@
+# JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
+
+```cpp
+#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON /* value */
+```
+
+This macro enables the (incorrect) legacy comparison behavior of discarded JSON values.
+Possible values are `1` to enable or `0` to disable (default).
+
+When enabled, comparisons involving at least one discarded JSON value yield results as follows:
+
+| **Operator** | **Result** |
+|--------------|---------------|
+| `==` | `#!cpp false` |
+| `!=` | `#!cpp true` |
+| `<` | `#!cpp false` |
+| `<=` | `#!cpp true` |
+| `>=` | `#!cpp true` |
+| `>` | `#!cpp false` |
+
+Otherwise, comparisons involving at least one discarded JSON value always yield `#!cpp false`.
+
+## Default definition
+
+The default value is `0`.
+
+```cpp
+#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0
+```
+
+When the macro is not defined, the library will define it to its default value.
+
+## Notes
+
+!!! warning "Inconsistent behavior in C++20 and beyond"
+
+ When targeting C++20 or above, enabling the legacy comparison behavior is _strongly_
+ discouraged.
+
+ - The 3-way comparison operator (`<=>`) will always give the correct result
+ (`#!cpp std::partial_ordering::unordered`) regardless of the value of
+ `JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON`.
+ - Overloads for the equality and relational operators emulate the legacy behavior.
+
+ Code outside your control may use either 3-way comparison or the equality and
+ relational operators, resulting in inconsistent and unpredictable behavior.
+
+ See [`operator<=>`](../basic_json/operator_spaceship.md) for more information on 3-way
+ comparison.
+
+!!! warning "Deprecation"
+
+ The legacy comparison behavior is deprecated and may be removed in a future major
+ version release.
+
+ New code should not depend on it and existing code should try to remove or rewrite
+ expressions relying on it.
+
+## Version history
+
+- Added in version 3.11.0.
diff --git a/docs/mkdocs/docs/css/custom.css b/docs/mkdocs/docs/css/custom.css
new file mode 100644
index 000000000..7a1008b0b
--- /dev/null
+++ b/docs/mkdocs/docs/css/custom.css
@@ -0,0 +1,4 @@
+/* disable ligatures in code and preformatted blocks */
+code, pre {
+ font-variant-ligatures: none;
+}
diff --git a/docs/mkdocs/mkdocs.yml b/docs/mkdocs/mkdocs.yml
index 2470ba0ec..08ef336db 100644
--- a/docs/mkdocs/mkdocs.yml
+++ b/docs/mkdocs/mkdocs.yml
@@ -154,16 +154,16 @@ nav:
- 'operator value_t': api/basic_json/operator_value_t.md
- 'operator[]': api/basic_json/operator[].md
- 'operator=': api/basic_json/operator=.md
- - 'operator<=>': api/basic_json/operator_spaceship.md
+ - 'operator+=': api/basic_json/operator+=.md
- 'operator==': api/basic_json/operator_eq.md
- 'operator!=': api/basic_json/operator_ne.md
- 'operator<': api/basic_json/operator_lt.md
- - 'operator<<': api/basic_json/operator_ltlt.md
- - 'operator<=': api/basic_json/operator_le.md
- 'operator>': api/basic_json/operator_gt.md
- - 'operator>>': api/basic_json/operator_gtgt.md
+ - 'operator<=': api/basic_json/operator_le.md
- 'operator>=': api/basic_json/operator_ge.md
- - 'operator+=': api/basic_json/operator+=.md
+ - 'operator<=>': api/basic_json/operator_spaceship.md
+ - 'operator<<': api/basic_json/operator_ltlt.md
+ - 'operator>>': api/basic_json/operator_gtgt.md
- 'operator""_json': api/basic_json/operator_literal_json.md
- 'operator""_json_pointer': api/basic_json/operator_literal_json_pointer.md
- 'out_of_range': api/basic_json/out_of_range.md
@@ -247,6 +247,8 @@ nav:
- 'JSON_HAS_CPP_20': api/macros/json_has_cpp_11.md
- 'JSON_HAS_EXPERIMENTAL_FILESYSTEM': api/macros/json_has_filesystem.md
- 'JSON_HAS_FILESYSTEM': api/macros/json_has_filesystem.md
+ - 'JSON_HAS_RANGES': api/macros/json_has_ranges.md
+ - 'JSON_HAS_THREE_WAY_COMPARISON': api/macros/json_has_three_way_comparison.md
- 'JSON_NOEXCEPTION': api/macros/json_noexception.md
- 'JSON_NO_IO': api/macros/json_no_io.md
- 'JSON_SKIP_LIBRARY_VERSION_CHECK': api/macros/json_skip_library_version_check.md
@@ -254,6 +256,7 @@ nav:
- 'JSON_THROW_USER': api/macros/json_throw_user.md
- 'JSON_TRY_USER': api/macros/json_throw_user.md
- 'JSON_USE_IMPLICIT_CONVERSIONS': api/macros/json_use_implicit_conversions.md
+ - 'JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON': api/macros/json_use_legacy_discarded_value_comparison.md
- 'NLOHMANN_DEFINE_TYPE_INTRUSIVE': api/macros/nlohmann_define_type_intrusive.md
- 'NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT': api/macros/nlohmann_define_type_intrusive.md
- 'NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE': api/macros/nlohmann_define_type_non_intrusive.md
@@ -320,5 +323,8 @@ plugins:
minify_html: true
- git-revision-date-localized
+extra_css:
+ - css/custom.css
+
extra_javascript:
- https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML