mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	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>, | class VariantConstRef : public VariantRefBase<const VariantData>, | ||||||
|                         public VariantOperators<VariantConstRef>, |                         public VariantOperators<VariantConstRef>, | ||||||
|                         public VariantShortcuts<VariantConstRef>, |                         public VariantShortcuts<VariantConstRef>, | ||||||
|                         public Visitable { |                         public Visitable { | ||||||
|   typedef VariantRefBase<const VariantData> base_type; |   typedef VariantRefBase<const VariantData> base_type; | ||||||
|   friend class VariantRef; |  | ||||||
|  |  | ||||||
|  public: |  public: | ||||||
|   VariantConstRef() : base_type(0) {} |   VariantConstRef() : base_type(0) {} | ||||||
|   VariantConstRef(const VariantData *data) : base_type(data) {} |   explicit VariantConstRef(const VariantData *data) : base_type(data) {} | ||||||
|   VariantConstRef(VariantRef var) : base_type(var._data) {} |  | ||||||
|  |  | ||||||
|   template <typename TVisitor> |   template <typename TVisitor> | ||||||
|   typename TVisitor::result_type accept(TVisitor &visitor) const { |   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 <> | template <> | ||||||
| struct Converter<VariantRef> { | struct Converter<VariantRef> { | ||||||
|   static void toJson(VariantRef src, VariantRef dst) { |   static void toJson(VariantRef src, VariantRef dst) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user