mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 08:42:39 +01:00 
			
		
		
		
	Extract ObjectConstRef.hpp from ObjectRef.hpp
				
					
				
			This commit is contained in:
		
							
								
								
									
										138
									
								
								src/ArduinoJson/Object/ObjectConstRef.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								src/ArduinoJson/Object/ObjectConstRef.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | |||||||
|  | // ArduinoJson - https://arduinojson.org | ||||||
|  | // Copyright © 2014-2022, Benoit BLANCHON | ||||||
|  | // MIT License | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <ArduinoJson/Object/ObjectIterator.hpp> | ||||||
|  | #include <ArduinoJson/Variant/VariantOperators.hpp> | ||||||
|  |  | ||||||
|  | namespace ARDUINOJSON_NAMESPACE { | ||||||
|  |  | ||||||
|  | class ObjectConstRef : public VariantOperators<ObjectConstRef> { | ||||||
|  |   friend class ObjectRef; | ||||||
|  |   friend class VariantAttorney; | ||||||
|  |  | ||||||
|  |  public: | ||||||
|  |   typedef ObjectConstIterator iterator; | ||||||
|  |  | ||||||
|  |   ObjectConstRef() : _data(0) {} | ||||||
|  |   ObjectConstRef(const CollectionData* data) : _data(data) {} | ||||||
|  |  | ||||||
|  |   operator VariantConstRef() const { | ||||||
|  |     return VariantConstRef(collectionToVariant(_data)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE bool isNull() const { | ||||||
|  |     return _data == 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE operator bool() const { | ||||||
|  |     return _data != 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE size_t memoryUsage() const { | ||||||
|  |     return _data ? _data->memoryUsage() : 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE size_t nesting() const { | ||||||
|  |     return variantNesting(collectionToVariant(_data)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE size_t size() const { | ||||||
|  |     return _data ? _data->size() : 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE iterator begin() const { | ||||||
|  |     if (!_data) | ||||||
|  |       return iterator(); | ||||||
|  |     return iterator(_data->head()); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE iterator end() const { | ||||||
|  |     return iterator(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // containsKey(const std::string&) const | ||||||
|  |   // containsKey(const String&) const | ||||||
|  |   template <typename TString> | ||||||
|  |   FORCE_INLINE bool containsKey(const TString& key) const { | ||||||
|  |     return getMember(adaptString(key)) != 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // containsKey(char*) const | ||||||
|  |   // containsKey(const char*) const | ||||||
|  |   // containsKey(const __FlashStringHelper*) const | ||||||
|  |   template <typename TChar> | ||||||
|  |   FORCE_INLINE bool containsKey(TChar* key) const { | ||||||
|  |     return getMember(adaptString(key)) != 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // operator[](const std::string&) const | ||||||
|  |   // operator[](const String&) const | ||||||
|  |   template <typename TString> | ||||||
|  |   FORCE_INLINE | ||||||
|  |       typename enable_if<IsString<TString>::value, VariantConstRef>::type | ||||||
|  |       operator[](const TString& key) const { | ||||||
|  |     return VariantConstRef(getMember(adaptString(key))); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // operator[](char*) const | ||||||
|  |   // operator[](const char*) const | ||||||
|  |   // operator[](const __FlashStringHelper*) const | ||||||
|  |   template <typename TChar> | ||||||
|  |   FORCE_INLINE | ||||||
|  |       typename enable_if<IsString<TChar*>::value, VariantConstRef>::type | ||||||
|  |       operator[](TChar* key) const { | ||||||
|  |     return VariantConstRef(getMember(adaptString(key))); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE bool operator==(ObjectConstRef rhs) const { | ||||||
|  |     if (_data == rhs._data) | ||||||
|  |       return true; | ||||||
|  |  | ||||||
|  |     if (!_data || !rhs._data) | ||||||
|  |       return false; | ||||||
|  |  | ||||||
|  |     size_t count = 0; | ||||||
|  |     for (iterator it = begin(); it != end(); ++it) { | ||||||
|  |       if (it->value() != rhs[it->key()]) | ||||||
|  |         return false; | ||||||
|  |       count++; | ||||||
|  |     } | ||||||
|  |     return count == rhs.size(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  private: | ||||||
|  |   const VariantData* getData() const { | ||||||
|  |     return collectionToVariant(_data); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename TAdaptedString> | ||||||
|  |   const VariantData* getMember(TAdaptedString key) const { | ||||||
|  |     if (!_data) | ||||||
|  |       return 0; | ||||||
|  |     return _data->getMember(key); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   const CollectionData* _data; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <> | ||||||
|  | struct Converter<ObjectConstRef> : private VariantAttorney { | ||||||
|  |   static void toJson(VariantConstRef src, VariantRef dst) { | ||||||
|  |     variantCopyFrom(getData(dst), getData(src), getPool(dst)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static ObjectConstRef fromJson(VariantConstRef src) { | ||||||
|  |     const VariantData* data = getData(src); | ||||||
|  |     return data != 0 ? data->asObject() : 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static bool checkJson(VariantConstRef src) { | ||||||
|  |     const VariantData* data = getData(src); | ||||||
|  |     return data && data->isObject(); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace ARDUINOJSON_NAMESPACE | ||||||
| @@ -5,121 +5,12 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include <ArduinoJson/Object/MemberProxy.hpp> | #include <ArduinoJson/Object/MemberProxy.hpp> | ||||||
| #include <ArduinoJson/Object/ObjectIterator.hpp> | #include <ArduinoJson/Object/ObjectConstRef.hpp> | ||||||
|  |  | ||||||
| namespace ARDUINOJSON_NAMESPACE { | namespace ARDUINOJSON_NAMESPACE { | ||||||
|  |  | ||||||
| class ArrayRef; | class ArrayRef; | ||||||
|  |  | ||||||
| class ObjectConstRef : public VariantOperators<ObjectConstRef> { |  | ||||||
|   friend class ObjectRef; |  | ||||||
|   friend class VariantAttorney; |  | ||||||
|  |  | ||||||
|  public: |  | ||||||
|   typedef ObjectConstIterator iterator; |  | ||||||
|  |  | ||||||
|   ObjectConstRef() : _data(0) {} |  | ||||||
|   ObjectConstRef(const CollectionData* data) : _data(data) {} |  | ||||||
|  |  | ||||||
|   operator VariantConstRef() const { |  | ||||||
|     return VariantConstRef(collectionToVariant(_data)); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE bool isNull() const { |  | ||||||
|     return _data == 0; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE operator bool() const { |  | ||||||
|     return _data != 0; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE size_t memoryUsage() const { |  | ||||||
|     return _data ? _data->memoryUsage() : 0; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE size_t nesting() const { |  | ||||||
|     return variantNesting(collectionToVariant(_data)); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE size_t size() const { |  | ||||||
|     return _data ? _data->size() : 0; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE iterator begin() const { |  | ||||||
|     if (!_data) |  | ||||||
|       return iterator(); |  | ||||||
|     return iterator(_data->head()); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE iterator end() const { |  | ||||||
|     return iterator(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // containsKey(const std::string&) const |  | ||||||
|   // containsKey(const String&) const |  | ||||||
|   template <typename TString> |  | ||||||
|   FORCE_INLINE bool containsKey(const TString& key) const { |  | ||||||
|     return getMember(adaptString(key)) != 0; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // containsKey(char*) const |  | ||||||
|   // containsKey(const char*) const |  | ||||||
|   // containsKey(const __FlashStringHelper*) const |  | ||||||
|   template <typename TChar> |  | ||||||
|   FORCE_INLINE bool containsKey(TChar* key) const { |  | ||||||
|     return getMember(adaptString(key)) != 0; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // operator[](const std::string&) const |  | ||||||
|   // operator[](const String&) const |  | ||||||
|   template <typename TString> |  | ||||||
|   FORCE_INLINE |  | ||||||
|       typename enable_if<IsString<TString>::value, VariantConstRef>::type |  | ||||||
|       operator[](const TString& key) const { |  | ||||||
|     return VariantConstRef(getMember(adaptString(key))); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // operator[](char*) const |  | ||||||
|   // operator[](const char*) const |  | ||||||
|   // operator[](const __FlashStringHelper*) const |  | ||||||
|   template <typename TChar> |  | ||||||
|   FORCE_INLINE |  | ||||||
|       typename enable_if<IsString<TChar*>::value, VariantConstRef>::type |  | ||||||
|       operator[](TChar* key) const { |  | ||||||
|     return VariantConstRef(getMember(adaptString(key))); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE bool operator==(ObjectConstRef rhs) const { |  | ||||||
|     if (_data == rhs._data) |  | ||||||
|       return true; |  | ||||||
|  |  | ||||||
|     if (!_data || !rhs._data) |  | ||||||
|       return false; |  | ||||||
|  |  | ||||||
|     size_t count = 0; |  | ||||||
|     for (iterator it = begin(); it != end(); ++it) { |  | ||||||
|       if (it->value() != rhs[it->key()]) |  | ||||||
|         return false; |  | ||||||
|       count++; |  | ||||||
|     } |  | ||||||
|     return count == rhs.size(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|  private: |  | ||||||
|   const VariantData* getData() const { |  | ||||||
|     return collectionToVariant(_data); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename TAdaptedString> |  | ||||||
|   const VariantData* getMember(TAdaptedString key) const { |  | ||||||
|     if (!_data) |  | ||||||
|       return 0; |  | ||||||
|     return _data->getMember(key); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   const CollectionData* _data; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class ObjectRef : public VariantOperators<ObjectRef> { | class ObjectRef : public VariantOperators<ObjectRef> { | ||||||
|   friend class VariantAttorney; |   friend class VariantAttorney; | ||||||
|  |  | ||||||
| @@ -283,23 +174,6 @@ class ObjectRef : public VariantOperators<ObjectRef> { | |||||||
|   MemoryPool* _pool; |   MemoryPool* _pool; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template <> |  | ||||||
| struct Converter<ObjectConstRef> : private VariantAttorney { |  | ||||||
|   static void toJson(VariantConstRef src, VariantRef dst) { |  | ||||||
|     variantCopyFrom(getData(dst), getData(src), getPool(dst)); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   static ObjectConstRef fromJson(VariantConstRef src) { |  | ||||||
|     const VariantData* data = getData(src); |  | ||||||
|     return data != 0 ? data->asObject() : 0; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   static bool checkJson(VariantConstRef src) { |  | ||||||
|     const VariantData* data = getData(src); |  | ||||||
|     return data && data->isObject(); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <> | template <> | ||||||
| struct Converter<ObjectRef> : private VariantAttorney { | struct Converter<ObjectRef> : private VariantAttorney { | ||||||
|   static void toJson(VariantConstRef src, VariantRef dst) { |   static void toJson(VariantConstRef src, VariantRef dst) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user