mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Changed JsonVariantConst::is<JsonArray/JsonObject>() to return false (closes #1412)
This commit is contained in:
		| @@ -10,6 +10,7 @@ HEAD | |||||||
| * Removed `DeserializationError::NotSupported` | * Removed `DeserializationError::NotSupported` | ||||||
| * Added `JsonVariant::is<JsonArrayConst/JsonObjectConst>()` (issue #1412) | * Added `JsonVariant::is<JsonArrayConst/JsonObjectConst>()` (issue #1412) | ||||||
| * Added `JsonVariant::is<JsonVariant/JsonVariantConst>()` (issue #1412) | * Added `JsonVariant::is<JsonVariant/JsonVariantConst>()` (issue #1412) | ||||||
|  | * Changed `JsonVariantConst::is<JsonArray/JsonObject>()` to return `false` (issue #1412) | ||||||
|  |  | ||||||
| > ### BREAKING CHANGES | > ### BREAKING CHANGES | ||||||
| > | > | ||||||
| @@ -38,7 +39,10 @@ HEAD | |||||||
| > | > | ||||||
| > * `deserializeJson()` leaves `\uXXXX` unchanged (only when `ARDUINOJSON_DECODE_UNICODE` is `0`) | > * `deserializeJson()` leaves `\uXXXX` unchanged (only when `ARDUINOJSON_DECODE_UNICODE` is `0`) | ||||||
| > * `deserializeMsgPack()` replaces unsupported values with `null`s | > * `deserializeMsgPack()` replaces unsupported values with `null`s | ||||||
|  | > | ||||||
|  | > Lastly, a very minor change conserns `JsonVariantConst::is<T>()`. | ||||||
|  | > 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) | v6.17.3 (2021-02-15) | ||||||
| ------- | ------- | ||||||
|   | |||||||
| @@ -163,9 +163,12 @@ TEST_CASE("JsonVariantConst::is<T>()") { | |||||||
|   SECTION("undefined") { |   SECTION("undefined") { | ||||||
|     cvariant = JsonVariantConst(); |     cvariant = JsonVariantConst(); | ||||||
|  |  | ||||||
|     CHECK(cvariant.is<JsonObject>() == false); |  | ||||||
|     CHECK(cvariant.is<JsonArray>() == false); |     CHECK(cvariant.is<JsonArray>() == false); | ||||||
|  |     CHECK(cvariant.is<JsonArrayConst>() == false); | ||||||
|  |     CHECK(cvariant.is<JsonObject>() == false); | ||||||
|  |     CHECK(cvariant.is<JsonObjectConst>() == false); | ||||||
|     CHECK(cvariant.is<JsonVariant>() == false); |     CHECK(cvariant.is<JsonVariant>() == false); | ||||||
|  |     CHECK(cvariant.is<JsonVariantConst>() == false); | ||||||
|     CHECK(cvariant.is<bool>() == false); |     CHECK(cvariant.is<bool>() == false); | ||||||
|     CHECK(cvariant.is<char *>() == false); |     CHECK(cvariant.is<char *>() == false); | ||||||
|     CHECK(cvariant.is<int>() == false); |     CHECK(cvariant.is<int>() == false); | ||||||
| @@ -175,9 +178,10 @@ TEST_CASE("JsonVariantConst::is<T>()") { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("null") { |   SECTION("null") { | ||||||
|  |     CHECK(cvariant.is<JsonVariantConst>() == true); | ||||||
|     CHECK(cvariant.is<JsonObject>() == false); |     CHECK(cvariant.is<JsonObject>() == false); | ||||||
|     CHECK(cvariant.is<JsonArray>() == false); |     CHECK(cvariant.is<JsonArray>() == false); | ||||||
|     CHECK(cvariant.is<JsonVariant>() == true); |     CHECK(cvariant.is<JsonVariant>() == false); | ||||||
|     CHECK(cvariant.is<bool>() == false); |     CHECK(cvariant.is<bool>() == false); | ||||||
|     CHECK(cvariant.is<char *>() == false); |     CHECK(cvariant.is<char *>() == false); | ||||||
|     CHECK(cvariant.is<int>() == false); |     CHECK(cvariant.is<int>() == false); | ||||||
| @@ -190,7 +194,8 @@ TEST_CASE("JsonVariantConst::is<T>()") { | |||||||
|     variant.set(true); |     variant.set(true); | ||||||
|  |  | ||||||
|     CHECK(cvariant.is<bool>() == true); |     CHECK(cvariant.is<bool>() == true); | ||||||
|     CHECK(cvariant.is<JsonVariant>() == true); |     CHECK(cvariant.is<JsonVariantConst>() == true); | ||||||
|  |     CHECK(cvariant.is<JsonVariant>() == false); | ||||||
|     CHECK(cvariant.is<JsonObject>() == false); |     CHECK(cvariant.is<JsonObject>() == false); | ||||||
|     CHECK(cvariant.is<JsonArray>() == false); |     CHECK(cvariant.is<JsonArray>() == false); | ||||||
|     CHECK(cvariant.is<char *>() == false); |     CHECK(cvariant.is<char *>() == false); | ||||||
| @@ -204,7 +209,8 @@ TEST_CASE("JsonVariantConst::is<T>()") { | |||||||
|     variant.set(false); |     variant.set(false); | ||||||
|  |  | ||||||
|     CHECK(cvariant.is<bool>() == true); |     CHECK(cvariant.is<bool>() == true); | ||||||
|     CHECK(cvariant.is<JsonVariant>() == true); |     CHECK(cvariant.is<JsonVariantConst>() == true); | ||||||
|  |     CHECK(cvariant.is<JsonVariant>() == false); | ||||||
|     CHECK(cvariant.is<JsonObject>() == false); |     CHECK(cvariant.is<JsonObject>() == false); | ||||||
|     CHECK(cvariant.is<JsonArray>() == false); |     CHECK(cvariant.is<JsonArray>() == false); | ||||||
|     CHECK(cvariant.is<char *>() == false); |     CHECK(cvariant.is<char *>() == false); | ||||||
| @@ -223,10 +229,11 @@ TEST_CASE("JsonVariantConst::is<T>()") { | |||||||
|     CHECK(cvariant.is<double>() == true); |     CHECK(cvariant.is<double>() == true); | ||||||
|     CHECK(cvariant.is<float>() == true); |     CHECK(cvariant.is<float>() == true); | ||||||
|     CHECK(cvariant.is<MYENUM2>() == true); |     CHECK(cvariant.is<MYENUM2>() == true); | ||||||
|     CHECK(cvariant.is<JsonVariant>() == true); |     CHECK(cvariant.is<JsonVariantConst>() == true); | ||||||
|     CHECK(cvariant.is<bool>() == false); |     CHECK(cvariant.is<bool>() == false); | ||||||
|     CHECK(cvariant.is<JsonObject>() == false); |     CHECK(cvariant.is<JsonObject>() == false); | ||||||
|     CHECK(cvariant.is<JsonArray>() == false); |     CHECK(cvariant.is<JsonArray>() == false); | ||||||
|  |     CHECK(cvariant.is<JsonVariant>() == false); | ||||||
|     CHECK(cvariant.is<char *>() == false); |     CHECK(cvariant.is<char *>() == false); | ||||||
|     CHECK(cvariant.is<std::string>() == false); |     CHECK(cvariant.is<std::string>() == false); | ||||||
|   } |   } | ||||||
| @@ -236,10 +243,11 @@ TEST_CASE("JsonVariantConst::is<T>()") { | |||||||
|  |  | ||||||
|     CHECK(cvariant.is<double>() == true); |     CHECK(cvariant.is<double>() == true); | ||||||
|     CHECK(cvariant.is<float>() == true); |     CHECK(cvariant.is<float>() == true); | ||||||
|     CHECK(cvariant.is<JsonVariant>() == true); |     CHECK(cvariant.is<JsonVariantConst>() == true); | ||||||
|     CHECK(cvariant.is<bool>() == false); |     CHECK(cvariant.is<bool>() == false); | ||||||
|     CHECK(cvariant.is<JsonObject>() == false); |     CHECK(cvariant.is<JsonObject>() == false); | ||||||
|     CHECK(cvariant.is<JsonArray>() == false); |     CHECK(cvariant.is<JsonArray>() == false); | ||||||
|  |     CHECK(cvariant.is<JsonVariant>() == false); | ||||||
|     CHECK(cvariant.is<char *>() == false); |     CHECK(cvariant.is<char *>() == false); | ||||||
|     CHECK(cvariant.is<int>() == false); |     CHECK(cvariant.is<int>() == false); | ||||||
|     CHECK(cvariant.is<std::string>() == false); |     CHECK(cvariant.is<std::string>() == false); | ||||||
| @@ -252,12 +260,12 @@ TEST_CASE("JsonVariantConst::is<T>()") { | |||||||
|     CHECK(cvariant.is<char *>() == true); |     CHECK(cvariant.is<char *>() == true); | ||||||
|     CHECK(cvariant.is<const char *>() == true); |     CHECK(cvariant.is<const char *>() == true); | ||||||
|     CHECK(cvariant.is<std::string>() == true); |     CHECK(cvariant.is<std::string>() == true); | ||||||
|     CHECK(cvariant.is<JsonVariant>() == true); |  | ||||||
|     CHECK(cvariant.is<double>() == false); |     CHECK(cvariant.is<double>() == false); | ||||||
|     CHECK(cvariant.is<float>() == false); |     CHECK(cvariant.is<float>() == false); | ||||||
|     CHECK(cvariant.is<bool>() == false); |     CHECK(cvariant.is<bool>() == false); | ||||||
|     CHECK(cvariant.is<JsonObject>() == false); |     CHECK(cvariant.is<JsonObject>() == false); | ||||||
|     CHECK(cvariant.is<JsonArray>() == false); |     CHECK(cvariant.is<JsonArray>() == false); | ||||||
|  |     CHECK(cvariant.is<JsonVariant>() == false); | ||||||
|     CHECK(cvariant.is<int>() == false); |     CHECK(cvariant.is<int>() == false); | ||||||
|     CHECK(cvariant.is<MYENUM2>() == false); |     CHECK(cvariant.is<MYENUM2>() == false); | ||||||
|   } |   } | ||||||
| @@ -265,9 +273,10 @@ TEST_CASE("JsonVariantConst::is<T>()") { | |||||||
|   SECTION("JsonArray") { |   SECTION("JsonArray") { | ||||||
|     variant.to<JsonArray>(); |     variant.to<JsonArray>(); | ||||||
|  |  | ||||||
|     CHECK(cvariant.is<JsonArray>() == true); |  | ||||||
|     CHECK(cvariant.is<JsonArrayConst>() == true); |     CHECK(cvariant.is<JsonArrayConst>() == true); | ||||||
|     CHECK(cvariant.is<JsonVariant>() == true); |     CHECK(cvariant.is<JsonVariantConst>() == true); | ||||||
|  |     CHECK(cvariant.is<JsonArray>() == false); | ||||||
|  |     CHECK(cvariant.is<JsonVariant>() == false); | ||||||
|     CHECK(cvariant.is<JsonObject>() == false); |     CHECK(cvariant.is<JsonObject>() == false); | ||||||
|     CHECK(cvariant.is<JsonObjectConst>() == false); |     CHECK(cvariant.is<JsonObjectConst>() == false); | ||||||
|     CHECK(cvariant.is<int>() == false); |     CHECK(cvariant.is<int>() == false); | ||||||
| @@ -280,9 +289,10 @@ TEST_CASE("JsonVariantConst::is<T>()") { | |||||||
|   SECTION("JsonObject") { |   SECTION("JsonObject") { | ||||||
|     variant.to<JsonObject>(); |     variant.to<JsonObject>(); | ||||||
|  |  | ||||||
|     CHECK(cvariant.is<JsonObject>() == true); |  | ||||||
|     CHECK(cvariant.is<JsonObjectConst>() == true); |     CHECK(cvariant.is<JsonObjectConst>() == true); | ||||||
|     CHECK(cvariant.is<JsonVariant>() == true); |     CHECK(cvariant.is<JsonVariantConst>() == true); | ||||||
|  |     CHECK(cvariant.is<JsonObject>() == false); | ||||||
|  |     CHECK(cvariant.is<JsonVariant>() == false); | ||||||
|     CHECK(cvariant.is<JsonArray>() == false); |     CHECK(cvariant.is<JsonArray>() == false); | ||||||
|     CHECK(cvariant.is<JsonArrayConst>() == false); |     CHECK(cvariant.is<JsonArrayConst>() == false); | ||||||
|     CHECK(cvariant.is<int>() == false); |     CHECK(cvariant.is<int>() == false); | ||||||
|   | |||||||
| @@ -17,11 +17,11 @@ class Filter { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool allowArray() const { |   bool allowArray() const { | ||||||
|     return _variant == true || _variant.is<ArrayRef>(); |     return _variant == true || _variant.is<ArrayConstRef>(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool allowObject() const { |   bool allowObject() const { | ||||||
|     return _variant == true || _variant.is<ObjectRef>(); |     return _variant == true || _variant.is<ObjectConstRef>(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool allowValue() const { |   bool allowValue() const { | ||||||
|   | |||||||
| @@ -35,6 +35,11 @@ class JsonDocument : public Visitable { | |||||||
|     _data.setNull(); |     _data.setNull(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   bool is() { | ||||||
|  |     return getVariant().template is<T>(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   template <typename T> |   template <typename T> | ||||||
|   bool is() const { |   bool is() const { | ||||||
|     return getVariant().template is<T>(); |     return getVariant().template is<T>(); | ||||||
|   | |||||||
| @@ -43,35 +43,6 @@ inline bool variantCopyFrom(VariantData *dst, const VariantData *src, | |||||||
|  |  | ||||||
| inline int variantCompare(const VariantData *a, const VariantData *b); | 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 <typename T> |  | ||||||
| inline bool variantIsInteger(const VariantData *var) { |  | ||||||
|   return var && var->isInteger<T>(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| 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) { | inline bool variantSetBoolean(VariantData *var, bool value) { | ||||||
|   if (!var) |   if (!var) | ||||||
|     return false; |     return false; | ||||||
|   | |||||||
							
								
								
									
										146
									
								
								src/ArduinoJson/Variant/VariantIs.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								src/ArduinoJson/Variant/VariantIs.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | // ArduinoJson - arduinojson.org | ||||||
|  | // Copyright Benoit Blanchon 2014-2021 | ||||||
|  | // MIT License | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <ArduinoJson/Polyfills/type_traits.hpp> | ||||||
|  | #include <ArduinoJson/Variant/VariantFunctions.hpp> | ||||||
|  |  | ||||||
|  | namespace ARDUINOJSON_NAMESPACE { | ||||||
|  |  | ||||||
|  | inline bool variantIsNull(const VariantData *var) { | ||||||
|  |   return var == 0 || var->isNull(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<char>() const; | ||||||
|  | // bool is<signed char>() const; | ||||||
|  | // bool is<signed short>() const; | ||||||
|  | // bool is<signed int>() const; | ||||||
|  | // bool is<signed long>() const; | ||||||
|  | // bool is<unsigned char>() const; | ||||||
|  | // bool is<unsigned short>() const; | ||||||
|  | // bool is<unsigned int>() const; | ||||||
|  | // bool is<unsigned long>() const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if<is_integral<T>::value && !is_same<bool, T>::value, | ||||||
|  |                              bool>::type | ||||||
|  | variantIs(const VariantData *var) { | ||||||
|  |   return var && var->isInteger<T>(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<double>() const; | ||||||
|  | // bool is<float>() const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if<is_floating_point<T>::value, bool>::type variantIs( | ||||||
|  |     const VariantData *var) { | ||||||
|  |   return var && var->isFloat(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<bool>() const | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if<is_same<T, bool>::value, bool>::type variantIs( | ||||||
|  |     const VariantData *var) { | ||||||
|  |   return var && var->isBoolean(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<const char*>() const; | ||||||
|  | // bool is<char*>() const; | ||||||
|  | // bool is<std::string>() const; | ||||||
|  | // bool is<String>() const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if<is_same<T, const char *>::value || | ||||||
|  |                                  is_same<T, char *>::value || | ||||||
|  |                                  IsWriteableString<T>::value, | ||||||
|  |                              bool>::type | ||||||
|  | variantIs(const VariantData *var) { | ||||||
|  |   return var && var->isString(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<ArrayConstRef> const; | ||||||
|  | // bool is<const ArrayConstRef> const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if< | ||||||
|  |     is_same<typename remove_const<T>::type, ArrayConstRef>::value, bool>::type | ||||||
|  | variantIs(const VariantData *var) { | ||||||
|  |   return var && var->isArray(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<ObjectConstRef> const; | ||||||
|  | // bool is<const ObjectConstRef> const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if< | ||||||
|  |     is_same<typename remove_const<T>::type, ObjectConstRef>::value, bool>::type | ||||||
|  | variantIs(const VariantData *var) { | ||||||
|  |   return var && var->isObject(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<VariantConstRef> const; | ||||||
|  | // bool is<const VariantConstRef> const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if< | ||||||
|  |     is_same<typename remove_const<T>::type, VariantConstRef>::value, bool>::type | ||||||
|  | variantIs(const VariantData *var) { | ||||||
|  |   return !!var; | ||||||
|  | } | ||||||
|  | #if ARDUINOJSON_HAS_NULLPTR | ||||||
|  |  | ||||||
|  | // bool is<nullptr_t> const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if<is_same<T, decltype(nullptr)>::value, bool>::type | ||||||
|  | variantIs(const VariantData *var) { | ||||||
|  |   return variantIsNull(var); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | // bool is<enum>() const; | ||||||
|  | template <typename T> | ||||||
|  | typename enable_if<is_enum<T>::value, bool>::type variantIs( | ||||||
|  |     const VariantData *var) { | ||||||
|  |   return variantIs<int>(var); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<ArrayRef> const; | ||||||
|  | // bool is<const ArrayRef> const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE | ||||||
|  |     typename enable_if<is_same<typename remove_const<T>::type, ArrayRef>::value, | ||||||
|  |                        bool>::type | ||||||
|  |     variantIs(VariantData *var) { | ||||||
|  |   return var && var->isArray(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<ObjectRef> const; | ||||||
|  | // bool is<const ObjectRef> const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if< | ||||||
|  |     is_same<typename remove_const<T>::type, ObjectRef>::value, bool>::type | ||||||
|  | variantIs(VariantData *var) { | ||||||
|  |   return var && var->isObject(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<VariantRef> const; | ||||||
|  | // bool is<const VariantRef> const; | ||||||
|  | template <typename T> | ||||||
|  | NO_INLINE typename enable_if< | ||||||
|  |     is_same<typename remove_const<T>::type, VariantRef>::value, bool>::type | ||||||
|  | variantIs(VariantData *var) { | ||||||
|  |   return !!var; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // bool is<ArrayRef> const; | ||||||
|  | // bool is<const ArrayRef> const; | ||||||
|  | // bool is<ObjectRef> const; | ||||||
|  | // bool is<const ObjectRef> const; | ||||||
|  | // bool is<VariantRef> const; | ||||||
|  | // bool is<const VariantRef> const; | ||||||
|  | template <typename T> | ||||||
|  | typename enable_if< | ||||||
|  |     is_same<typename remove_const<T>::type, ArrayRef>::value || | ||||||
|  |         is_same<typename remove_const<T>::type, ObjectRef>::value || | ||||||
|  |         is_same<typename remove_const<T>::type, VariantRef>::value, | ||||||
|  |     bool>::type | ||||||
|  | variantIs(const VariantData *) { | ||||||
|  |   return false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }  // namespace ARDUINOJSON_NAMESPACE | ||||||
| @@ -13,6 +13,7 @@ | |||||||
| #include <ArduinoJson/Strings/StringAdapters.hpp> | #include <ArduinoJson/Strings/StringAdapters.hpp> | ||||||
| #include <ArduinoJson/Variant/VariantAs.hpp> | #include <ArduinoJson/Variant/VariantAs.hpp> | ||||||
| #include <ArduinoJson/Variant/VariantFunctions.hpp> | #include <ArduinoJson/Variant/VariantFunctions.hpp> | ||||||
|  | #include <ArduinoJson/Variant/VariantIs.hpp> | ||||||
| #include <ArduinoJson/Variant/VariantOperators.hpp> | #include <ArduinoJson/Variant/VariantOperators.hpp> | ||||||
| #include <ArduinoJson/Variant/VariantRef.hpp> | #include <ArduinoJson/Variant/VariantRef.hpp> | ||||||
| #include <ArduinoJson/Variant/VariantShortcuts.hpp> | #include <ArduinoJson/Variant/VariantShortcuts.hpp> | ||||||
| @@ -28,123 +29,9 @@ class ObjectRef; | |||||||
| template <typename TData> | template <typename TData> | ||||||
| class VariantRefBase : public VariantTag { | class VariantRefBase : public VariantTag { | ||||||
|  public: |  public: | ||||||
|   // Tells wether the variant has the specified type. |  | ||||||
|   // Returns true if the variant has type type T, false otherwise. |  | ||||||
|   // |  | ||||||
|   // bool is<char>() const; |  | ||||||
|   // bool is<signed char>() const; |  | ||||||
|   // bool is<signed short>() const; |  | ||||||
|   // bool is<signed int>() const; |  | ||||||
|   // bool is<signed long>() const; |  | ||||||
|   // bool is<unsigned char>() const; |  | ||||||
|   // bool is<unsigned short>() const; |  | ||||||
|   // bool is<unsigned int>() const; |  | ||||||
|   // bool is<unsigned long>() const; |  | ||||||
|   template <typename T> |   template <typename T> | ||||||
|   FORCE_INLINE |   FORCE_INLINE bool is() const { | ||||||
|       typename enable_if<is_integral<T>::value && !is_same<bool, T>::value, |     return variantIs<T>(_data); | ||||||
|                          bool>::type |  | ||||||
|       is() const { |  | ||||||
|     return variantIsInteger<T>(_data); |  | ||||||
|   } |  | ||||||
|   // |  | ||||||
|   // bool is<double>() const; |  | ||||||
|   // bool is<float>() const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if<is_floating_point<T>::value, bool>::type is() |  | ||||||
|       const { |  | ||||||
|     return variantIsFloat(_data); |  | ||||||
|   } |  | ||||||
|   // |  | ||||||
|   // bool is<bool>() const |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if<is_same<T, bool>::value, bool>::type is() |  | ||||||
|       const { |  | ||||||
|     return variantIsBoolean(_data); |  | ||||||
|   } |  | ||||||
|   // |  | ||||||
|   // bool is<const char*>() const; |  | ||||||
|   // bool is<char*>() const; |  | ||||||
|   // bool is<std::string>() const; |  | ||||||
|   // bool is<String>() const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if<is_same<T, const char *>::value || |  | ||||||
|                                       is_same<T, char *>::value || |  | ||||||
|                                       IsWriteableString<T>::value, |  | ||||||
|                                   bool>::type |  | ||||||
|   is() const { |  | ||||||
|     return variantIsString(_data); |  | ||||||
|   } |  | ||||||
|   // |  | ||||||
|   // bool is<ArrayRef> const; |  | ||||||
|   // bool is<const ArrayRef> const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if< |  | ||||||
|       is_same<typename remove_const<T>::type, ArrayRef>::value, bool>::type |  | ||||||
|   is() const { |  | ||||||
|     return variantIsArray(_data); |  | ||||||
|   } |  | ||||||
|   // |  | ||||||
|   // bool is<ArrayConstRef> const; |  | ||||||
|   // bool is<const ArrayConstRef> const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if< |  | ||||||
|       is_same<typename remove_const<T>::type, ArrayConstRef>::value, bool>::type |  | ||||||
|   is() const { |  | ||||||
|     return variantIsArray(_data); |  | ||||||
|   } |  | ||||||
|   // |  | ||||||
|   // bool is<ObjectRef> const; |  | ||||||
|   // bool is<const ObjectRef> const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if< |  | ||||||
|       is_same<typename remove_const<T>::type, ObjectRef>::value, bool>::type |  | ||||||
|   is() const { |  | ||||||
|     return variantIsObject(_data); |  | ||||||
|   } |  | ||||||
|   // |  | ||||||
|   // bool is<ObjectConstRef> const; |  | ||||||
|   // bool is<const ObjectConstRef> const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if< |  | ||||||
|       is_same<typename remove_const<T>::type, ObjectConstRef>::value, |  | ||||||
|       bool>::type |  | ||||||
|   is() const { |  | ||||||
|     return variantIsObject(_data); |  | ||||||
|   } |  | ||||||
|   // |  | ||||||
|   // bool is<VariantRef> const; |  | ||||||
|   // bool is<const VariantRef> const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if< |  | ||||||
|       is_same<typename remove_const<T>::type, VariantRef>::value, bool>::type |  | ||||||
|   is() const { |  | ||||||
|     return !!_data; |  | ||||||
|   } |  | ||||||
|   // |  | ||||||
|   // bool is<VariantConstRef> const; |  | ||||||
|   // bool is<const VariantConstRef> const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if< |  | ||||||
|       is_same<typename remove_const<T>::type, VariantConstRef>::value, |  | ||||||
|       bool>::type |  | ||||||
|   is() const { |  | ||||||
|     return !!_data; |  | ||||||
|   } |  | ||||||
| #if ARDUINOJSON_HAS_NULLPTR |  | ||||||
|   // |  | ||||||
|   // bool is<nullptr_t> const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE |  | ||||||
|       typename enable_if<is_same<T, decltype(nullptr)>::value, bool>::type |  | ||||||
|       is() const { |  | ||||||
|     return variantIsNull(_data); |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
|   // bool is<enum>() const; |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if<is_enum<T>::value, bool>::type is() const { |  | ||||||
|     return variantIsInteger<int>(_data); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   FORCE_INLINE bool isNull() const { |   FORCE_INLINE bool isNull() const { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user