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>, | ||||
|                         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