diff --git a/CHANGELOG.md b/CHANGELOG.md index 15f2add4..53c8f010 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ HEAD * Removed `DeserializationError::NotSupported` * Added `JsonVariant::is()` (issue #1412) * Added `JsonVariant::is()` (issue #1412) +* Changed `JsonVariantConst::is()` to return `false` (issue #1412) > ### BREAKING CHANGES > @@ -38,7 +39,10 @@ HEAD > > * `deserializeJson()` leaves `\uXXXX` unchanged (only when `ARDUINOJSON_DECODE_UNICODE` is `0`) > * `deserializeMsgPack()` replaces unsupported values with `null`s - +> +> Lastly, a very minor change conserns `JsonVariantConst::is()`. +> It used to return `true` for `JsonArray` and `JsonOject`, but now it returns `false`. +> Instead, you must use `JsonArrayConst` and `JsonObjectConst`. v6.17.3 (2021-02-15) ------- diff --git a/extras/tests/JsonVariant/is.cpp b/extras/tests/JsonVariant/is.cpp index fc7f9118..66ee7c87 100644 --- a/extras/tests/JsonVariant/is.cpp +++ b/extras/tests/JsonVariant/is.cpp @@ -163,9 +163,12 @@ TEST_CASE("JsonVariantConst::is()") { SECTION("undefined") { cvariant = JsonVariantConst(); - CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); @@ -175,9 +178,10 @@ TEST_CASE("JsonVariantConst::is()") { } SECTION("null") { + CHECK(cvariant.is() == true); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); - CHECK(cvariant.is() == true); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); @@ -190,7 +194,8 @@ TEST_CASE("JsonVariantConst::is()") { variant.set(true); CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); + CHECK(cvariant.is() == true); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); @@ -204,7 +209,8 @@ TEST_CASE("JsonVariantConst::is()") { variant.set(false); CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); + CHECK(cvariant.is() == true); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); @@ -223,10 +229,11 @@ TEST_CASE("JsonVariantConst::is()") { CHECK(cvariant.is() == true); CHECK(cvariant.is() == true); CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); + CHECK(cvariant.is() == true); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); } @@ -236,10 +243,11 @@ TEST_CASE("JsonVariantConst::is()") { CHECK(cvariant.is() == true); CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); + CHECK(cvariant.is() == true); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); @@ -252,12 +260,12 @@ TEST_CASE("JsonVariantConst::is()") { CHECK(cvariant.is() == true); CHECK(cvariant.is() == true); CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); } @@ -265,9 +273,10 @@ TEST_CASE("JsonVariantConst::is()") { SECTION("JsonArray") { variant.to(); - CHECK(cvariant.is() == true); CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); + CHECK(cvariant.is() == true); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); @@ -280,9 +289,10 @@ TEST_CASE("JsonVariantConst::is()") { SECTION("JsonObject") { variant.to(); - CHECK(cvariant.is() == true); CHECK(cvariant.is() == true); - CHECK(cvariant.is() == true); + CHECK(cvariant.is() == true); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); diff --git a/src/ArduinoJson/Deserialization/Filter.hpp b/src/ArduinoJson/Deserialization/Filter.hpp index 3634e1d0..9f50f6e1 100644 --- a/src/ArduinoJson/Deserialization/Filter.hpp +++ b/src/ArduinoJson/Deserialization/Filter.hpp @@ -17,11 +17,11 @@ class Filter { } bool allowArray() const { - return _variant == true || _variant.is(); + return _variant == true || _variant.is(); } bool allowObject() const { - return _variant == true || _variant.is(); + return _variant == true || _variant.is(); } bool allowValue() const { diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 4c5d527d..6ac1ea2d 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -35,6 +35,11 @@ class JsonDocument : public Visitable { _data.setNull(); } + template + bool is() { + return getVariant().template is(); + } + template bool is() const { return getVariant().template is(); diff --git a/src/ArduinoJson/Variant/VariantFunctions.hpp b/src/ArduinoJson/Variant/VariantFunctions.hpp index 4fd72665..eba84ade 100644 --- a/src/ArduinoJson/Variant/VariantFunctions.hpp +++ b/src/ArduinoJson/Variant/VariantFunctions.hpp @@ -43,35 +43,6 @@ inline bool variantCopyFrom(VariantData *dst, const VariantData *src, inline int variantCompare(const VariantData *a, const VariantData *b); -inline bool variantIsArray(const VariantData *var) { - return var && var->isArray(); -} - -inline bool variantIsBoolean(const VariantData *var) { - return var && var->isBoolean(); -} - -template -inline bool variantIsInteger(const VariantData *var) { - return var && var->isInteger(); -} - -inline bool variantIsFloat(const VariantData *var) { - return var && var->isFloat(); -} - -inline bool variantIsString(const VariantData *var) { - return var && var->isString(); -} - -inline bool variantIsObject(const VariantData *var) { - return var && var->isObject(); -} - -inline bool variantIsNull(const VariantData *var) { - return var == 0 || var->isNull(); -} - inline bool variantSetBoolean(VariantData *var, bool value) { if (!var) return false; diff --git a/src/ArduinoJson/Variant/VariantIs.hpp b/src/ArduinoJson/Variant/VariantIs.hpp new file mode 100644 index 00000000..09736fc7 --- /dev/null +++ b/src/ArduinoJson/Variant/VariantIs.hpp @@ -0,0 +1,146 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2021 +// MIT License + +#pragma once + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +inline bool variantIsNull(const VariantData *var) { + return var == 0 || var->isNull(); +} + +// bool is() const; +// bool is() const; +// bool is() const; +// bool is() const; +// bool is() const; +// bool is() const; +// bool is() const; +// bool is() const; +// bool is() const; +template +NO_INLINE typename enable_if::value && !is_same::value, + bool>::type +variantIs(const VariantData *var) { + return var && var->isInteger(); +} + +// bool is() const; +// bool is() const; +template +NO_INLINE typename enable_if::value, bool>::type variantIs( + const VariantData *var) { + return var && var->isFloat(); +} + +// bool is() const +template +NO_INLINE typename enable_if::value, bool>::type variantIs( + const VariantData *var) { + return var && var->isBoolean(); +} + +// bool is() const; +// bool is() const; +// bool is() const; +// bool is() const; +template +NO_INLINE typename enable_if::value || + is_same::value || + IsWriteableString::value, + bool>::type +variantIs(const VariantData *var) { + return var && var->isString(); +} + +// bool is const; +// bool is const; +template +NO_INLINE typename enable_if< + is_same::type, ArrayConstRef>::value, bool>::type +variantIs(const VariantData *var) { + return var && var->isArray(); +} + +// bool is const; +// bool is const; +template +NO_INLINE typename enable_if< + is_same::type, ObjectConstRef>::value, bool>::type +variantIs(const VariantData *var) { + return var && var->isObject(); +} + +// bool is const; +// bool is const; +template +NO_INLINE typename enable_if< + is_same::type, VariantConstRef>::value, bool>::type +variantIs(const VariantData *var) { + return !!var; +} +#if ARDUINOJSON_HAS_NULLPTR + +// bool is const; +template +NO_INLINE typename enable_if::value, bool>::type +variantIs(const VariantData *var) { + return variantIsNull(var); +} +#endif +// bool is() const; +template +typename enable_if::value, bool>::type variantIs( + const VariantData *var) { + return variantIs(var); +} + +// bool is const; +// bool is const; +template +NO_INLINE + typename enable_if::type, ArrayRef>::value, + bool>::type + variantIs(VariantData *var) { + return var && var->isArray(); +} + +// bool is const; +// bool is const; +template +NO_INLINE typename enable_if< + is_same::type, ObjectRef>::value, bool>::type +variantIs(VariantData *var) { + return var && var->isObject(); +} + +// bool is const; +// bool is const; +template +NO_INLINE typename enable_if< + is_same::type, VariantRef>::value, bool>::type +variantIs(VariantData *var) { + return !!var; +} + +// bool is const; +// bool is const; +// bool is const; +// bool is const; +// bool is const; +// bool is const; +template +typename enable_if< + is_same::type, ArrayRef>::value || + is_same::type, ObjectRef>::value || + is_same::type, VariantRef>::value, + bool>::type +variantIs(const VariantData *) { + return false; +} + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index 3b0dfd34..14ed4d10 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -28,123 +29,9 @@ class ObjectRef; template class VariantRefBase : public VariantTag { public: - // Tells wether the variant has the specified type. - // Returns true if the variant has type type T, false otherwise. - // - // bool is() const; - // bool is() const; - // bool is() const; - // bool is() const; - // bool is() const; - // bool is() const; - // bool is() const; - // bool is() const; - // bool is() const; template - FORCE_INLINE - typename enable_if::value && !is_same::value, - bool>::type - is() const { - return variantIsInteger(_data); - } - // - // bool is() const; - // bool is() const; - template - FORCE_INLINE typename enable_if::value, bool>::type is() - const { - return variantIsFloat(_data); - } - // - // bool is() const - template - FORCE_INLINE typename enable_if::value, bool>::type is() - const { - return variantIsBoolean(_data); - } - // - // bool is() const; - // bool is() const; - // bool is() const; - // bool is() const; - template - FORCE_INLINE typename enable_if::value || - is_same::value || - IsWriteableString::value, - bool>::type - is() const { - return variantIsString(_data); - } - // - // bool is const; - // bool is const; - template - FORCE_INLINE typename enable_if< - is_same::type, ArrayRef>::value, bool>::type - is() const { - return variantIsArray(_data); - } - // - // bool is const; - // bool is const; - template - FORCE_INLINE typename enable_if< - is_same::type, ArrayConstRef>::value, bool>::type - is() const { - return variantIsArray(_data); - } - // - // bool is const; - // bool is const; - template - FORCE_INLINE typename enable_if< - is_same::type, ObjectRef>::value, bool>::type - is() const { - return variantIsObject(_data); - } - // - // bool is const; - // bool is const; - template - FORCE_INLINE typename enable_if< - is_same::type, ObjectConstRef>::value, - bool>::type - is() const { - return variantIsObject(_data); - } - // - // bool is const; - // bool is const; - template - FORCE_INLINE typename enable_if< - is_same::type, VariantRef>::value, bool>::type - is() const { - return !!_data; - } - // - // bool is const; - // bool is const; - template - FORCE_INLINE typename enable_if< - is_same::type, VariantConstRef>::value, - bool>::type - is() const { - return !!_data; - } -#if ARDUINOJSON_HAS_NULLPTR - // - // bool is const; - template - FORCE_INLINE - typename enable_if::value, bool>::type - is() const { - return variantIsNull(_data); - } -#endif - // bool is() const; - template - FORCE_INLINE typename enable_if::value, bool>::type is() const { - return variantIsInteger(_data); + FORCE_INLINE bool is() const { + return variantIs(_data); } FORCE_INLINE bool isNull() const {