fix #414 - comparing to 0 literal
Overload comparison operators for all types that could be converted to nullptr.
This commit is contained in:
		
							parent
							
								
									9755cc75b1
								
							
						
					
					
						commit
						6198439f59
					
				
					 3 changed files with 490 additions and 996 deletions
				
			
		
							
								
								
									
										1403
									
								
								src/json.hpp
									
										
									
									
									
								
							
							
						
						
									
										1403
									
								
								src/json.hpp
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -5625,36 +5625,23 @@ class basic_json | |||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     /*! | ||||
|     @brief comparison: equal | ||||
| 
 | ||||
|     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 | ||||
|     /*!@brief comparison: equal | ||||
|     @copydoc operator==(const_reference, const_reference) | ||||
|     */ | ||||
|     friend bool operator==(const_reference v, std::nullptr_t) noexcept | ||||
|     { | ||||
|         return v.is_null(); | ||||
|     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 (lhs == basic_json(rhs)); | ||||
|     } | ||||
| 
 | ||||
|     /*! | ||||
|     @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 | ||||
|     { | ||||
|         return v.is_null(); | ||||
|     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 (basic_json(lhs) == rhs); | ||||
|     } | ||||
| 
 | ||||
|     /*! | ||||
|  | @ -5680,34 +5667,24 @@ class basic_json | |||
| 
 | ||||
|     /*! | ||||
|     @brief comparison: not equal | ||||
| 
 | ||||
|     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 | ||||
|     @copydoc operator!=(const_reference, const_reference) | ||||
|     */ | ||||
|     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 | ||||
|     @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); | ||||
|     } | ||||
| 
 | ||||
|     /*! | ||||
|  |  | |||
|  | @ -663,4 +663,22 @@ TEST_CASE("regression tests") | |||
|         std::vector<uint8_t> vec3 {0xbf, 0x61, 0x61, 0x01}; | ||||
|         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 | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue