mirror of https://github.com/nlohmann/json.git
Make json_pointer usable as map key (again) (#3685)
* Make json_pointer usable as map key * Add unit testspull/3688/head
parent
231f3108ff
commit
31265dc69c
|
@ -847,7 +847,7 @@ class json_pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
#ifdef JSON_HAS_CPP_20
|
#if JSON_HAS_THREE_WAY_COMPARISON
|
||||||
/// @brief compares two JSON pointers for equality
|
/// @brief compares two JSON pointers for equality
|
||||||
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
||||||
template<typename RefStringTypeRhs>
|
template<typename RefStringTypeRhs>
|
||||||
|
@ -862,6 +862,13 @@ class json_pointer
|
||||||
{
|
{
|
||||||
return *this == json_pointer(rhs);
|
return *this == json_pointer(rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @brief 3-way compares two JSON pointers
|
||||||
|
template<typename RefStringTypeRhs>
|
||||||
|
std::strong_ordering operator<=>(const json_pointer<RefStringTypeRhs>& rhs) const noexcept // *NOPAD*
|
||||||
|
{
|
||||||
|
return reference_tokens <=> rhs.reference_tokens; // *NOPAD*
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/// @brief compares two JSON pointers for equality
|
/// @brief compares two JSON pointers for equality
|
||||||
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
||||||
|
@ -904,6 +911,12 @@ class json_pointer
|
||||||
// NOLINTNEXTLINE(readability-redundant-declaration)
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
friend bool operator!=(const StringType& lhs,
|
friend bool operator!=(const StringType& lhs,
|
||||||
const json_pointer<RefStringTypeRhs>& rhs);
|
const json_pointer<RefStringTypeRhs>& rhs);
|
||||||
|
|
||||||
|
/// @brief compares two JSON pointer for less-than
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
|
friend bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -911,7 +924,7 @@ class json_pointer
|
||||||
std::vector<string_t> reference_tokens;
|
std::vector<string_t> reference_tokens;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef JSON_HAS_CPP_20
|
#if !JSON_HAS_THREE_WAY_COMPARISON
|
||||||
// functions cannot be defined inside class due to ODR violations
|
// functions cannot be defined inside class due to ODR violations
|
||||||
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
@ -958,6 +971,13 @@ inline bool operator!=(const StringType& lhs,
|
||||||
{
|
{
|
||||||
return !(lhs == rhs);
|
return !(lhs == rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
inline bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept
|
||||||
|
{
|
||||||
|
return lhs.reference_tokens < rhs.reference_tokens;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
NLOHMANN_JSON_NAMESPACE_END
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -14507,7 +14507,7 @@ class json_pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
#ifdef JSON_HAS_CPP_20
|
#if JSON_HAS_THREE_WAY_COMPARISON
|
||||||
/// @brief compares two JSON pointers for equality
|
/// @brief compares two JSON pointers for equality
|
||||||
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
||||||
template<typename RefStringTypeRhs>
|
template<typename RefStringTypeRhs>
|
||||||
|
@ -14522,6 +14522,13 @@ class json_pointer
|
||||||
{
|
{
|
||||||
return *this == json_pointer(rhs);
|
return *this == json_pointer(rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @brief 3-way compares two JSON pointers
|
||||||
|
template<typename RefStringTypeRhs>
|
||||||
|
std::strong_ordering operator<=>(const json_pointer<RefStringTypeRhs>& rhs) const noexcept // *NOPAD*
|
||||||
|
{
|
||||||
|
return reference_tokens <=> rhs.reference_tokens; // *NOPAD*
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/// @brief compares two JSON pointers for equality
|
/// @brief compares two JSON pointers for equality
|
||||||
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
|
||||||
|
@ -14564,6 +14571,12 @@ class json_pointer
|
||||||
// NOLINTNEXTLINE(readability-redundant-declaration)
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
friend bool operator!=(const StringType& lhs,
|
friend bool operator!=(const StringType& lhs,
|
||||||
const json_pointer<RefStringTypeRhs>& rhs);
|
const json_pointer<RefStringTypeRhs>& rhs);
|
||||||
|
|
||||||
|
/// @brief compares two JSON pointer for less-than
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-declaration)
|
||||||
|
friend bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -14571,7 +14584,7 @@ class json_pointer
|
||||||
std::vector<string_t> reference_tokens;
|
std::vector<string_t> reference_tokens;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef JSON_HAS_CPP_20
|
#if !JSON_HAS_THREE_WAY_COMPARISON
|
||||||
// functions cannot be defined inside class due to ODR violations
|
// functions cannot be defined inside class due to ODR violations
|
||||||
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
@ -14618,6 +14631,13 @@ inline bool operator!=(const StringType& lhs,
|
||||||
{
|
{
|
||||||
return !(lhs == rhs);
|
return !(lhs == rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename RefStringTypeLhs, typename RefStringTypeRhs>
|
||||||
|
inline bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
|
||||||
|
const json_pointer<RefStringTypeRhs>& rhs) noexcept
|
||||||
|
{
|
||||||
|
return lhs.reference_tokens < rhs.reference_tokens;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
NLOHMANN_JSON_NAMESPACE_END
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -15,6 +15,7 @@ using nlohmann::json;
|
||||||
using namespace nlohmann::literals; // NOLINT(google-build-using-namespace)
|
using namespace nlohmann::literals; // NOLINT(google-build-using-namespace)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
TEST_CASE("JSON pointers")
|
TEST_CASE("JSON pointers")
|
||||||
|
@ -697,6 +698,32 @@ TEST_CASE("JSON pointers")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("less-than comparison")
|
||||||
|
{
|
||||||
|
auto ptr1 = json::json_pointer("/foo/a");
|
||||||
|
auto ptr2 = json::json_pointer("/foo/b");
|
||||||
|
|
||||||
|
CHECK(ptr1 < ptr2);
|
||||||
|
CHECK_FALSE(ptr2 < ptr1);
|
||||||
|
|
||||||
|
// build with C++20
|
||||||
|
// JSON_HAS_CPP_20
|
||||||
|
#if JSON_HAS_THREE_WAY_COMPARISON
|
||||||
|
CHECK((ptr1 <=> ptr2) == std::strong_ordering::less); // *NOPAD*
|
||||||
|
CHECK(ptr2 > ptr1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("usable as map key")
|
||||||
|
{
|
||||||
|
auto ptr = json::json_pointer("/foo");
|
||||||
|
std::map<json::json_pointer, int> m;
|
||||||
|
|
||||||
|
m[ptr] = 42;
|
||||||
|
|
||||||
|
CHECK(m.find(ptr) != m.end());
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("backwards compatibility and mixing")
|
SECTION("backwards compatibility and mixing")
|
||||||
{
|
{
|
||||||
json j = R"(
|
json j = R"(
|
||||||
|
|
Loading…
Reference in New Issue