mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Extract VariantProxy from ElementProxy and MemberProxy
				
					
				
			This commit is contained in:
		| @@ -9,6 +9,7 @@ HEAD | |||||||
| * Fix comparison operators for `JsonArray`, `JsonArrayConst`, `JsonObject`, and `JsonObjectConst` | * Fix comparison operators for `JsonArray`, `JsonArrayConst`, `JsonObject`, and `JsonObjectConst` | ||||||
| * Fix lax parsing of `true`, `false`, and `null` (issue #1781) | * Fix lax parsing of `true`, `false`, and `null` (issue #1781) | ||||||
| * Remove undocumented `accept()` functions | * Remove undocumented `accept()` functions | ||||||
|  | * Remove undocumented `ElementProxy` and `MemberProxy` classes | ||||||
| * Rename `addElement()` to `add()` | * Rename `addElement()` to `add()` | ||||||
| * Remove `getElement()`, `getOrAddElement()`, `getMember()`, and `getOrAddMember()` | * Remove `getElement()`, `getOrAddElement()`, `getMember()`, and `getOrAddMember()` | ||||||
| * Remove `JsonDocument::data()` and `JsonDocument::memoryPool()` | * Remove `JsonDocument::data()` and `JsonDocument::memoryPool()` | ||||||
|   | |||||||
| @@ -7,10 +7,12 @@ | |||||||
|  |  | ||||||
| using namespace ARDUINOJSON_NAMESPACE; | using namespace ARDUINOJSON_NAMESPACE; | ||||||
|  |  | ||||||
|  | typedef VariantProxy<ElementDataSource<JsonDocument&> > ElementProxy; | ||||||
|  |  | ||||||
| TEST_CASE("ElementProxy::add()") { | TEST_CASE("ElementProxy::add()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   doc.add(); |   doc.add(); | ||||||
|   ElementProxy<JsonDocument&> ep = doc[0]; |   ElementProxy ep = doc[0]; | ||||||
|  |  | ||||||
|   SECTION("add(int)") { |   SECTION("add(int)") { | ||||||
|     ep.add(42); |     ep.add(42); | ||||||
| @@ -36,7 +38,7 @@ TEST_CASE("ElementProxy::add()") { | |||||||
| TEST_CASE("ElementProxy::clear()") { | TEST_CASE("ElementProxy::clear()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   doc.add(); |   doc.add(); | ||||||
|   ElementProxy<JsonDocument&> ep = doc[0]; |   ElementProxy ep = doc[0]; | ||||||
|  |  | ||||||
|   SECTION("size goes back to zero") { |   SECTION("size goes back to zero") { | ||||||
|     ep.add(42); |     ep.add(42); | ||||||
| @@ -96,7 +98,7 @@ TEST_CASE("ElementProxy::operator==()") { | |||||||
| TEST_CASE("ElementProxy::remove()") { | TEST_CASE("ElementProxy::remove()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   doc.add(); |   doc.add(); | ||||||
|   ElementProxy<JsonDocument&> ep = doc[0]; |   ElementProxy ep = doc[0]; | ||||||
|  |  | ||||||
|   SECTION("remove(int)") { |   SECTION("remove(int)") { | ||||||
|     ep.add(1); |     ep.add(1); | ||||||
| @@ -143,7 +145,7 @@ TEST_CASE("ElementProxy::remove()") { | |||||||
|  |  | ||||||
| TEST_CASE("ElementProxy::set()") { | TEST_CASE("ElementProxy::set()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   ElementProxy<JsonDocument&> ep = doc[0]; |   ElementProxy ep = doc[0]; | ||||||
|  |  | ||||||
|   SECTION("set(int)") { |   SECTION("set(int)") { | ||||||
|     ep.set(42); |     ep.set(42); | ||||||
| @@ -169,7 +171,7 @@ TEST_CASE("ElementProxy::set()") { | |||||||
| TEST_CASE("ElementProxy::size()") { | TEST_CASE("ElementProxy::size()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   doc.add(); |   doc.add(); | ||||||
|   ElementProxy<JsonDocument&> ep = doc[0]; |   ElementProxy ep = doc[0]; | ||||||
|  |  | ||||||
|   SECTION("returns 0") { |   SECTION("returns 0") { | ||||||
|     REQUIRE(ep.size() == 0); |     REQUIRE(ep.size() == 0); | ||||||
| @@ -191,7 +193,7 @@ TEST_CASE("ElementProxy::size()") { | |||||||
| TEST_CASE("ElementProxy::memoryUsage()") { | TEST_CASE("ElementProxy::memoryUsage()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   doc.add(); |   doc.add(); | ||||||
|   ElementProxy<JsonDocument&> ep = doc[0]; |   ElementProxy ep = doc[0]; | ||||||
|  |  | ||||||
|   SECTION("returns 0 for null") { |   SECTION("returns 0 for null") { | ||||||
|     REQUIRE(ep.memoryUsage() == 0); |     REQUIRE(ep.memoryUsage() == 0); | ||||||
| @@ -205,7 +207,7 @@ TEST_CASE("ElementProxy::memoryUsage()") { | |||||||
|  |  | ||||||
| TEST_CASE("ElementProxy::operator[]") { | TEST_CASE("ElementProxy::operator[]") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   ElementProxy<JsonDocument&> ep = doc[1]; |   ElementProxy ep = doc[1]; | ||||||
|  |  | ||||||
|   SECTION("set member") { |   SECTION("set member") { | ||||||
|     ep["world"] = 42; |     ep["world"] = 42; | ||||||
| @@ -224,7 +226,7 @@ TEST_CASE("ElementProxy cast to JsonVariantConst") { | |||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   doc[0] = "world"; |   doc[0] = "world"; | ||||||
|  |  | ||||||
|   const ElementProxy<JsonDocument&> ep = doc[0]; |   const ElementProxy ep = doc[0]; | ||||||
|  |  | ||||||
|   JsonVariantConst var = ep; |   JsonVariantConst var = ep; | ||||||
|  |  | ||||||
| @@ -235,7 +237,7 @@ TEST_CASE("ElementProxy cast to JsonVariant") { | |||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   doc[0] = "world"; |   doc[0] = "world"; | ||||||
|  |  | ||||||
|   ElementProxy<JsonDocument&> ep = doc[0]; |   ElementProxy ep = doc[0]; | ||||||
|  |  | ||||||
|   JsonVariant var = ep; |   JsonVariant var = ep; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,9 +7,11 @@ | |||||||
|  |  | ||||||
| using namespace ARDUINOJSON_NAMESPACE; | using namespace ARDUINOJSON_NAMESPACE; | ||||||
|  |  | ||||||
|  | typedef VariantProxy<MemberDataSource<JsonDocument&, const char*> > MemberProxy; | ||||||
|  |  | ||||||
| TEST_CASE("MemberProxy::add()") { | TEST_CASE("MemberProxy::add()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   SECTION("add(int)") { |   SECTION("add(int)") { | ||||||
|     mp.add(42); |     mp.add(42); | ||||||
| @@ -26,7 +28,7 @@ TEST_CASE("MemberProxy::add()") { | |||||||
|  |  | ||||||
| TEST_CASE("MemberProxy::clear()") { | TEST_CASE("MemberProxy::clear()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   SECTION("size goes back to zero") { |   SECTION("size goes back to zero") { | ||||||
|     mp.add(42); |     mp.add(42); | ||||||
| @@ -85,7 +87,7 @@ TEST_CASE("MemberProxy::operator==()") { | |||||||
|  |  | ||||||
| TEST_CASE("MemberProxy::containsKey()") { | TEST_CASE("MemberProxy::containsKey()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   SECTION("containsKey(const char*)") { |   SECTION("containsKey(const char*)") { | ||||||
|     mp["key"] = "value"; |     mp["key"] = "value"; | ||||||
| @@ -136,7 +138,7 @@ TEST_CASE("MemberProxy::operator|()") { | |||||||
|  |  | ||||||
| TEST_CASE("MemberProxy::remove()") { | TEST_CASE("MemberProxy::remove()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   SECTION("remove(int)") { |   SECTION("remove(int)") { | ||||||
|     mp.add(1); |     mp.add(1); | ||||||
| @@ -183,7 +185,7 @@ TEST_CASE("MemberProxy::remove()") { | |||||||
|  |  | ||||||
| TEST_CASE("MemberProxy::set()") { | TEST_CASE("MemberProxy::set()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   SECTION("set(int)") { |   SECTION("set(int)") { | ||||||
|     mp.set(42); |     mp.set(42); | ||||||
| @@ -208,7 +210,7 @@ TEST_CASE("MemberProxy::set()") { | |||||||
|  |  | ||||||
| TEST_CASE("MemberProxy::size()") { | TEST_CASE("MemberProxy::size()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   SECTION("returns 0") { |   SECTION("returns 0") { | ||||||
|     REQUIRE(mp.size() == 0); |     REQUIRE(mp.size() == 0); | ||||||
| @@ -231,7 +233,7 @@ TEST_CASE("MemberProxy::size()") { | |||||||
|  |  | ||||||
| TEST_CASE("MemberProxy::memoryUsage()") { | TEST_CASE("MemberProxy::memoryUsage()") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   SECTION("returns 0 when null") { |   SECTION("returns 0 when null") { | ||||||
|     REQUIRE(mp.memoryUsage() == 0); |     REQUIRE(mp.memoryUsage() == 0); | ||||||
| @@ -245,7 +247,7 @@ TEST_CASE("MemberProxy::memoryUsage()") { | |||||||
|  |  | ||||||
| TEST_CASE("MemberProxy::operator[]") { | TEST_CASE("MemberProxy::operator[]") { | ||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   SECTION("set member") { |   SECTION("set member") { | ||||||
|     mp["world"] = 42; |     mp["world"] = 42; | ||||||
| @@ -264,7 +266,7 @@ TEST_CASE("MemberProxy cast to JsonVariantConst") { | |||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   doc["hello"] = "world"; |   doc["hello"] = "world"; | ||||||
|  |  | ||||||
|   const MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   const MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   JsonVariantConst var = mp; |   JsonVariantConst var = mp; | ||||||
|  |  | ||||||
| @@ -275,7 +277,7 @@ TEST_CASE("MemberProxy cast to JsonVariant") { | |||||||
|   DynamicJsonDocument doc(4096); |   DynamicJsonDocument doc(4096); | ||||||
|   doc["hello"] = "world"; |   doc["hello"] = "world"; | ||||||
|  |  | ||||||
|   MemberProxy<JsonDocument&, const char*> mp = doc["hello"]; |   MemberProxy mp = doc["hello"]; | ||||||
|  |  | ||||||
|   JsonVariant var = mp; |   JsonVariant var = mp; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -184,11 +184,12 @@ TEST_CASE("Polyfills/type_traits") { | |||||||
|     CHECK((is_convertible<VariantRef, JsonVariantConst>::value == true)); |     CHECK((is_convertible<VariantRef, JsonVariantConst>::value == true)); | ||||||
|     CHECK((is_convertible<VariantConstRef, JsonVariantConst>::value == true)); |     CHECK((is_convertible<VariantConstRef, JsonVariantConst>::value == true)); | ||||||
|     CHECK((is_convertible<ArrayRef, JsonVariantConst>::value == true)); |     CHECK((is_convertible<ArrayRef, JsonVariantConst>::value == true)); | ||||||
|     CHECK((is_convertible<ElementProxy<ArrayRef>, JsonVariantConst>::value == |     CHECK((is_convertible<VariantProxy<ElementDataSource<ArrayRef> >, | ||||||
|            true)); |                           JsonVariantConst>::value == true)); | ||||||
|     CHECK((is_convertible<ArrayConstRef, JsonVariantConst>::value == true)); |     CHECK((is_convertible<ArrayConstRef, JsonVariantConst>::value == true)); | ||||||
|     CHECK((is_convertible<ObjectRef, JsonVariantConst>::value == true)); |     CHECK((is_convertible<ObjectRef, JsonVariantConst>::value == true)); | ||||||
|     CHECK((is_convertible<MemberProxy<ObjectRef, const char*>, |     CHECK( | ||||||
|  |         (is_convertible<VariantProxy<MemberDataSource<ObjectRef, const char*> >, | ||||||
|                         JsonVariantConst>::value == true)); |                         JsonVariantConst>::value == true)); | ||||||
|     CHECK((is_convertible<ObjectConstRef, JsonVariantConst>::value == true)); |     CHECK((is_convertible<ObjectConstRef, JsonVariantConst>::value == true)); | ||||||
|     CHECK( |     CHECK( | ||||||
|   | |||||||
| @@ -20,9 +20,10 @@ inline ObjectRef ArrayShortcuts<TArray>::createNestedObject() const { | |||||||
| } | } | ||||||
|  |  | ||||||
| template <typename TArray> | template <typename TArray> | ||||||
| inline ElementProxy<TArray> ArrayShortcuts<TArray>::operator[]( | inline VariantProxy<ElementDataSource<TArray> > | ||||||
|     size_t index) const { | ArrayShortcuts<TArray>::operator[](size_t index) const { | ||||||
|   return ElementProxy<TArray>(*impl(), index); |   return VariantProxy<ElementDataSource<TArray> >( | ||||||
|  |       ElementDataSource<TArray>(*impl(), index)); | ||||||
| } | } | ||||||
|  |  | ||||||
| }  // namespace ARDUINOJSON_NAMESPACE | }  // namespace ARDUINOJSON_NAMESPACE | ||||||
|   | |||||||
| @@ -17,8 +17,6 @@ | |||||||
| namespace ARDUINOJSON_NAMESPACE { | namespace ARDUINOJSON_NAMESPACE { | ||||||
|  |  | ||||||
| class ObjectRef; | class ObjectRef; | ||||||
| template <typename> |  | ||||||
| class ElementProxy; |  | ||||||
|  |  | ||||||
| template <typename TData> | template <typename TData> | ||||||
| class ArrayRefBase { | class ArrayRefBase { | ||||||
|   | |||||||
| @@ -11,14 +11,19 @@ namespace ARDUINOJSON_NAMESPACE { | |||||||
| // Forward declarations. | // Forward declarations. | ||||||
| class ArrayRef; | class ArrayRef; | ||||||
| class ObjectRef; | class ObjectRef; | ||||||
|  |  | ||||||
| template <typename> | template <typename> | ||||||
| class ElementProxy; | class ElementDataSource; | ||||||
|  |  | ||||||
|  | template <typename> | ||||||
|  | class VariantProxy; | ||||||
|  |  | ||||||
| template <typename TArray> | template <typename TArray> | ||||||
| class ArrayShortcuts { | class ArrayShortcuts { | ||||||
|  public: |  public: | ||||||
|   // Returns the element at specified index if the variant is an array. |   // Returns the element at specified index if the variant is an array. | ||||||
|   FORCE_INLINE ElementProxy<TArray> operator[](size_t index) const; |   FORCE_INLINE VariantProxy<ElementDataSource<TArray> > operator[]( | ||||||
|  |       size_t index) const; | ||||||
|  |  | ||||||
|   FORCE_INLINE ObjectRef createNestedObject() const; |   FORCE_INLINE ObjectRef createNestedObject() const; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,150 +4,16 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include <ArduinoJson/Configuration.hpp> | #include <ArduinoJson/Variant/VariantProxy.hpp> | ||||||
| #include <ArduinoJson/Variant/VariantOperators.hpp> |  | ||||||
| #include <ArduinoJson/Variant/VariantShortcuts.hpp> |  | ||||||
| #include <ArduinoJson/Variant/VariantTo.hpp> |  | ||||||
|  |  | ||||||
| #ifdef _MSC_VER |  | ||||||
| #  pragma warning(push) |  | ||||||
| #  pragma warning(disable : 4522) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| namespace ARDUINOJSON_NAMESPACE { | namespace ARDUINOJSON_NAMESPACE { | ||||||
|  |  | ||||||
| template <typename TUpstream> | template <typename TUpstream> | ||||||
| class ElementProxy  // | class ElementDataSource { | ||||||
|     : public VariantOperators<ElementProxy<TUpstream> >, |  | ||||||
|       public VariantShortcuts<ElementProxy<TUpstream> >, |  | ||||||
|       public VariantTag { |  | ||||||
|   friend class VariantAttorney; |  | ||||||
|  |  | ||||||
|  public: |  public: | ||||||
|   FORCE_INLINE ElementProxy(TUpstream upstream, size_t index) |   ElementDataSource(TUpstream upstream, size_t index) | ||||||
|       : _upstream(upstream), _index(index) {} |       : _upstream(upstream), _index(index) {} | ||||||
|  |  | ||||||
|   FORCE_INLINE ElementProxy(const ElementProxy& src) |  | ||||||
|       : _upstream(src._upstream), _index(src._index) {} |  | ||||||
|  |  | ||||||
|   FORCE_INLINE ElementProxy& operator=(const ElementProxy& src) { |  | ||||||
|     getOrAddUpstreamVariant().set(src); |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE ElementProxy& operator=(const T& src) { |  | ||||||
|     getOrAddUpstreamVariant().set(src); |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE ElementProxy& operator=(T* src) { |  | ||||||
|     getOrAddUpstreamVariant().set(src); |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE void clear() const { |  | ||||||
|     getUpstreamVariant().clear(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE bool isNull() const { |  | ||||||
|     return getUpstreamVariantConst().isNull(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if<!is_same<T, char*>::value && |  | ||||||
|                                       !ConverterNeedsWriteableRef<T>::value, |  | ||||||
|                                   T>::type |  | ||||||
|   as() const { |  | ||||||
|     return getUpstreamVariantConst().template as<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if<ConverterNeedsWriteableRef<T>::value, T>::type |  | ||||||
|   as() const { |  | ||||||
|     return getUpstreamVariant().template as<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   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 operator T() const { |  | ||||||
|     return as<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename VariantTo<T>::type to() { |  | ||||||
|     return getOrAddUpstreamVariant().template to<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE |  | ||||||
|       typename enable_if<ConverterNeedsWriteableRef<T>::value, bool>::type |  | ||||||
|       is() const { |  | ||||||
|     return getUpstreamVariant().template is<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE |  | ||||||
|       typename enable_if<!ConverterNeedsWriteableRef<T>::value, bool>::type |  | ||||||
|       is() const { |  | ||||||
|     return getUpstreamVariantConst().template is<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE void shallowCopy(VariantConstRef value) { |  | ||||||
|     getOrAddUpstreamVariant().shallowCopy(value); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE bool set(const T& value) { |  | ||||||
|     return getOrAddUpstreamVariant().set(value); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE bool set(T* value) { |  | ||||||
|     return getOrAddUpstreamVariant().set(value); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE size_t size() const { |  | ||||||
|     return getUpstreamVariantConst().size(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE size_t memoryUsage() const { |  | ||||||
|     return getUpstreamVariantConst().memoryUsage(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE VariantRef add() const { |  | ||||||
|     return getOrAddUpstreamVariant().add(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   using ArrayShortcuts<ElementProxy<TUpstream> >::add; |  | ||||||
|  |  | ||||||
|   FORCE_INLINE void remove(size_t index) const { |  | ||||||
|     getUpstreamVariant().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 { |  | ||||||
|     getUpstreamVariant().remove(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 { |  | ||||||
|     getUpstreamVariant().remove(key); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|  protected: |  | ||||||
|   FORCE_INLINE MemoryPool* getPool() const { |   FORCE_INLINE MemoryPool* getPool() const { | ||||||
|     return VariantAttorney::getPool(_upstream); |     return VariantAttorney::getPool(_upstream); | ||||||
|   } |   } | ||||||
| @@ -162,28 +28,13 @@ class ElementProxy  // | |||||||
|   } |   } | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   FORCE_INLINE VariantRef getUpstreamVariant() const { | #if defined _MSC_VER && _MSC_VER <= 1800  // Visual Studio 2013 or below | ||||||
|     return VariantRef(getPool(), getData()); |   // Prevent "assignment operator could not be generated" | ||||||
|   } |   ElementDataSource& operator=(const ElementDataSource&); | ||||||
|  | #endif | ||||||
|   FORCE_INLINE VariantConstRef getUpstreamVariantConst() const { |  | ||||||
|     return VariantConstRef(getData()); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE VariantRef getOrAddUpstreamVariant() const { |  | ||||||
|     return VariantRef(getPool(), getOrCreateData()); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   friend void convertToJson(const ElementProxy& src, VariantRef dst) { |  | ||||||
|     dst.set(src.getUpstreamVariantConst()); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   TUpstream _upstream; |   TUpstream _upstream; | ||||||
|   const size_t _index; |   size_t _index; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace ARDUINOJSON_NAMESPACE | }  // namespace ARDUINOJSON_NAMESPACE | ||||||
|  |  | ||||||
| #ifdef _MSC_VER |  | ||||||
| #  pragma warning(pop) |  | ||||||
| #endif |  | ||||||
|   | |||||||
| @@ -9,15 +9,9 @@ | |||||||
|  |  | ||||||
| namespace ARDUINOJSON_NAMESPACE { | namespace ARDUINOJSON_NAMESPACE { | ||||||
|  |  | ||||||
| template <typename TArray> | template <typename TSource> | ||||||
| struct Reader<ElementProxy<TArray>, void> : Reader<char*, void> { | struct Reader<VariantProxy<TSource>, void> : Reader<char*, void> { | ||||||
|   explicit Reader(const ElementProxy<TArray>& x) |   explicit Reader(const VariantProxy<TSource>& x) | ||||||
|       : Reader<char*, void>(x.template as<const char*>()) {} |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename TObject, typename TStringRef> |  | ||||||
| struct Reader<MemberProxy<TObject, TStringRef>, void> : Reader<char*, void> { |  | ||||||
|   explicit Reader(const MemberProxy<TObject, TStringRef>& x) |  | ||||||
|       : Reader<char*, void>(x.template as<const char*>()) {} |       : Reader<char*, void>(x.template as<const char*>()) {} | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -139,20 +139,24 @@ class JsonDocument : public VariantOperators<const JsonDocument&> { | |||||||
|   // operator[](const std::string&) |   // operator[](const std::string&) | ||||||
|   // operator[](const String&) |   // operator[](const String&) | ||||||
|   template <typename TString> |   template <typename TString> | ||||||
|   FORCE_INLINE typename enable_if<IsString<TString>::value, |   FORCE_INLINE typename enable_if< | ||||||
|                                   MemberProxy<JsonDocument&, TString> >::type |       IsString<TString>::value, | ||||||
|  |       VariantProxy<MemberDataSource<JsonDocument&, TString> > >::type | ||||||
|   operator[](const TString& key) { |   operator[](const TString& key) { | ||||||
|     return MemberProxy<JsonDocument&, TString>(*this, key); |     return VariantProxy<MemberDataSource<JsonDocument&, TString> >( | ||||||
|  |         MemberDataSource<JsonDocument&, TString>(*this, key)); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // operator[](char*) |   // operator[](char*) | ||||||
|   // operator[](const char*) |   // operator[](const char*) | ||||||
|   // operator[](const __FlashStringHelper*) |   // operator[](const __FlashStringHelper*) | ||||||
|   template <typename TChar> |   template <typename TChar> | ||||||
|   FORCE_INLINE typename enable_if<IsString<TChar*>::value, |   FORCE_INLINE typename enable_if< | ||||||
|                                   MemberProxy<JsonDocument&, TChar*> >::type |       IsString<TChar*>::value, | ||||||
|  |       VariantProxy<MemberDataSource<JsonDocument&, TChar*> > >::type | ||||||
|   operator[](TChar* key) { |   operator[](TChar* key) { | ||||||
|     return MemberProxy<JsonDocument&, TChar*>(*this, key); |     return VariantProxy<MemberDataSource<JsonDocument&, TChar*> >( | ||||||
|  |         MemberDataSource<JsonDocument&, TChar*>(*this, key)); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // operator[](const std::string&) const |   // operator[](const std::string&) const | ||||||
| @@ -174,8 +178,10 @@ class JsonDocument : public VariantOperators<const JsonDocument&> { | |||||||
|     return VariantConstRef(_data.getMember(adaptString(key))); |     return VariantConstRef(_data.getMember(adaptString(key))); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   FORCE_INLINE ElementProxy<JsonDocument&> operator[](size_t index) { |   FORCE_INLINE VariantProxy<ElementDataSource<JsonDocument&> > operator[]( | ||||||
|     return ElementProxy<JsonDocument&>(*this, index); |       size_t index) { | ||||||
|  |     return VariantProxy<ElementDataSource<JsonDocument&> >( | ||||||
|  |         ElementDataSource<JsonDocument&>(*this, index)); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   FORCE_INLINE VariantConstRef operator[](size_t index) const { |   FORCE_INLINE VariantConstRef operator[](size_t index) const { | ||||||
|   | |||||||
| @@ -4,153 +4,16 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include <ArduinoJson/Configuration.hpp> | #include <ArduinoJson/Variant/VariantProxy.hpp> | ||||||
| #include <ArduinoJson/Polyfills/type_traits.hpp> |  | ||||||
| #include <ArduinoJson/Variant/Converter.hpp> |  | ||||||
| #include <ArduinoJson/Variant/VariantOperators.hpp> |  | ||||||
| #include <ArduinoJson/Variant/VariantRef.hpp> |  | ||||||
| #include <ArduinoJson/Variant/VariantShortcuts.hpp> |  | ||||||
| #include <ArduinoJson/Variant/VariantTo.hpp> |  | ||||||
|  |  | ||||||
| #ifdef _MSC_VER |  | ||||||
| #  pragma warning(push) |  | ||||||
| #  pragma warning(disable : 4522) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| namespace ARDUINOJSON_NAMESPACE { | namespace ARDUINOJSON_NAMESPACE { | ||||||
|  |  | ||||||
| template <typename TUpstream, typename TStringRef> | template <typename TUpstream, typename TStringRef> | ||||||
| class MemberProxy  // | class MemberDataSource { | ||||||
|     : public VariantOperators<MemberProxy<TUpstream, TStringRef> >, |  | ||||||
|       public VariantShortcuts<MemberProxy<TUpstream, TStringRef> >, |  | ||||||
|       public VariantTag { |  | ||||||
|   friend class VariantAttorney; |  | ||||||
|  |  | ||||||
|  public: |  public: | ||||||
|   FORCE_INLINE MemberProxy(TUpstream upstream, TStringRef key) |   FORCE_INLINE MemberDataSource(TUpstream upstream, TStringRef key) | ||||||
|       : _upstream(upstream), _key(key) {} |       : _upstream(upstream), _key(key) {} | ||||||
|  |  | ||||||
|   FORCE_INLINE MemberProxy(const MemberProxy& src) |  | ||||||
|       : _upstream(src._upstream), _key(src._key) {} |  | ||||||
|  |  | ||||||
|   FORCE_INLINE MemberProxy& operator=(const MemberProxy& src) { |  | ||||||
|     getOrAddUpstreamVariant().set(src); |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE MemberProxy& operator=(const T& src) { |  | ||||||
|     getOrAddUpstreamVariant().set(src); |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE MemberProxy& operator=(T* src) { |  | ||||||
|     getOrAddUpstreamVariant().set(src); |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE void clear() const { |  | ||||||
|     getUpstreamVariant().clear(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE bool isNull() const { |  | ||||||
|     return getUpstreamVariantConst().isNull(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if<!is_same<T, char*>::value && |  | ||||||
|                                       !ConverterNeedsWriteableRef<T>::value, |  | ||||||
|                                   T>::type |  | ||||||
|   as() const { |  | ||||||
|     return getUpstreamVariantConst().template as<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename enable_if<ConverterNeedsWriteableRef<T>::value, T>::type |  | ||||||
|   as() const { |  | ||||||
|     return getUpstreamVariant().template as<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   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 operator T() const { |  | ||||||
|     return as<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE typename VariantTo<T>::type to() { |  | ||||||
|     return getOrAddUpstreamVariant().template to<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE |  | ||||||
|       typename enable_if<ConverterNeedsWriteableRef<T>::value, bool>::type |  | ||||||
|       is() const { |  | ||||||
|     return getUpstreamVariant().template is<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE |  | ||||||
|       typename enable_if<!ConverterNeedsWriteableRef<T>::value, bool>::type |  | ||||||
|       is() const { |  | ||||||
|     return getUpstreamVariantConst().template is<T>(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE void shallowCopy(VariantConstRef value) { |  | ||||||
|     getOrAddUpstreamVariant().shallowCopy(value); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE bool set(const T& value) { |  | ||||||
|     return getOrAddUpstreamVariant().set(value); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   template <typename T> |  | ||||||
|   FORCE_INLINE bool set(T* value) { |  | ||||||
|     return getOrAddUpstreamVariant().set(value); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE size_t size() const { |  | ||||||
|     return getUpstreamVariantConst().size(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE size_t memoryUsage() const { |  | ||||||
|     return getUpstreamVariantConst().memoryUsage(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE VariantRef add() const { |  | ||||||
|     return getOrAddUpstreamVariant().add(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   using ArrayShortcuts<MemberProxy<TUpstream, TStringRef> >::add; |  | ||||||
|  |  | ||||||
|   FORCE_INLINE void remove(size_t index) const { |  | ||||||
|     getUpstreamVariant().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 { |  | ||||||
|     getUpstreamVariant().remove(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 { |  | ||||||
|     getUpstreamVariant().remove(key); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|  protected: |  | ||||||
|   FORCE_INLINE MemoryPool* getPool() const { |   FORCE_INLINE MemoryPool* getPool() const { | ||||||
|     return VariantAttorney::getPool(_upstream); |     return VariantAttorney::getPool(_upstream); | ||||||
|   } |   } | ||||||
| @@ -166,28 +29,13 @@ class MemberProxy  // | |||||||
|   } |   } | ||||||
|  |  | ||||||
|  private: |  private: | ||||||
|   FORCE_INLINE VariantRef getUpstreamVariant() const { | #if defined _MSC_VER && _MSC_VER <= 1800  // Visual Studio 2013 or below | ||||||
|     return VariantRef(getPool(), getData()); |   // Prevent "assignment operator could not be generated" | ||||||
|   } |   MemberDataSource& operator=(const MemberDataSource&); | ||||||
|  | #endif | ||||||
|   FORCE_INLINE VariantConstRef getUpstreamVariantConst() const { |  | ||||||
|     return VariantConstRef(getData()); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   FORCE_INLINE VariantRef getOrAddUpstreamVariant() const { |  | ||||||
|     return VariantRef(getPool(), getOrCreateData()); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   friend void convertToJson(const MemberProxy& src, VariantRef dst) { |  | ||||||
|     dst.set(src.getUpstreamVariantConst()); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   TUpstream _upstream; |   TUpstream _upstream; | ||||||
|   TStringRef _key; |   TStringRef _key; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| }  // namespace ARDUINOJSON_NAMESPACE | }  // namespace ARDUINOJSON_NAMESPACE | ||||||
|  |  | ||||||
| #ifdef _MSC_VER |  | ||||||
| #  pragma warning(pop) |  | ||||||
| #endif |  | ||||||
|   | |||||||
| @@ -54,18 +54,22 @@ ObjectShortcuts<TObject>::containsKey(TChar* key) const { | |||||||
|  |  | ||||||
| template <typename TObject> | template <typename TObject> | ||||||
| template <typename TString> | template <typename TString> | ||||||
| inline typename enable_if<IsString<TString*>::value, | inline typename enable_if< | ||||||
|                           MemberProxy<TObject, TString*> >::type |     IsString<TString*>::value, | ||||||
|  |     VariantProxy<MemberDataSource<TObject, TString*> > >::type | ||||||
| ObjectShortcuts<TObject>::operator[](TString* key) const { | ObjectShortcuts<TObject>::operator[](TString* key) const { | ||||||
|   return MemberProxy<TObject, TString*>(*impl(), key); |   return VariantProxy<MemberDataSource<TObject, TString*> >( | ||||||
|  |       MemberDataSource<TObject, TString*>(*impl(), key)); | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename TObject> | template <typename TObject> | ||||||
| template <typename TString> | template <typename TString> | ||||||
| inline typename enable_if<IsString<TString>::value, | inline | ||||||
|                           MemberProxy<TObject, TString> >::type |     typename enable_if<IsString<TString>::value, | ||||||
| ObjectShortcuts<TObject>::operator[](const TString& key) const { |                        VariantProxy<MemberDataSource<TObject, TString> > >::type | ||||||
|   return MemberProxy<TObject, TString>(*impl(), key); |     ObjectShortcuts<TObject>::operator[](const TString& key) const { | ||||||
|  |   return VariantProxy<MemberDataSource<TObject, TString> >( | ||||||
|  |       MemberDataSource<TObject, TString>(*impl(), key)); | ||||||
| } | } | ||||||
|  |  | ||||||
| }  // namespace ARDUINOJSON_NAMESPACE | }  // namespace ARDUINOJSON_NAMESPACE | ||||||
|   | |||||||
| @@ -9,8 +9,11 @@ | |||||||
| #include <ArduinoJson/Strings/StringAdapters.hpp> | #include <ArduinoJson/Strings/StringAdapters.hpp> | ||||||
|  |  | ||||||
| namespace ARDUINOJSON_NAMESPACE { | namespace ARDUINOJSON_NAMESPACE { | ||||||
|  | template <typename TSource> | ||||||
|  | class VariantProxy; | ||||||
|  |  | ||||||
| template <typename TParent, typename TStringRef> | template <typename TParent, typename TStringRef> | ||||||
| class MemberProxy; | class MemberDataSource; | ||||||
|  |  | ||||||
| template <typename TObject> | template <typename TObject> | ||||||
| class ObjectShortcuts { | class ObjectShortcuts { | ||||||
| @@ -31,16 +34,18 @@ class ObjectShortcuts { | |||||||
|   // operator[](const std::string&) const |   // operator[](const std::string&) const | ||||||
|   // operator[](const String&) const |   // operator[](const String&) const | ||||||
|   template <typename TString> |   template <typename TString> | ||||||
|   FORCE_INLINE typename enable_if<IsString<TString>::value, |   FORCE_INLINE typename enable_if< | ||||||
|                                   MemberProxy<TObject, TString> >::type |       IsString<TString>::value, | ||||||
|  |       VariantProxy<MemberDataSource<TObject, TString> > >::type | ||||||
|   operator[](const TString& key) const; |   operator[](const TString& key) const; | ||||||
|  |  | ||||||
|   // operator[](char*) const |   // operator[](char*) const | ||||||
|   // operator[](const char*) const |   // operator[](const char*) const | ||||||
|   // operator[](const __FlashStringHelper*) const |   // operator[](const __FlashStringHelper*) const | ||||||
|   template <typename TChar> |   template <typename TChar> | ||||||
|   FORCE_INLINE typename enable_if<IsString<TChar*>::value, |   FORCE_INLINE typename enable_if< | ||||||
|                                   MemberProxy<TObject, TChar*> >::type |       IsString<TChar*>::value, | ||||||
|  |       VariantProxy<MemberDataSource<TObject, TChar*> > >::type | ||||||
|   operator[](TChar* key) const; |   operator[](TChar* key) const; | ||||||
|  |  | ||||||
|   // createNestedArray(const std::string&) const |   // createNestedArray(const std::string&) const | ||||||
|   | |||||||
							
								
								
									
										185
									
								
								src/ArduinoJson/Variant/VariantProxy.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								src/ArduinoJson/Variant/VariantProxy.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,185 @@ | |||||||
|  | // ArduinoJson - https://arduinojson.org | ||||||
|  | // Copyright © 2014-2022, Benoit BLANCHON | ||||||
|  | // MIT License | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <ArduinoJson/Configuration.hpp> | ||||||
|  | #include <ArduinoJson/Variant/VariantOperators.hpp> | ||||||
|  | #include <ArduinoJson/Variant/VariantShortcuts.hpp> | ||||||
|  | #include <ArduinoJson/Variant/VariantTo.hpp> | ||||||
|  |  | ||||||
|  | #ifdef _MSC_VER | ||||||
|  | #  pragma warning(push) | ||||||
|  | #  pragma warning(disable : 4522) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | namespace ARDUINOJSON_NAMESPACE { | ||||||
|  |  | ||||||
|  | template <typename TDataSource> | ||||||
|  | class VariantProxy : public VariantShortcuts<VariantProxy<TDataSource> >, | ||||||
|  |                      public VariantOperators<VariantProxy<TDataSource> >, | ||||||
|  |                      public VariantTag { | ||||||
|  |   friend class VariantAttorney; | ||||||
|  |  | ||||||
|  |  public: | ||||||
|  |   explicit FORCE_INLINE VariantProxy(TDataSource source) : _source(source) {} | ||||||
|  |  | ||||||
|  |   // Copy-constructor required because of user-defined copy-assignment operator | ||||||
|  |   FORCE_INLINE VariantProxy(const VariantProxy& src) : _source(src._source) {} | ||||||
|  |  | ||||||
|  |   FORCE_INLINE VariantProxy& operator=(const VariantProxy& src) { | ||||||
|  |     getOrAddUpstreamVariant().set(src); | ||||||
|  |     return *this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   FORCE_INLINE VariantProxy& operator=(const T& src) { | ||||||
|  |     getOrAddUpstreamVariant().set(src); | ||||||
|  |     return *this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   FORCE_INLINE VariantProxy& operator=(T* src) { | ||||||
|  |     getOrAddUpstreamVariant().set(src); | ||||||
|  |     return *this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE void clear() const { | ||||||
|  |     getUpstreamVariant().clear(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE bool isNull() const { | ||||||
|  |     return getUpstreamVariantConst().isNull(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   FORCE_INLINE typename enable_if<!is_same<T, char*>::value && | ||||||
|  |                                       !ConverterNeedsWriteableRef<T>::value, | ||||||
|  |                                   T>::type | ||||||
|  |   as() const { | ||||||
|  |     return getUpstreamVariantConst().template as<T>(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   FORCE_INLINE typename enable_if<ConverterNeedsWriteableRef<T>::value, T>::type | ||||||
|  |   as() const { | ||||||
|  |     return getUpstreamVariant().template as<T>(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   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 operator T() const { | ||||||
|  |     return as<T>(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   FORCE_INLINE typename VariantTo<T>::type to() { | ||||||
|  |     return getOrAddUpstreamVariant().template to<T>(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   FORCE_INLINE | ||||||
|  |       typename enable_if<ConverterNeedsWriteableRef<T>::value, bool>::type | ||||||
|  |       is() const { | ||||||
|  |     return getUpstreamVariant().template is<T>(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   FORCE_INLINE | ||||||
|  |       typename enable_if<!ConverterNeedsWriteableRef<T>::value, bool>::type | ||||||
|  |       is() const { | ||||||
|  |     return getUpstreamVariantConst().template is<T>(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE void shallowCopy(VariantConstRef value) { | ||||||
|  |     getOrAddUpstreamVariant().shallowCopy(value); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   FORCE_INLINE bool set(const T& value) { | ||||||
|  |     return getOrAddUpstreamVariant().set(value); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   template <typename T> | ||||||
|  |   FORCE_INLINE bool set(T* value) { | ||||||
|  |     return getOrAddUpstreamVariant().set(value); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE size_t size() const { | ||||||
|  |     return getUpstreamVariantConst().size(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE size_t memoryUsage() const { | ||||||
|  |     return getUpstreamVariantConst().memoryUsage(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE VariantRef add() const { | ||||||
|  |     return getOrAddUpstreamVariant().add(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   using ArrayShortcuts<VariantProxy<TDataSource> >::add; | ||||||
|  |  | ||||||
|  |   FORCE_INLINE void remove(size_t index) const { | ||||||
|  |     getUpstreamVariant().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 { | ||||||
|  |     getUpstreamVariant().remove(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 { | ||||||
|  |     getUpstreamVariant().remove(key); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   FORCE_INLINE MemoryPool* getPool() const { | ||||||
|  |     return _source.getPool(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE VariantData* getData() const { | ||||||
|  |     return _source.getData(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE VariantData* getOrCreateData() const { | ||||||
|  |     return _source.getOrCreateData(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  private: | ||||||
|  |   FORCE_INLINE VariantRef getUpstreamVariant() const { | ||||||
|  |     return VariantRef(getPool(), getData()); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE VariantConstRef getUpstreamVariantConst() const { | ||||||
|  |     return VariantConstRef(getData()); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   FORCE_INLINE VariantRef getOrAddUpstreamVariant() const { | ||||||
|  |     return VariantRef(getPool(), getOrCreateData()); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   friend void convertToJson(const VariantProxy& src, VariantRef dst) { | ||||||
|  |     dst.set(src.getUpstreamVariantConst()); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   const TDataSource _source; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace ARDUINOJSON_NAMESPACE | ||||||
|  |  | ||||||
|  | #ifdef _MSC_VER | ||||||
|  | #  pragma warning(pop) | ||||||
|  | #endif | ||||||
		Reference in New Issue
	
	Block a user