forked from bblanchon/ArduinoJson
Changed JsonVariantConst::is<JsonArray/JsonObject>() to return false (closes #1412)
This commit is contained in:
@@ -17,11 +17,11 @@ class Filter {
|
||||
}
|
||||
|
||||
bool allowArray() const {
|
||||
return _variant == true || _variant.is<ArrayRef>();
|
||||
return _variant == true || _variant.is<ArrayConstRef>();
|
||||
}
|
||||
|
||||
bool allowObject() const {
|
||||
return _variant == true || _variant.is<ObjectRef>();
|
||||
return _variant == true || _variant.is<ObjectConstRef>();
|
||||
}
|
||||
|
||||
bool allowValue() const {
|
||||
|
||||
@@ -35,6 +35,11 @@ class JsonDocument : public Visitable {
|
||||
_data.setNull();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool is() {
|
||||
return getVariant().template is<T>();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool is() const {
|
||||
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 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) {
|
||||
if (!var)
|
||||
return false;
|
||||
|
||||
@@ -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/Variant/VariantAs.hpp>
|
||||
#include <ArduinoJson/Variant/VariantFunctions.hpp>
|
||||
#include <ArduinoJson/Variant/VariantIs.hpp>
|
||||
#include <ArduinoJson/Variant/VariantOperators.hpp>
|
||||
#include <ArduinoJson/Variant/VariantRef.hpp>
|
||||
#include <ArduinoJson/Variant/VariantShortcuts.hpp>
|
||||
@@ -28,123 +29,9 @@ class ObjectRef;
|
||||
template <typename TData>
|
||||
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<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>
|
||||
FORCE_INLINE
|
||||
typename enable_if<is_integral<T>::value && !is_same<bool, T>::value,
|
||||
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 is() const {
|
||||
return variantIs<T>(_data);
|
||||
}
|
||||
|
||||
FORCE_INLINE bool isNull() const {
|
||||
|
||||
Reference in New Issue
Block a user