♻️ overwork std specializations
This commit is contained in:
parent
ca5ecc2945
commit
42c37d9c01
@ -4707,20 +4707,16 @@ std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j)
|
||||
// nonmember support //
|
||||
///////////////////////
|
||||
|
||||
// specialization of std::swap, and std::hash
|
||||
namespace std
|
||||
{
|
||||
|
||||
/// hash value for JSON objects
|
||||
template<>
|
||||
struct hash<nlohmann::json>
|
||||
template<typename BasicJsonType>
|
||||
struct std::hash
|
||||
{
|
||||
/*!
|
||||
@brief return a hash value for a JSON object
|
||||
|
||||
@since version 1.0.0
|
||||
@since version 1.0.0, extended for arbitrary basic_json types in 3.10.5.
|
||||
*/
|
||||
std::size_t operator()(const nlohmann::json& j) const
|
||||
std::size_t operator()(const BasicJsonType& j) const
|
||||
{
|
||||
return nlohmann::detail::hash(j);
|
||||
}
|
||||
@ -4730,7 +4726,7 @@ struct hash<nlohmann::json>
|
||||
/// @note: do not remove the space after '<',
|
||||
/// see https://github.com/nlohmann/json/pull/679
|
||||
template<>
|
||||
struct less<::nlohmann::detail::value_t>
|
||||
struct std::less< ::nlohmann::detail::value_t>
|
||||
{
|
||||
/*!
|
||||
@brief compare two value_t enum values
|
||||
@ -4746,6 +4742,9 @@ struct less<::nlohmann::detail::value_t>
|
||||
// C++20 prohibit function specialization in the std namespace.
|
||||
#ifndef JSON_HAS_CPP_20
|
||||
|
||||
namespace std
|
||||
{
|
||||
|
||||
/*!
|
||||
@brief exchanges the values of two JSON objects
|
||||
|
||||
@ -4760,9 +4759,9 @@ inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcep
|
||||
j1.swap(j2);
|
||||
}
|
||||
|
||||
#endif
|
||||
// namespace std
|
||||
|
||||
} // namespace std
|
||||
#endif
|
||||
|
||||
/// @brief user-defined string literal for JSON values
|
||||
/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/
|
||||
|
||||
@ -22208,20 +22208,16 @@ std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j)
|
||||
// nonmember support //
|
||||
///////////////////////
|
||||
|
||||
// specialization of std::swap, and std::hash
|
||||
namespace std
|
||||
{
|
||||
|
||||
/// hash value for JSON objects
|
||||
template<>
|
||||
struct hash<nlohmann::json>
|
||||
template<typename BasicJsonType>
|
||||
struct std::hash
|
||||
{
|
||||
/*!
|
||||
@brief return a hash value for a JSON object
|
||||
|
||||
@since version 1.0.0
|
||||
@since version 1.0.0, extended for arbitrary basic_json types in 3.10.5.
|
||||
*/
|
||||
std::size_t operator()(const nlohmann::json& j) const
|
||||
std::size_t operator()(const BasicJsonType& j) const
|
||||
{
|
||||
return nlohmann::detail::hash(j);
|
||||
}
|
||||
@ -22231,7 +22227,7 @@ struct hash<nlohmann::json>
|
||||
/// @note: do not remove the space after '<',
|
||||
/// see https://github.com/nlohmann/json/pull/679
|
||||
template<>
|
||||
struct less<::nlohmann::detail::value_t>
|
||||
struct std::less< ::nlohmann::detail::value_t>
|
||||
{
|
||||
/*!
|
||||
@brief compare two value_t enum values
|
||||
@ -22247,6 +22243,9 @@ struct less<::nlohmann::detail::value_t>
|
||||
// C++20 prohibit function specialization in the std namespace.
|
||||
#ifndef JSON_HAS_CPP_20
|
||||
|
||||
namespace std
|
||||
{
|
||||
|
||||
/*!
|
||||
@brief exchanges the values of two JSON objects
|
||||
|
||||
@ -22261,9 +22260,9 @@ inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcep
|
||||
j1.swap(j2);
|
||||
}
|
||||
|
||||
#endif
|
||||
// namespace std
|
||||
|
||||
} // namespace std
|
||||
#endif
|
||||
|
||||
/// @brief user-defined string literal for JSON values
|
||||
/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/
|
||||
|
||||
@ -31,10 +31,11 @@ SOFTWARE.
|
||||
|
||||
#include <nlohmann/json.hpp>
|
||||
using json = nlohmann::json;
|
||||
using ordered_json = nlohmann::ordered_json;
|
||||
|
||||
#include <set>
|
||||
|
||||
TEST_CASE("hash")
|
||||
TEST_CASE("hash<nlohmann::json>")
|
||||
{
|
||||
// Collect hashes for different JSON values and make sure that they are distinct
|
||||
// We cannot compare against fixed values, because the implementation of
|
||||
@ -82,3 +83,52 @@ TEST_CASE("hash")
|
||||
|
||||
CHECK(hashes.size() == 21);
|
||||
}
|
||||
|
||||
TEST_CASE("hash<nlohmann::ordered_json>")
|
||||
{
|
||||
// Collect hashes for different JSON values and make sure that they are distinct
|
||||
// We cannot compare against fixed values, because the implementation of
|
||||
// std::hash may differ between compilers.
|
||||
|
||||
std::set<std::size_t> hashes;
|
||||
|
||||
// null
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json(nullptr)));
|
||||
|
||||
// boolean
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json(true)));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json(false)));
|
||||
|
||||
// string
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json("")));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json("foo")));
|
||||
|
||||
// number
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json(0)));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json(unsigned(0))));
|
||||
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json(-1)));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json(0.0)));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json(42.23)));
|
||||
|
||||
// array
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::array()));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::array({1, 2, 3})));
|
||||
|
||||
// object
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::object()));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::object({{"foo", "bar"}})));
|
||||
|
||||
// binary
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({})));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({}, 0)));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({}, 42)));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({1, 2, 3})));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({1, 2, 3}, 0)));
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json::binary({1, 2, 3}, 42)));
|
||||
|
||||
// discarded
|
||||
hashes.insert(std::hash<ordered_json> {}(ordered_json(ordered_json::value_t::discarded)));
|
||||
|
||||
CHECK(hashes.size() == 21);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user