forked from bblanchon/ArduinoJson
Move declaration of VariantConstRef
above VariantRef
This commit is contained in:
@ -57,188 +57,15 @@ class VariantRefBase : public VariantTag {
|
||||
}
|
||||
};
|
||||
|
||||
// A variant that can be a any value serializable to a JSON value.
|
||||
//
|
||||
// It can be set to:
|
||||
// - a boolean
|
||||
// - a char, short, int or a long (signed or unsigned)
|
||||
// - a string (const char*)
|
||||
// - a reference to a ArrayRef or ObjectRef
|
||||
class VariantRef : public VariantRefBase<VariantData>,
|
||||
public VariantOperators<VariantRef>,
|
||||
public VariantShortcuts<VariantRef>,
|
||||
public Visitable {
|
||||
typedef VariantRefBase<VariantData> base_type;
|
||||
friend class VariantConstRef;
|
||||
|
||||
public:
|
||||
// Intenal use only
|
||||
FORCE_INLINE VariantRef(MemoryPool *pool, VariantData *data)
|
||||
: base_type(data), _pool(pool) {}
|
||||
|
||||
// Creates an uninitialized VariantRef
|
||||
FORCE_INLINE VariantRef() : base_type(0), _pool(0) {}
|
||||
|
||||
FORCE_INLINE void clear() const {
|
||||
return variantSetNull(_data);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE bool set(const T &value) const {
|
||||
Converter<T>::toJson(value, *this);
|
||||
return _pool && !_pool->overflowed();
|
||||
}
|
||||
|
||||
bool ARDUINOJSON_DEPRECATED(
|
||||
"Support for char is deprecated, use int8_t or uint8_t instead")
|
||||
set(char value) const;
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE bool set(T *value) const {
|
||||
Converter<T *>::toJson(value, *this);
|
||||
return _pool && !_pool->overflowed();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE
|
||||
typename enable_if<!is_same<T, char *>::value && !is_same<T, char>::value,
|
||||
T>::type
|
||||
as() const {
|
||||
return Converter<T>::fromJson(*this);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename enable_if<is_same<T, char *>::value, const char *>::type
|
||||
ARDUINOJSON_DEPRECATED("Replace as<char*>() with as<const char*>()")
|
||||
as() const {
|
||||
return as<const char *>();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename enable_if<is_same<T, char>::value, char>::type
|
||||
ARDUINOJSON_DEPRECATED(
|
||||
"Support for char is deprecated, use int8_t or uint8_t instead")
|
||||
as() const {
|
||||
return static_cast<char>(as<signed char>());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE
|
||||
typename enable_if<!is_same<T, char *>::value && !is_same<T, char>::value,
|
||||
bool>::type
|
||||
is() const {
|
||||
return Converter<T>::checkJson(*this);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename enable_if<is_same<T, char *>::value, bool>::type
|
||||
ARDUINOJSON_DEPRECATED("Replace is<char*>() with is<const char*>()")
|
||||
is() const {
|
||||
return is<const char *>();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename enable_if<is_same<T, char>::value, bool>::type
|
||||
ARDUINOJSON_DEPRECATED(
|
||||
"Support for char is deprecated, use int8_t or uint8_t instead")
|
||||
is() const {
|
||||
return is<signed char>();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE operator T() const {
|
||||
return as<T>();
|
||||
}
|
||||
|
||||
template <typename TVisitor>
|
||||
typename TVisitor::result_type accept(TVisitor &visitor) const {
|
||||
return variantAccept(_data, visitor);
|
||||
}
|
||||
|
||||
// Change the type of the variant
|
||||
//
|
||||
// ArrayRef to<ArrayRef>()
|
||||
template <typename T>
|
||||
typename enable_if<is_same<T, ArrayRef>::value, ArrayRef>::type to() const;
|
||||
//
|
||||
// ObjectRef to<ObjectRef>()
|
||||
template <typename T>
|
||||
typename enable_if<is_same<T, ObjectRef>::value, ObjectRef>::type to() const;
|
||||
//
|
||||
// ObjectRef to<VariantRef>()
|
||||
template <typename T>
|
||||
typename enable_if<is_same<T, VariantRef>::value, VariantRef>::type to()
|
||||
const;
|
||||
|
||||
VariantRef addElement() const;
|
||||
|
||||
FORCE_INLINE VariantRef getElement(size_t) const;
|
||||
|
||||
FORCE_INLINE VariantRef getOrAddElement(size_t) const;
|
||||
|
||||
// getMember(const char*) const
|
||||
// getMember(const __FlashStringHelper*) const
|
||||
template <typename TChar>
|
||||
FORCE_INLINE VariantRef getMember(TChar *) const;
|
||||
|
||||
// getMember(const std::string&) const
|
||||
// getMember(const String&) const
|
||||
template <typename TString>
|
||||
FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type
|
||||
getMember(const TString &) const;
|
||||
|
||||
// getOrAddMember(char*) const
|
||||
// getOrAddMember(const char*) const
|
||||
// getOrAddMember(const __FlashStringHelper*) const
|
||||
template <typename TChar>
|
||||
FORCE_INLINE VariantRef getOrAddMember(TChar *) const;
|
||||
|
||||
// getOrAddMember(const std::string&) const
|
||||
// getOrAddMember(const String&) const
|
||||
template <typename TString>
|
||||
FORCE_INLINE VariantRef getOrAddMember(const TString &) const;
|
||||
|
||||
FORCE_INLINE void remove(size_t index) const {
|
||||
if (_data)
|
||||
_data->remove(index);
|
||||
}
|
||||
// remove(char*) const
|
||||
// remove(const char*) const
|
||||
// remove(const __FlashStringHelper*) const
|
||||
template <typename TChar>
|
||||
FORCE_INLINE typename enable_if<IsString<TChar *>::value>::type remove(
|
||||
TChar *key) const {
|
||||
if (_data)
|
||||
_data->remove(adaptString(key));
|
||||
}
|
||||
// remove(const std::string&) const
|
||||
// remove(const String&) const
|
||||
template <typename TString>
|
||||
FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
|
||||
const TString &key) const {
|
||||
if (_data)
|
||||
_data->remove(adaptString(key));
|
||||
}
|
||||
|
||||
private:
|
||||
MemoryPool *_pool;
|
||||
|
||||
friend MemoryPool *getPool(const VariantRef &variant) {
|
||||
return variant._pool;
|
||||
}
|
||||
};
|
||||
|
||||
class VariantConstRef : public VariantRefBase<const VariantData>,
|
||||
public VariantOperators<VariantConstRef>,
|
||||
public VariantShortcuts<VariantConstRef>,
|
||||
public Visitable {
|
||||
typedef VariantRefBase<const VariantData> base_type;
|
||||
friend class VariantRef;
|
||||
|
||||
public:
|
||||
VariantConstRef() : base_type(0) {}
|
||||
VariantConstRef(const VariantData *data) : base_type(data) {}
|
||||
VariantConstRef(VariantRef var) : base_type(var._data) {}
|
||||
explicit VariantConstRef(const VariantData *data) : base_type(data) {}
|
||||
|
||||
template <typename TVisitor>
|
||||
typename TVisitor::result_type accept(TVisitor &visitor) const {
|
||||
@ -339,6 +166,180 @@ class VariantConstRef : public VariantRefBase<const VariantData>,
|
||||
}
|
||||
};
|
||||
|
||||
// A variant that can be a any value serializable to a JSON value.
|
||||
//
|
||||
// It can be set to:
|
||||
// - a boolean
|
||||
// - a char, short, int or a long (signed or unsigned)
|
||||
// - a string (const char*)
|
||||
// - a reference to a ArrayRef or ObjectRef
|
||||
class VariantRef : public VariantRefBase<VariantData>,
|
||||
public VariantOperators<VariantRef>,
|
||||
public VariantShortcuts<VariantRef>,
|
||||
public Visitable {
|
||||
typedef VariantRefBase<VariantData> base_type;
|
||||
|
||||
public:
|
||||
// Intenal use only
|
||||
FORCE_INLINE VariantRef(MemoryPool *pool, VariantData *data)
|
||||
: base_type(data), _pool(pool) {}
|
||||
|
||||
// Creates an uninitialized VariantRef
|
||||
FORCE_INLINE VariantRef() : base_type(0), _pool(0) {}
|
||||
|
||||
FORCE_INLINE void clear() const {
|
||||
return variantSetNull(_data);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE bool set(const T &value) const {
|
||||
Converter<T>::toJson(value, *this);
|
||||
return _pool && !_pool->overflowed();
|
||||
}
|
||||
|
||||
bool ARDUINOJSON_DEPRECATED(
|
||||
"Support for char is deprecated, use int8_t or uint8_t instead")
|
||||
set(char value) const;
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE bool set(T *value) const {
|
||||
Converter<T *>::toJson(value, *this);
|
||||
return _pool && !_pool->overflowed();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE
|
||||
typename enable_if<!is_same<T, char *>::value && !is_same<T, char>::value,
|
||||
T>::type
|
||||
as() const {
|
||||
return Converter<T>::fromJson(*this);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename enable_if<is_same<T, char *>::value, const char *>::type
|
||||
ARDUINOJSON_DEPRECATED("Replace as<char*>() with as<const char*>()")
|
||||
as() const {
|
||||
return as<const char *>();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename enable_if<is_same<T, char>::value, char>::type
|
||||
ARDUINOJSON_DEPRECATED(
|
||||
"Support for char is deprecated, use int8_t or uint8_t instead")
|
||||
as() const {
|
||||
return static_cast<char>(as<signed char>());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE
|
||||
typename enable_if<!is_same<T, char *>::value && !is_same<T, char>::value,
|
||||
bool>::type
|
||||
is() const {
|
||||
return Converter<T>::checkJson(*this);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename enable_if<is_same<T, char *>::value, bool>::type
|
||||
ARDUINOJSON_DEPRECATED("Replace is<char*>() with is<const char*>()")
|
||||
is() const {
|
||||
return is<const char *>();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE typename enable_if<is_same<T, char>::value, bool>::type
|
||||
ARDUINOJSON_DEPRECATED(
|
||||
"Support for char is deprecated, use int8_t or uint8_t instead")
|
||||
is() const {
|
||||
return is<signed char>();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
FORCE_INLINE operator T() const {
|
||||
return as<T>();
|
||||
}
|
||||
|
||||
FORCE_INLINE operator VariantConstRef() const {
|
||||
return VariantConstRef(_data);
|
||||
}
|
||||
|
||||
template <typename TVisitor>
|
||||
typename TVisitor::result_type accept(TVisitor &visitor) const {
|
||||
return variantAccept(_data, visitor);
|
||||
}
|
||||
|
||||
// Change the type of the variant
|
||||
//
|
||||
// ArrayRef to<ArrayRef>()
|
||||
template <typename T>
|
||||
typename enable_if<is_same<T, ArrayRef>::value, ArrayRef>::type to() const;
|
||||
//
|
||||
// ObjectRef to<ObjectRef>()
|
||||
template <typename T>
|
||||
typename enable_if<is_same<T, ObjectRef>::value, ObjectRef>::type to() const;
|
||||
//
|
||||
// ObjectRef to<VariantRef>()
|
||||
template <typename T>
|
||||
typename enable_if<is_same<T, VariantRef>::value, VariantRef>::type to()
|
||||
const;
|
||||
|
||||
VariantRef addElement() const;
|
||||
|
||||
FORCE_INLINE VariantRef getElement(size_t) const;
|
||||
|
||||
FORCE_INLINE VariantRef getOrAddElement(size_t) const;
|
||||
|
||||
// getMember(const char*) const
|
||||
// getMember(const __FlashStringHelper*) const
|
||||
template <typename TChar>
|
||||
FORCE_INLINE VariantRef getMember(TChar *) const;
|
||||
|
||||
// getMember(const std::string&) const
|
||||
// getMember(const String&) const
|
||||
template <typename TString>
|
||||
FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type
|
||||
getMember(const TString &) const;
|
||||
|
||||
// getOrAddMember(char*) const
|
||||
// getOrAddMember(const char*) const
|
||||
// getOrAddMember(const __FlashStringHelper*) const
|
||||
template <typename TChar>
|
||||
FORCE_INLINE VariantRef getOrAddMember(TChar *) const;
|
||||
|
||||
// getOrAddMember(const std::string&) const
|
||||
// getOrAddMember(const String&) const
|
||||
template <typename TString>
|
||||
FORCE_INLINE VariantRef getOrAddMember(const TString &) const;
|
||||
|
||||
FORCE_INLINE void remove(size_t index) const {
|
||||
if (_data)
|
||||
_data->remove(index);
|
||||
}
|
||||
// remove(char*) const
|
||||
// remove(const char*) const
|
||||
// remove(const __FlashStringHelper*) const
|
||||
template <typename TChar>
|
||||
FORCE_INLINE typename enable_if<IsString<TChar *>::value>::type remove(
|
||||
TChar *key) const {
|
||||
if (_data)
|
||||
_data->remove(adaptString(key));
|
||||
}
|
||||
// remove(const std::string&) const
|
||||
// remove(const String&) const
|
||||
template <typename TString>
|
||||
FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
|
||||
const TString &key) const {
|
||||
if (_data)
|
||||
_data->remove(adaptString(key));
|
||||
}
|
||||
|
||||
private:
|
||||
MemoryPool *_pool;
|
||||
|
||||
friend MemoryPool *getPool(const VariantRef &variant) {
|
||||
return variant._pool;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Converter<VariantRef> {
|
||||
static void toJson(VariantRef src, VariantRef dst) {
|
||||
|
Reference in New Issue
Block a user