Add json_pointer/string_t equality comparison operators

This commit is contained in:
Florian Albrechtskirchinger 2022-08-03 14:57:22 +02:00
parent e839f58a2a
commit d3ff992356
No known key found for this signature in database
GPG Key ID: 19618CE9B2D4BE6D
2 changed files with 181 additions and 55 deletions

View File

@ -846,55 +846,118 @@ class json_pointer
return result; return result;
} }
/*! public:
@brief compares two JSON pointers for equality #ifdef JSON_HAS_CPP_20
/// @brief compares two JSON pointers for equality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
template<typename RefStringTypeRhs>
bool operator==(const json_pointer<RefStringTypeRhs>& rhs) const noexcept
{
return reference_tokens == rhs.reference_tokens;
}
@param[in] lhs JSON pointer to compare /// @brief compares JSON pointer and string for equality
@param[in] rhs JSON pointer to compare /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
@return whether @a lhs is equal to @a rhs bool operator==(const string_t& rhs) const
{
@complexity Linear in the length of the JSON pointer return *this == json_pointer(rhs);
}
@exceptionsafety No-throw guarantee: this function never throws exceptions. #else
*/ /// @brief compares two JSON pointers for equality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
template<typename RefStringTypeLhs, typename RefStringTypeRhs> template<typename RefStringTypeLhs, typename RefStringTypeRhs>
// NOLINTNEXTLINE(readability-redundant-declaration) // NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator==(json_pointer<RefStringTypeLhs> const& lhs, friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
json_pointer<RefStringTypeRhs> const& rhs) noexcept; const json_pointer<RefStringTypeRhs>& rhs) noexcept;
/*! /// @brief compares JSON pointer and string for equality
@brief compares two JSON pointers for inequality /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
template<typename RefStringTypeLhs, typename StringType>
// NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
const StringType& rhs);
@param[in] lhs JSON pointer to compare /// @brief compares string and JSON pointer for equality
@param[in] rhs JSON pointer to compare /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
@return whether @a lhs is not equal @a rhs template<typename RefStringTypeRhs, typename StringType>
// NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator==(const StringType& lhs,
const json_pointer<RefStringTypeRhs>& rhs);
@complexity Linear in the length of the JSON pointer /// @brief compares two JSON pointers for inequality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
@exceptionsafety No-throw guarantee: this function never throws exceptions.
*/
template<typename RefStringTypeLhs, typename RefStringTypeRhs> template<typename RefStringTypeLhs, typename RefStringTypeRhs>
// NOLINTNEXTLINE(readability-redundant-declaration) // NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator!=(json_pointer<RefStringTypeLhs> const& lhs, friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
json_pointer<RefStringTypeRhs> const& rhs) noexcept; const json_pointer<RefStringTypeRhs>& rhs) noexcept;
/// @brief compares JSON pointer and string for inequality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
template<typename RefStringTypeLhs, typename StringType>
// NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
const StringType& rhs);
/// @brief compares string and JSON pointer for inequality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
template<typename RefStringTypeRhs, typename StringType>
// NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator!=(const StringType& lhs,
const json_pointer<RefStringTypeRhs>& rhs);
#endif
private:
/// the reference tokens /// the reference tokens
std::vector<string_t> reference_tokens; std::vector<string_t> reference_tokens;
}; };
#ifndef JSON_HAS_CPP_20
// 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==(json_pointer<RefStringTypeLhs> const& lhs, inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
json_pointer<RefStringTypeRhs> const& rhs) noexcept const json_pointer<RefStringTypeRhs>& rhs) noexcept
{ {
return lhs.reference_tokens == rhs.reference_tokens; return lhs.reference_tokens == rhs.reference_tokens;
} }
template<typename RefStringTypeLhs,
typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
const StringType& rhs)
{
return lhs == json_pointer<RefStringTypeLhs>(rhs);
}
template<typename RefStringTypeRhs,
typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
inline bool operator==(const StringType& lhs,
const json_pointer<RefStringTypeRhs>& rhs)
{
return json_pointer<RefStringTypeRhs>(lhs) == rhs;
}
template<typename RefStringTypeLhs, typename RefStringTypeRhs> template<typename RefStringTypeLhs, typename RefStringTypeRhs>
inline bool operator!=(json_pointer<RefStringTypeLhs> const& lhs, inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
json_pointer<RefStringTypeRhs> const& rhs) noexcept const json_pointer<RefStringTypeRhs>& rhs) noexcept
{ {
return !(lhs == rhs); return !(lhs == rhs);
} }
template<typename RefStringTypeLhs,
typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
const StringType& rhs)
{
return !(lhs == rhs);
}
template<typename RefStringTypeRhs,
typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
inline bool operator!=(const StringType& lhs,
const json_pointer<RefStringTypeRhs>& rhs)
{
return !(lhs == rhs);
}
#endif
NLOHMANN_JSON_NAMESPACE_END NLOHMANN_JSON_NAMESPACE_END

View File

@ -3373,7 +3373,7 @@ NLOHMANN_JSON_NAMESPACE_END
/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document
/// @sa https://json.nlohmann.me/api/json_pointer/ /// @sa https://json.nlohmann.me/api/json_pointer/
template<typename BasicJsonType> template<typename RefStringType>
class json_pointer; class json_pointer;
/*! /*!
@ -14448,57 +14448,120 @@ class json_pointer
return result; return result;
} }
/*! public:
@brief compares two JSON pointers for equality #ifdef JSON_HAS_CPP_20
/// @brief compares two JSON pointers for equality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
template<typename RefStringTypeRhs>
bool operator==(const json_pointer<RefStringTypeRhs>& rhs) const noexcept
{
return reference_tokens == rhs.reference_tokens;
}
@param[in] lhs JSON pointer to compare /// @brief compares JSON pointer and string for equality
@param[in] rhs JSON pointer to compare /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
@return whether @a lhs is equal to @a rhs bool operator==(const string_t& rhs) const
{
@complexity Linear in the length of the JSON pointer return *this == json_pointer(rhs);
}
@exceptionsafety No-throw guarantee: this function never throws exceptions. #else
*/ /// @brief compares two JSON pointers for equality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
template<typename RefStringTypeLhs, typename RefStringTypeRhs> template<typename RefStringTypeLhs, typename RefStringTypeRhs>
// NOLINTNEXTLINE(readability-redundant-declaration) // NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator==(json_pointer<RefStringTypeLhs> const& lhs, friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
json_pointer<RefStringTypeRhs> const& rhs) noexcept; const json_pointer<RefStringTypeRhs>& rhs) noexcept;
/*! /// @brief compares JSON pointer and string for equality
@brief compares two JSON pointers for inequality /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
template<typename RefStringTypeLhs, typename StringType>
// NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
const StringType& rhs);
@param[in] lhs JSON pointer to compare /// @brief compares string and JSON pointer for equality
@param[in] rhs JSON pointer to compare /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/
@return whether @a lhs is not equal @a rhs template<typename RefStringTypeRhs, typename StringType>
// NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator==(const StringType& lhs,
const json_pointer<RefStringTypeRhs>& rhs);
@complexity Linear in the length of the JSON pointer /// @brief compares two JSON pointers for inequality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
@exceptionsafety No-throw guarantee: this function never throws exceptions.
*/
template<typename RefStringTypeLhs, typename RefStringTypeRhs> template<typename RefStringTypeLhs, typename RefStringTypeRhs>
// NOLINTNEXTLINE(readability-redundant-declaration) // NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator!=(json_pointer<RefStringTypeLhs> const& lhs, friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
json_pointer<RefStringTypeRhs> const& rhs) noexcept; const json_pointer<RefStringTypeRhs>& rhs) noexcept;
/// @brief compares JSON pointer and string for inequality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
template<typename RefStringTypeLhs, typename StringType>
// NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
const StringType& rhs);
/// @brief compares string and JSON pointer for inequality
/// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/
template<typename RefStringTypeRhs, typename StringType>
// NOLINTNEXTLINE(readability-redundant-declaration)
friend bool operator!=(const StringType& lhs,
const json_pointer<RefStringTypeRhs>& rhs);
#endif
private:
/// the reference tokens /// the reference tokens
std::vector<string_t> reference_tokens; std::vector<string_t> reference_tokens;
}; };
#ifndef JSON_HAS_CPP_20
// 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==(json_pointer<RefStringTypeLhs> const& lhs, inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
json_pointer<RefStringTypeRhs> const& rhs) noexcept const json_pointer<RefStringTypeRhs>& rhs) noexcept
{ {
return lhs.reference_tokens == rhs.reference_tokens; return lhs.reference_tokens == rhs.reference_tokens;
} }
template<typename RefStringTypeLhs,
typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
const StringType& rhs)
{
return lhs == json_pointer<RefStringTypeLhs>(rhs);
}
template<typename RefStringTypeRhs,
typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
inline bool operator==(const StringType& lhs,
const json_pointer<RefStringTypeRhs>& rhs)
{
return json_pointer<RefStringTypeRhs>(lhs) == rhs;
}
template<typename RefStringTypeLhs, typename RefStringTypeRhs> template<typename RefStringTypeLhs, typename RefStringTypeRhs>
inline bool operator!=(json_pointer<RefStringTypeLhs> const& lhs, inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
json_pointer<RefStringTypeRhs> const& rhs) noexcept const json_pointer<RefStringTypeRhs>& rhs) noexcept
{ {
return !(lhs == rhs); return !(lhs == rhs);
} }
template<typename RefStringTypeLhs,
typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
const StringType& rhs)
{
return !(lhs == rhs);
}
template<typename RefStringTypeRhs,
typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
inline bool operator!=(const StringType& lhs,
const json_pointer<RefStringTypeRhs>& rhs)
{
return !(lhs == rhs);
}
#endif
NLOHMANN_JSON_NAMESPACE_END NLOHMANN_JSON_NAMESPACE_END
// #include <nlohmann/detail/json_ref.hpp> // #include <nlohmann/detail/json_ref.hpp>