// ArduinoJson - https://arduinojson.org // Copyright Benoit Blanchon 2014-2021 // MIT License #pragma once #include "lib/ArduinoJson/Configuration.hpp" #include "lib/ArduinoJson/Variant/VariantOperators.hpp" #include "lib/ArduinoJson/Variant/VariantShortcuts.hpp" #include "lib/ArduinoJson/Variant/VariantTo.hpp" #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4522) #endif namespace ARDUINOJSON_NAMESPACE { template class ElementProxy : public VariantOperators >, public VariantShortcuts >, public Visitable, public VariantTag { typedef ElementProxy this_type; public: typedef VariantRef variant_type; FORCE_INLINE ElementProxy(TArray array, size_t index) : _array(array), _index(index) {} FORCE_INLINE ElementProxy(const ElementProxy& src) : _array(src._array), _index(src._index) {} FORCE_INLINE this_type& operator=(const this_type& src) { getOrAddUpstreamElement().set(src.as()); return *this; } // Replaces the value // // operator=(const TValue&) // TValue = bool, long, int, short, float, double, serialized, VariantRef, // std::string, String, ArrayRef, ObjectRef template FORCE_INLINE this_type& operator=(const T& src) { getOrAddUpstreamElement().set(src); return *this; } // // operator=(TValue) // TValue = char*, const char*, const __FlashStringHelper* template FORCE_INLINE this_type& operator=(T* src) { getOrAddUpstreamElement().set(src); return *this; } FORCE_INLINE void clear() const { getUpstreamElement().clear(); } FORCE_INLINE bool isNull() const { return getUpstreamElement().isNull(); } template FORCE_INLINE typename enable_if::value, T>::type as() const { return getUpstreamElement().template as(); } template FORCE_INLINE typename enable_if::value, const char*>::type ARDUINOJSON_DEPRECATED("Replace as() with as()") as() const { return as(); } template FORCE_INLINE operator T() const { return getUpstreamElement(); } template FORCE_INLINE bool is() const { return getUpstreamElement().template is(); } template FORCE_INLINE typename VariantTo::type to() const { return getOrAddUpstreamElement().template to(); } // Replaces the value // // bool set(const TValue&) // TValue = bool, long, int, short, float, double, serialized, VariantRef, // std::string, String, ArrayRef, ObjectRef template FORCE_INLINE bool set(const TValue& value) const { return getOrAddUpstreamElement().set(value); } // // bool set(TValue) // TValue = char*, const char*, const __FlashStringHelper* template FORCE_INLINE bool set(TValue* value) const { return getOrAddUpstreamElement().set(value); } template typename TVisitor::result_type accept(TVisitor& visitor) const { return getUpstreamElement().accept(visitor); } FORCE_INLINE size_t size() const { return getUpstreamElement().size(); } template VariantRef getMember(TNestedKey* key) const { return getUpstreamElement().getMember(key); } template VariantRef getMember(const TNestedKey& key) const { return getUpstreamElement().getMember(key); } template VariantRef getOrAddMember(TNestedKey* key) const { return getOrAddUpstreamElement().getOrAddMember(key); } template VariantRef getOrAddMember(const TNestedKey& key) const { return getOrAddUpstreamElement().getOrAddMember(key); } VariantRef addElement() const { return getOrAddUpstreamElement().addElement(); } VariantRef getElement(size_t index) const { return getOrAddUpstreamElement().getElement(index); } VariantRef getOrAddElement(size_t index) const { return getOrAddUpstreamElement().getOrAddElement(index); } FORCE_INLINE void remove(size_t index) const { getUpstreamElement().remove(index); } // remove(char*) const // remove(const char*) const // remove(const __FlashStringHelper*) const template FORCE_INLINE typename enable_if::value>::type remove( TChar* key) const { getUpstreamElement().remove(key); } // remove(const std::string&) const // remove(const String&) const template FORCE_INLINE typename enable_if::value>::type remove( const TString& key) const { getUpstreamElement().remove(key); } private: FORCE_INLINE VariantRef getUpstreamElement() const { return _array.getElement(_index); } FORCE_INLINE VariantRef getOrAddUpstreamElement() const { return _array.getOrAddElement(_index); } friend bool convertToJson(const this_type& src, VariantRef dst) { return dst.set(src.getUpstreamElement()); } TArray _array; const size_t _index; }; } // namespace ARDUINOJSON_NAMESPACE #ifdef _MSC_VER #pragma warning(pop) #endif