Disable std::swap specialization in C++20 and added a friend swap function
This commit is contained in:
parent
7444c7fa25
commit
225c8f150a
3 changed files with 76 additions and 2 deletions
|
@ -20,7 +20,11 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// C++ language standard detection
|
// C++ language standard detection
|
||||||
#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
|
#if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
|
||||||
|
#define JSON_HAS_CPP_20
|
||||||
|
#define JSON_HAS_CPP_17
|
||||||
|
#define JSON_HAS_CPP_14
|
||||||
|
#elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
|
||||||
#define JSON_HAS_CPP_17
|
#define JSON_HAS_CPP_17
|
||||||
#define JSON_HAS_CPP_14
|
#define JSON_HAS_CPP_14
|
||||||
#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
|
#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
|
||||||
|
|
|
@ -5865,6 +5865,34 @@ class basic_json
|
||||||
/*!
|
/*!
|
||||||
@brief exchanges the values
|
@brief exchanges the values
|
||||||
|
|
||||||
|
Exchanges the contents of the JSON value from @a left with those of @a 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.
|
||||||
|
|
||||||
|
@param[in,out] left JSON value to exchange the contents with
|
||||||
|
@param[in,out] right JSON value to exchange the contents with
|
||||||
|
|
||||||
|
@complexity Constant.
|
||||||
|
|
||||||
|
@liveexample{The example below shows how JSON values can be swapped with
|
||||||
|
`swap()`.,swap__reference}
|
||||||
|
|
||||||
|
@since version 1.0.0
|
||||||
|
*/
|
||||||
|
friend void swap(reference left, reference right) noexcept (
|
||||||
|
std::is_nothrow_move_constructible<value_t>::value and
|
||||||
|
std::is_nothrow_move_assignable<value_t>::value and
|
||||||
|
std::is_nothrow_move_constructible<json_value>::value and
|
||||||
|
std::is_nothrow_move_assignable<json_value>::value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
left.swap(right);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief exchanges the values
|
||||||
|
|
||||||
Exchanges the contents of a JSON array with those of @a other. Does not
|
Exchanges the contents of a JSON array with those of @a other. Does not
|
||||||
invoke any move, copy, or swap operations on individual elements. All
|
invoke any move, copy, or swap operations on individual elements. All
|
||||||
iterators and references remain valid. The past-the-end iterator is
|
iterators and references remain valid. The past-the-end iterator is
|
||||||
|
@ -8635,6 +8663,9 @@ struct less<::nlohmann::detail::value_t>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// C++20 prohibit function specialization in the std namespace.
|
||||||
|
#ifndef JSON_HAS_CPP_20
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief exchanges the values of two JSON objects
|
@brief exchanges the values of two JSON objects
|
||||||
|
|
||||||
|
@ -8649,6 +8680,8 @@ inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcep
|
||||||
j1.swap(j2);
|
j1.swap(j2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
@ -2048,7 +2048,11 @@ JSON_HEDLEY_DIAGNOSTIC_POP
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// C++ language standard detection
|
// C++ language standard detection
|
||||||
#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
|
#if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
|
||||||
|
#define JSON_HAS_CPP_20
|
||||||
|
#define JSON_HAS_CPP_17
|
||||||
|
#define JSON_HAS_CPP_14
|
||||||
|
#elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
|
||||||
#define JSON_HAS_CPP_17
|
#define JSON_HAS_CPP_17
|
||||||
#define JSON_HAS_CPP_14
|
#define JSON_HAS_CPP_14
|
||||||
#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
|
#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
|
||||||
|
@ -21628,6 +21632,34 @@ class basic_json
|
||||||
/*!
|
/*!
|
||||||
@brief exchanges the values
|
@brief exchanges the values
|
||||||
|
|
||||||
|
Exchanges the contents of the JSON value from @a left with those of @a 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.
|
||||||
|
|
||||||
|
@param[in,out] left JSON value to exchange the contents with
|
||||||
|
@param[in,out] right JSON value to exchange the contents with
|
||||||
|
|
||||||
|
@complexity Constant.
|
||||||
|
|
||||||
|
@liveexample{The example below shows how JSON values can be swapped with
|
||||||
|
`swap()`.,swap__reference}
|
||||||
|
|
||||||
|
@since version 1.0.0
|
||||||
|
*/
|
||||||
|
friend void swap(reference left, reference right) noexcept (
|
||||||
|
std::is_nothrow_move_constructible<value_t>::value and
|
||||||
|
std::is_nothrow_move_assignable<value_t>::value and
|
||||||
|
std::is_nothrow_move_constructible<json_value>::value and
|
||||||
|
std::is_nothrow_move_assignable<json_value>::value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
left.swap(right);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief exchanges the values
|
||||||
|
|
||||||
Exchanges the contents of a JSON array with those of @a other. Does not
|
Exchanges the contents of a JSON array with those of @a other. Does not
|
||||||
invoke any move, copy, or swap operations on individual elements. All
|
invoke any move, copy, or swap operations on individual elements. All
|
||||||
iterators and references remain valid. The past-the-end iterator is
|
iterators and references remain valid. The past-the-end iterator is
|
||||||
|
@ -24398,6 +24430,9 @@ struct less<::nlohmann::detail::value_t>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// C++20 prohibit function specialization in the std namespace.
|
||||||
|
#ifndef JSON_HAS_CPP_20
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief exchanges the values of two JSON objects
|
@brief exchanges the values of two JSON objects
|
||||||
|
|
||||||
|
@ -24412,6 +24447,8 @@ inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcep
|
||||||
j1.swap(j2);
|
j1.swap(j2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
Loading…
Reference in a new issue