diff --git a/src/ArduinoJson/Array/ElementProxy.hpp b/src/ArduinoJson/Array/ElementProxy.hpp index b200ff1d..651b37b1 100644 --- a/src/ArduinoJson/Array/ElementProxy.hpp +++ b/src/ArduinoJson/Array/ElementProxy.hpp @@ -16,51 +16,43 @@ namespace ARDUINOJSON_NAMESPACE { -template -class ElementProxy : public VariantOperators >, - public VariantShortcuts >, - public VariantTag { - typedef ElementProxy this_type; - +template +class ElementProxy // + : public VariantOperators >, + public VariantShortcuts >, + public VariantTag { friend class VariantAttorney; public: - FORCE_INLINE ElementProxy(TArray array, size_t index) - : _array(array), _index(index) {} + FORCE_INLINE ElementProxy(TUpstream upstream, size_t index) + : _upstream(upstream), _index(index) {} FORCE_INLINE ElementProxy(const ElementProxy& src) - : _array(src._array), _index(src._index) {} + : _upstream(src._upstream), _index(src._index) {} - FORCE_INLINE this_type& operator=(const this_type& src) { - getOrAddUpstreamElement().set(src.as()); + FORCE_INLINE ElementProxy& operator=(const ElementProxy& src) { + getOrAddUpstreamVariant().set(src); 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); + FORCE_INLINE ElementProxy& operator=(const T& src) { + getOrAddUpstreamVariant().set(src); return *this; } - // - // operator=(TValue) - // TValue = char*, const char*, const __FlashStringHelper* + template - FORCE_INLINE this_type& operator=(T* src) { - getOrAddUpstreamElement().set(src); + FORCE_INLINE ElementProxy& operator=(T* src) { + getOrAddUpstreamVariant().set(src); return *this; } FORCE_INLINE void clear() const { - getUpstreamElement().clear(); + getUpstreamVariant().clear(); } FORCE_INLINE bool isNull() const { - return getUpstreamElementConst().isNull(); + return getUpstreamVariantConst().isNull(); } template @@ -68,13 +60,13 @@ class ElementProxy : public VariantOperators >, !ConverterNeedsWriteableRef::value, T>::type as() const { - return getUpstreamElementConst().template as(); + return getUpstreamVariantConst().template as(); } template FORCE_INLINE typename enable_if::value, T>::type as() const { - return getUpstreamElement().template as(); + return getUpstreamVariant().template as(); } template @@ -89,62 +81,55 @@ class ElementProxy : public VariantOperators >, return as(); } + template + FORCE_INLINE typename VariantTo::type to() { + return getOrAddUpstreamVariant().template to(); + } + template FORCE_INLINE typename enable_if::value, bool>::type is() const { - return getUpstreamElement().template is(); + return getUpstreamVariant().template is(); } template FORCE_INLINE typename enable_if::value, bool>::type is() const { - return getUpstreamElementConst().template is(); + return getUpstreamVariantConst().template is(); + } + + FORCE_INLINE void shallowCopy(VariantConstRef value) { + getOrAddUpstreamVariant().shallowCopy(value); } template - FORCE_INLINE typename VariantTo::type to() const { - return getOrAddUpstreamElement().template to(); + FORCE_INLINE bool set(const T& value) { + return getOrAddUpstreamVariant().set(value); } - FORCE_INLINE void shallowCopy(VariantConstRef value) const { - getOrAddUpstreamElement().shallowCopy(value); - } - - // 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 + FORCE_INLINE bool set(T* value) { + return getOrAddUpstreamVariant().set(value); } FORCE_INLINE size_t size() const { - return getUpstreamElementConst().size(); + return getUpstreamVariantConst().size(); } FORCE_INLINE size_t memoryUsage() const { - return getUpstreamElementConst().memoryUsage(); + return getUpstreamVariantConst().memoryUsage(); } - VariantRef add() const { - return getOrAddUpstreamElement().add(); + FORCE_INLINE VariantRef add() const { + return getOrAddUpstreamVariant().add(); } - using ArrayShortcuts >::add; + using ArrayShortcuts >::add; FORCE_INLINE void remove(size_t index) const { - getUpstreamElement().remove(index); + getUpstreamVariant().remove(index); } // remove(char*) const // remove(const char*) const @@ -152,48 +137,48 @@ class ElementProxy : public VariantOperators >, template FORCE_INLINE typename enable_if::value>::type remove( TChar* key) const { - getUpstreamElement().remove(key); + getUpstreamVariant().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); + getUpstreamVariant().remove(key); } protected: FORCE_INLINE MemoryPool* getPool() const { - return VariantAttorney::getPool(_array); + return VariantAttorney::getPool(_upstream); } FORCE_INLINE VariantData* getData() const { - return variantGetElement(VariantAttorney::getData(_array), _index); + return variantGetElement(VariantAttorney::getData(_upstream), _index); } FORCE_INLINE VariantData* getOrCreateData() const { - return variantGetOrAddElement(VariantAttorney::getOrCreateData(_array), - _index, VariantAttorney::getPool(_array)); + return variantGetOrAddElement(VariantAttorney::getOrCreateData(_upstream), + _index, VariantAttorney::getPool(_upstream)); } private: - FORCE_INLINE VariantRef getUpstreamElement() const { + FORCE_INLINE VariantRef getUpstreamVariant() const { return VariantRef(getPool(), getData()); } - FORCE_INLINE VariantConstRef getUpstreamElementConst() const { + FORCE_INLINE VariantConstRef getUpstreamVariantConst() const { return VariantConstRef(getData()); } - FORCE_INLINE VariantRef getOrAddUpstreamElement() const { + FORCE_INLINE VariantRef getOrAddUpstreamVariant() const { return VariantRef(getPool(), getOrCreateData()); } - friend void convertToJson(const this_type& src, VariantRef dst) { - dst.set(src.getUpstreamElementConst()); + friend void convertToJson(const ElementProxy& src, VariantRef dst) { + dst.set(src.getUpstreamVariantConst()); } - TArray _array; + TUpstream _upstream; const size_t _index; }; diff --git a/src/ArduinoJson/Object/MemberProxy.hpp b/src/ArduinoJson/Object/MemberProxy.hpp index e3e7f69b..68f12b0c 100644 --- a/src/ArduinoJson/Object/MemberProxy.hpp +++ b/src/ArduinoJson/Object/MemberProxy.hpp @@ -19,52 +19,43 @@ namespace ARDUINOJSON_NAMESPACE { -template -class MemberProxy : public VariantOperators >, - public VariantShortcuts >, - public VariantTag { - typedef MemberProxy this_type; - +template +class MemberProxy // + : public VariantOperators >, + public VariantShortcuts >, + public VariantTag { friend class VariantAttorney; public: - FORCE_INLINE MemberProxy(TObject variant, TStringRef key) - : _object(variant), _key(key) {} + FORCE_INLINE MemberProxy(TUpstream upstream, TStringRef key) + : _upstream(upstream), _key(key) {} FORCE_INLINE MemberProxy(const MemberProxy& src) - : _object(src._object), _key(src._key) {} + : _upstream(src._upstream), _key(src._key) {} - FORCE_INLINE operator VariantConstRef() const { - return getUpstreamMemberConst(); - } - - FORCE_INLINE this_type& operator=(const this_type& src) { - getOrAddUpstreamMember().set(src); + FORCE_INLINE MemberProxy& operator=(const MemberProxy& src) { + getOrAddUpstreamVariant().set(src); return *this; } - template - FORCE_INLINE typename enable_if::value, this_type&>::type - operator=(const TValue& src) { - getOrAddUpstreamMember().set(src); + template + FORCE_INLINE MemberProxy& operator=(const T& src) { + getOrAddUpstreamVariant().set(src); return *this; } - // operator=(char*) - // operator=(const char*) - // operator=(const __FlashStringHelper*) - template - FORCE_INLINE this_type& operator=(TChar* src) { - getOrAddUpstreamMember().set(src); + template + FORCE_INLINE MemberProxy& operator=(T* src) { + getOrAddUpstreamVariant().set(src); return *this; } FORCE_INLINE void clear() const { - getUpstreamMember().clear(); + getUpstreamVariant().clear(); } FORCE_INLINE bool isNull() const { - return getUpstreamMemberConst().isNull(); + return getUpstreamVariantConst().isNull(); } template @@ -72,13 +63,13 @@ class MemberProxy : public VariantOperators >, !ConverterNeedsWriteableRef::value, T>::type as() const { - return getUpstreamMemberConst().template as(); + return getUpstreamVariantConst().template as(); } template FORCE_INLINE typename enable_if::value, T>::type as() const { - return getUpstreamMember().template as(); + return getUpstreamVariant().template as(); } template @@ -93,30 +84,55 @@ class MemberProxy : public VariantOperators >, return as(); } + template + FORCE_INLINE typename VariantTo::type to() { + return getOrAddUpstreamVariant().template to(); + } + template FORCE_INLINE typename enable_if::value, bool>::type is() const { - return getUpstreamMember().template is(); + return getUpstreamVariant().template is(); } template FORCE_INLINE typename enable_if::value, bool>::type is() const { - return getUpstreamMemberConst().template is(); + return getUpstreamVariantConst().template is(); + } + + FORCE_INLINE void shallowCopy(VariantConstRef value) { + getOrAddUpstreamVariant().shallowCopy(value); + } + + template + FORCE_INLINE bool set(const T& value) { + return getOrAddUpstreamVariant().set(value); + } + + template + FORCE_INLINE bool set(T* value) { + return getOrAddUpstreamVariant().set(value); } FORCE_INLINE size_t size() const { - return getUpstreamMemberConst().size(); + return getUpstreamVariantConst().size(); } FORCE_INLINE size_t memoryUsage() const { - return getUpstreamMemberConst().memoryUsage(); + return getUpstreamVariantConst().memoryUsage(); } + FORCE_INLINE VariantRef add() const { + return getOrAddUpstreamVariant().add(); + } + + using ArrayShortcuts >::add; + FORCE_INLINE void remove(size_t index) const { - getUpstreamMember().remove(index); + getUpstreamVariant().remove(index); } // remove(char*) const // remove(const char*) const @@ -124,77 +140,49 @@ class MemberProxy : public VariantOperators >, template FORCE_INLINE typename enable_if::value>::type remove( TChar* key) const { - getUpstreamMember().remove(key); + getUpstreamVariant().remove(key); } // remove(const std::string&) const // remove(const String&) const template FORCE_INLINE typename enable_if::value>::type remove( const TString& key) const { - getUpstreamMember().remove(key); + getUpstreamVariant().remove(key); } - FORCE_INLINE void shallowCopy(VariantConstRef value) { - getOrAddUpstreamMember().shallowCopy(value); - } - - template - FORCE_INLINE typename VariantTo::type to() { - return getOrAddUpstreamMember().template to(); - } - - template - FORCE_INLINE bool set(const TValue& value) { - return getOrAddUpstreamMember().set(value); - } - - // set(char*) const - // set(const char*) const - // set(const __FlashStringHelper*) const - template - FORCE_INLINE bool set(TChar* value) { - return getOrAddUpstreamMember().set(value); - } - - FORCE_INLINE VariantRef add() const { - return getOrAddUpstreamMember().add(); - } - - using ArrayShortcuts >::add; - protected: FORCE_INLINE MemoryPool* getPool() const { - return VariantAttorney::getPool(_object); + return VariantAttorney::getPool(_upstream); } FORCE_INLINE VariantData* getData() const { - return variantGetMember(VariantAttorney::getData(_object), + return variantGetMember(VariantAttorney::getData(_upstream), adaptString(_key)); } FORCE_INLINE VariantData* getOrCreateData() const { - return variantGetOrAddMember(VariantAttorney::getOrCreateData(_object), - _key, VariantAttorney::getPool(_object)); + return variantGetOrAddMember(VariantAttorney::getOrCreateData(_upstream), + _key, VariantAttorney::getPool(_upstream)); } private: - FORCE_INLINE VariantRef getUpstreamMember() const { + FORCE_INLINE VariantRef getUpstreamVariant() const { return VariantRef(getPool(), getData()); } - FORCE_INLINE VariantConstRef getUpstreamMemberConst() const { + FORCE_INLINE VariantConstRef getUpstreamVariantConst() const { return VariantConstRef(getData()); } - FORCE_INLINE VariantRef getOrAddUpstreamMember() const { + FORCE_INLINE VariantRef getOrAddUpstreamVariant() const { return VariantRef(getPool(), getOrCreateData()); } - friend void convertToJson(const this_type& src, VariantRef dst) { - dst.set(src.getUpstreamMemberConst()); + friend void convertToJson(const MemberProxy& src, VariantRef dst) { + dst.set(src.getUpstreamVariantConst()); } - TObject _object; + TUpstream _upstream; TStringRef _key; };