diff --git a/CHANGELOG.md b/CHANGELOG.md index ab1e6796..251fd0c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ HEAD * Added `ARDUINOJSON_ENABLE_INFINITY` (default=0) to enable Infinity in JSON * Removed implicit conversion in comparison operators (issue #998) * Added lexicographical comparison for `JsonVariant` +* Added support for `nullptr` (issue #998) > ### BREAKING CHANGES > diff --git a/src/ArduinoJson/Configuration.hpp b/src/ArduinoJson/Configuration.hpp index 588f7f98..6e97b15d 100644 --- a/src/ArduinoJson/Configuration.hpp +++ b/src/ArduinoJson/Configuration.hpp @@ -12,8 +12,10 @@ #if __cplusplus >= 201103L #define ARDUINOJSON_HAS_LONG_LONG 1 +#define ARDUINOJSON_HAS_NULLPTR 1 #else #define ARDUINOJSON_HAS_LONG_LONG 0 +#define ARDUINOJSON_HAS_NULLPTR 0 #endif // Small or big machine? diff --git a/src/ArduinoJson/Operators/VariantComparisons.hpp b/src/ArduinoJson/Operators/VariantComparisons.hpp index c12eed03..80094c38 100644 --- a/src/ArduinoJson/Operators/VariantComparisons.hpp +++ b/src/ArduinoJson/Operators/VariantComparisons.hpp @@ -88,6 +88,27 @@ struct Comparer { void visitNull() {} }; +#if ARDUINOJSON_HAS_NULLPTR +template <> +struct Comparer { + int result; + + explicit Comparer(decltype(nullptr)) : result(1) {} + + void visitArray(const CollectionData &) {} + void visitObject(const CollectionData &) {} + void visitFloat(Float) {} + void visitString(const char *) {} + void visitRawJson(const char *, size_t) {} + void visitNegativeInteger(UInt) {} + void visitPositiveInteger(UInt) {} + void visitBoolean(bool) {} + void visitNull() { + result = 0; + } +}; +#endif + template class VariantComparisons { private: diff --git a/test/MixedConfiguration/CMakeLists.txt b/test/MixedConfiguration/CMakeLists.txt index 81bd585b..038317d3 100644 --- a/test/MixedConfiguration/CMakeLists.txt +++ b/test/MixedConfiguration/CMakeLists.txt @@ -6,12 +6,13 @@ set(CMAKE_CXX_STANDARD 11) add_executable(MixedConfigurationTests + cpp11.cpp decode_unicode_0.cpp decode_unicode_1.cpp - enable_nan_0.cpp - enable_nan_1.cpp enable_infinity_0.cpp enable_infinity_1.cpp + enable_nan_0.cpp + enable_nan_1.cpp use_double_0.cpp use_double_1.cpp use_long_long_0.cpp diff --git a/test/MixedConfiguration/cpp11.cpp b/test/MixedConfiguration/cpp11.cpp new file mode 100644 index 00000000..94eea383 --- /dev/null +++ b/test/MixedConfiguration/cpp11.cpp @@ -0,0 +1,31 @@ +#include + +#include + +#if __cplusplus >= 201103L + +TEST_CASE("nullptr") { + DynamicJsonDocument doc(4096); + JsonVariant variant = doc.to(); + + SECTION("JsonVariant == nullptr") { + REQUIRE((variant == nullptr)); + REQUIRE_FALSE((variant != nullptr)); + } + + SECTION("JsonVariant != nullptr") { + variant.set(42); + + REQUIRE_FALSE((variant == nullptr)); + REQUIRE((variant != nullptr)); + } + + SECTION("JsonVariant.set(nullptr)") { + variant.set(42); + variant.set(nullptr); + + REQUIRE(variant.isNull()); + } +} + +#endif