fix #414 - comparing to 0 literal

Overload comparison operators for all types that could be converted
to nullptr.
This commit is contained in:
Mihai STAN 2017-01-03 00:49:33 +02:00
parent 9755cc75b1
commit 6198439f59
3 changed files with 490 additions and 996 deletions

File diff suppressed because it is too large Load diff

View file

@ -5625,36 +5625,23 @@ class basic_json
return false; return false;
} }
/*! /*!@brief comparison: equal
@brief comparison: equal @copydoc operator==(const_reference, const_reference)
The functions compares the given JSON value against a null pointer. As the
null pointer can be used to initialize a JSON value to null, a comparison
of JSON value @a v with a null pointer should be equivalent to call
`v.is_null()`.
@param[in] v JSON value to consider
@return whether @a v is null
@complexity Constant.
@liveexample{The example compares several JSON types to the null pointer.
,operator__equal__nullptr_t}
@since version 1.0.0
*/ */
friend bool operator==(const_reference v, std::nullptr_t) noexcept template<typename ScalarType, typename std::enable_if<
{ std::is_scalar<ScalarType>::value, int>::type = 0>
return v.is_null(); friend bool operator==(const_reference lhs, const ScalarType rhs) noexcept {
return (lhs == basic_json(rhs));
} }
/*! /*!
@brief comparison: equal @brief comparison: equal
@copydoc operator==(const_reference, std::nullptr_t) @copydoc operator==(const_reference, const_reference)
*/ */
friend bool operator==(std::nullptr_t, const_reference v) noexcept template<typename ScalarType, typename std::enable_if<
{ std::is_scalar<ScalarType>::value, int>::type = 0>
return v.is_null(); friend bool operator==(const ScalarType lhs, const_reference rhs) noexcept {
return (basic_json(lhs) == rhs);
} }
/*! /*!
@ -5680,34 +5667,24 @@ class basic_json
/*! /*!
@brief comparison: not equal @brief comparison: not equal
@copydoc operator!=(const_reference, const_reference)
The functions compares the given JSON value against a null pointer. As the
null pointer can be used to initialize a JSON value to null, a comparison
of JSON value @a v with a null pointer should be equivalent to call
`not v.is_null()`.
@param[in] v JSON value to consider
@return whether @a v is not null
@complexity Constant.
@liveexample{The example compares several JSON types to the null pointer.
,operator__notequal__nullptr_t}
@since version 1.0.0
*/ */
friend bool operator!=(const_reference v, std::nullptr_t) noexcept template<typename ScalarType, typename std::enable_if<
std::is_scalar<ScalarType>::value, int>::type = 0>
friend bool operator!=(const_reference lhs, const ScalarType rhs) noexcept
{ {
return not v.is_null(); return (lhs != basic_json(rhs));
} }
/*! /*!
@brief comparison: not equal @brief comparison: not equal
@copydoc operator!=(const_reference, std::nullptr_t) @copydoc operator!=(const_reference, const_reference)
*/ */
friend bool operator!=(std::nullptr_t, const_reference v) noexcept template<typename ScalarType, typename std::enable_if<
std::is_scalar<ScalarType>::value, int>::type = 0>
friend bool operator!=(const ScalarType lhs, const_reference rhs) noexcept
{ {
return not v.is_null(); return (basic_json(lhs) != rhs);
} }
/*! /*!

View file

@ -663,4 +663,22 @@ TEST_CASE("regression tests")
std::vector<uint8_t> vec3 {0xbf, 0x61, 0x61, 0x01}; std::vector<uint8_t> vec3 {0xbf, 0x61, 0x61, 0x01};
CHECK_THROWS_AS(json::from_cbor(vec3), std::out_of_range); CHECK_THROWS_AS(json::from_cbor(vec3), std::out_of_range);
} }
SECTION("issue #414 - compare with literal 0)")
{
#define CHECK_TYPE(v) \
CHECK((json(v) == v));\
CHECK((v == json(v)));\
CHECK_FALSE((json(v) != v));\
CHECK_FALSE((v != json(v)));
CHECK_TYPE(nullptr);
CHECK_TYPE(0);
CHECK_TYPE(0u);
CHECK_TYPE(0L);
CHECK_TYPE(0.0);
CHECK_TYPE("");
#undef CHECK_TYPE
}
} }