diff --git a/src/ArduinoJson/Array/ArrayImpl.hpp b/src/ArduinoJson/Array/ArrayImpl.hpp index 18fd58e0..c8fb8279 100644 --- a/src/ArduinoJson/Array/ArrayImpl.hpp +++ b/src/ArduinoJson/Array/ArrayImpl.hpp @@ -9,21 +9,25 @@ namespace ARDUINOJSON_NAMESPACE { -template -inline ArrayRef ArrayShortcuts::createNestedArray() const { - return impl()->add().template to(); +inline ObjectRef ArrayRef::createNestedObject() const { + return add().to(); } -template -inline ObjectRef ArrayShortcuts::createNestedObject() const { - return impl()->add().template to(); +template +inline ArrayRef VariantRefBase::createNestedArray() const { + return add().template to(); } -template -inline VariantProxy > -ArrayShortcuts::operator[](size_t index) const { - return VariantProxy >( - ElementDataSource(*impl(), index)); +template +inline ObjectRef VariantRefBase::createNestedObject() const { + return add().template to(); +} + +template +inline VariantProxy > > +VariantRefBase::operator[](size_t index) const { + return VariantProxy > >( + ElementDataSource >(*this, index)); } } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Array/ArrayRef.hpp b/src/ArduinoJson/Array/ArrayRef.hpp index 036d6662..4d73a989 100644 --- a/src/ArduinoJson/Array/ArrayRef.hpp +++ b/src/ArduinoJson/Array/ArrayRef.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -106,7 +107,6 @@ class ArrayConstRef : public ArrayRefBase, }; class ArrayRef : public ArrayRefBase, - public ArrayShortcuts, public VariantOperators { typedef ArrayRefBase base_type; @@ -132,7 +132,15 @@ class ArrayRef : public ArrayRefBase, return VariantRef(_pool, arrayAdd(_data, _pool)); } - using ArrayShortcuts::add; + template + FORCE_INLINE bool add(const T& value) const { + return add().set(value); + } + + template + FORCE_INLINE bool add(T* value) const { + return add().set(value); + } FORCE_INLINE iterator begin() const { if (!_data) @@ -175,6 +183,19 @@ class ArrayRef : public ArrayRefBase, _data->clear(); } + // Returns the element at specified index if the variant is an array. + FORCE_INLINE VariantProxy > operator[]( + size_t index) const { + return VariantProxy >( + ElementDataSource(*this, index)); + } + + FORCE_INLINE ObjectRef createNestedObject() const; + + FORCE_INLINE ArrayRef createNestedArray() const { + return add().to(); + } + protected: MemoryPool* getPool() const { return _pool; diff --git a/src/ArduinoJson/Array/ArrayShortcuts.hpp b/src/ArduinoJson/Array/ArrayShortcuts.hpp deleted file mode 100644 index 717a20b5..00000000 --- a/src/ArduinoJson/Array/ArrayShortcuts.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -#include -#include - -namespace ARDUINOJSON_NAMESPACE { -// Forward declarations. -class ArrayRef; -class ObjectRef; - -template -class ElementDataSource; - -template -class VariantProxy; - -template -class ArrayShortcuts { - public: - // Returns the element at specified index if the variant is an array. - FORCE_INLINE VariantProxy > operator[]( - size_t index) const; - - FORCE_INLINE ObjectRef createNestedObject() const; - - FORCE_INLINE ArrayRef createNestedArray() const; - - // Adds the specified value at the end of the array. - // - // bool add(TValue); - // TValue = bool, long, int, short, float, double, serialized, VariantRef, - // std::string, String, ObjectRef - template - FORCE_INLINE bool add(const T& value) const { - return impl()->add().set(value); - } - // - // bool add(TValue); - // TValue = char*, const char*, const __FlashStringHelper* - template - FORCE_INLINE bool add(T* value) const { - return impl()->add().set(value); - } - - private: - const TArray* impl() const { - return static_cast(this); - } -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Object/ObjectImpl.hpp b/src/ArduinoJson/Object/ObjectImpl.hpp index 88c27c71..9dd6f533 100644 --- a/src/ArduinoJson/Object/ObjectImpl.hpp +++ b/src/ArduinoJson/Object/ObjectImpl.hpp @@ -9,67 +9,78 @@ namespace ARDUINOJSON_NAMESPACE { -template template -inline ArrayRef ObjectShortcuts::createNestedArray( - const TString& key) const { - return impl()->operator[](key).template to(); +inline ArrayRef ObjectRef::createNestedArray(const TString& key) const { + return operator[](key).template to(); } -template template -inline ArrayRef ObjectShortcuts::createNestedArray(TChar* key) const { - return impl()->operator[](key).template to(); +inline ArrayRef ObjectRef::createNestedArray(TChar* key) const { + return operator[](key).template to(); } -template +template template -inline ObjectRef ObjectShortcuts::createNestedObject( +inline ArrayRef VariantRefBase::createNestedArray( const TString& key) const { - return impl()->operator[](key).template to(); + return operator[](key).template to(); } -template +template template -inline ObjectRef ObjectShortcuts::createNestedObject( +inline ArrayRef VariantRefBase::createNestedArray( TChar* key) const { - return impl()->operator[](key).template to(); + return operator[](key).template to(); } -template +template +template +inline ObjectRef VariantRefBase::createNestedObject( + const TString& key) const { + return operator[](key).template to(); +} + +template +template +inline ObjectRef VariantRefBase::createNestedObject( + TChar* key) const { + return operator[](key).template to(); +} + +template template inline typename enable_if::value, bool>::type -ObjectShortcuts::containsKey(const TString& key) const { - return variantGetMember(VariantAttorney::getData(*impl()), - adaptString(key)) != 0; +VariantRefBase::containsKey(const TString& key) const { + return variantGetMember(VariantAttorney::getData(*this), adaptString(key)) != + 0; } -template +template template inline typename enable_if::value, bool>::type -ObjectShortcuts::containsKey(TChar* key) const { - return variantGetMember(VariantAttorney::getData(*impl()), - adaptString(key)) != 0; +VariantRefBase::containsKey(TChar* key) const { + return variantGetMember(VariantAttorney::getData(*this), adaptString(key)) != + 0; } -template +template template -inline typename enable_if< - IsString::value, - VariantProxy > >::type -ObjectShortcuts::operator[](TString* key) const { - return VariantProxy >( - MemberDataSource(*impl(), key)); +inline typename enable_if::value, + VariantProxy, TString*> > >::type +VariantRefBase::operator[](TString* key) const { + return VariantProxy >( + MemberDataSource(*this, key)); } -template +template template -inline - typename enable_if::value, - VariantProxy > >::type - ObjectShortcuts::operator[](const TString& key) const { - return VariantProxy >( - MemberDataSource(*impl(), key)); +inline typename enable_if::value, + VariantProxy, TString> > >::type +VariantRefBase::operator[](const TString& key) const { + return VariantProxy >( + MemberDataSource(*this, key)); } } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Object/ObjectRef.hpp b/src/ArduinoJson/Object/ObjectRef.hpp index f9c57984..56ff6c23 100644 --- a/src/ArduinoJson/Object/ObjectRef.hpp +++ b/src/ArduinoJson/Object/ObjectRef.hpp @@ -4,6 +4,7 @@ #pragma once +#include #include #include @@ -14,6 +15,8 @@ namespace ARDUINOJSON_NAMESPACE { +class ArrayRef; + template class ObjectRefBase { friend class VariantAttorney; @@ -125,7 +128,6 @@ class ObjectConstRef : public ObjectRefBase, }; class ObjectRef : public ObjectRefBase, - public ObjectShortcuts, public VariantOperators { typedef ObjectRefBase base_type; @@ -173,6 +175,24 @@ class ObjectRef : public ObjectRefBase, return ObjectConstRef(_data) == ObjectConstRef(rhs._data); } + template + FORCE_INLINE typename enable_if< + IsString::value, + VariantProxy > >::type + operator[](const TString& key) const { + return VariantProxy >( + MemberDataSource(*this, key)); + } + + template + FORCE_INLINE typename enable_if< + IsString::value, + VariantProxy > >::type + operator[](TChar* key) const { + return VariantProxy >( + MemberDataSource(*this, key)); + } + FORCE_INLINE void remove(iterator it) const { if (!_data) return; @@ -194,6 +214,34 @@ class ObjectRef : public ObjectRefBase, objectRemove(_data, adaptString(key)); } + template + FORCE_INLINE typename enable_if::value, bool>::type + containsKey(const TString& key) const { + return objectGetMember(_data, adaptString(key)) != 0; + } + + template + FORCE_INLINE typename enable_if::value, bool>::type + containsKey(TChar* key) const { + return objectGetMember(_data, adaptString(key)) != 0; + } + + template + FORCE_INLINE ArrayRef createNestedArray(const TString& key) const; + + template + FORCE_INLINE ArrayRef createNestedArray(TChar* key) const; + + template + ObjectRef createNestedObject(const TString& key) const { + return operator[](key).template to(); + } + + template + ObjectRef createNestedObject(TChar* key) const { + return operator[](key).template to(); + } + protected: MemoryPool* getPool() const { return _pool; diff --git a/src/ArduinoJson/Object/ObjectShortcuts.hpp b/src/ArduinoJson/Object/ObjectShortcuts.hpp deleted file mode 100644 index a19f8030..00000000 --- a/src/ArduinoJson/Object/ObjectShortcuts.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -#include -#include -#include - -namespace ARDUINOJSON_NAMESPACE { -template -class VariantProxy; - -template -class MemberDataSource; - -template -class ObjectShortcuts { - public: - // containsKey(const std::string&) const - // containsKey(const String&) const - template - FORCE_INLINE typename enable_if::value, bool>::type - containsKey(const TString& key) const; - - // containsKey(char*) const - // containsKey(const char*) const - // containsKey(const __FlashStringHelper*) const - template - FORCE_INLINE typename enable_if::value, bool>::type - containsKey(TChar* key) const; - - // operator[](const std::string&) const - // operator[](const String&) const - template - FORCE_INLINE typename enable_if< - IsString::value, - VariantProxy > >::type - operator[](const TString& key) const; - - // operator[](char*) const - // operator[](const char*) const - // operator[](const __FlashStringHelper*) const - template - FORCE_INLINE typename enable_if< - IsString::value, - VariantProxy > >::type - operator[](TChar* key) const; - - // createNestedArray(const std::string&) const - // createNestedArray(const String&) const - template - FORCE_INLINE ArrayRef createNestedArray(const TString& key) const; - - // createNestedArray(char*) const - // createNestedArray(const char*) const - // createNestedArray(const __FlashStringHelper*) const - template - FORCE_INLINE ArrayRef createNestedArray(TChar* key) const; - - // createNestedObject(const std::string&) const - // createNestedObject(const String&) const - template - ObjectRef createNestedObject(const TString& key) const; - - // createNestedObject(char*) const - // createNestedObject(const char*) const - // createNestedObject(const __FlashStringHelper*) const - template - ObjectRef createNestedObject(TChar* key) const; - - private: - const TObject* impl() const { - return static_cast(this); - } -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantConstRef.hpp b/src/ArduinoJson/Variant/VariantConstRef.hpp index 34ec29c7..b6cf3c1c 100644 --- a/src/ArduinoJson/Variant/VariantConstRef.hpp +++ b/src/ArduinoJson/Variant/VariantConstRef.hpp @@ -9,12 +9,12 @@ #include #include +#include #include #include #include #include #include -#include #include namespace ARDUINOJSON_NAMESPACE { @@ -24,8 +24,7 @@ class ArrayRef; class ObjectRef; class VariantConstRef : public VariantTag, - public VariantOperators, - public VariantShortcuts { + public VariantOperators { friend class VariantAttorney; public: @@ -126,6 +125,23 @@ class VariantConstRef : public VariantTag, return VariantConstRef(variantGetMember(_data, adaptString(key))); } + // containsKey(const std::string&) const + // containsKey(const String&) const + template + FORCE_INLINE typename enable_if::value, bool>::type + containsKey(const TString& key) const { + return variantGetMember(getData(), adaptString(key)) != 0; + } + + // containsKey(char*) const + // containsKey(const char*) const + // containsKey(const __FlashStringHelper*) const + template + FORCE_INLINE typename enable_if::value, bool>::type + containsKey(TChar* key) const { + return variantGetMember(getData(), adaptString(key)) != 0; + } + protected: const VariantData* getData() const { return _data; diff --git a/src/ArduinoJson/Variant/VariantRefBase.hpp b/src/ArduinoJson/Variant/VariantRefBase.hpp index 52ed96d5..4515ae82 100644 --- a/src/ArduinoJson/Variant/VariantRefBase.hpp +++ b/src/ArduinoJson/Variant/VariantRefBase.hpp @@ -8,16 +8,23 @@ #include #include #include -#include #include namespace ARDUINOJSON_NAMESPACE { class VariantRef; +template +class ElementDataSource; + +template +class MemberDataSource; + +template +class VariantProxy; + template -class VariantRefBase : public VariantShortcuts >, - public VariantTag { +class VariantRefBase : public VariantTag { friend class VariantAttorney; public: @@ -160,7 +167,17 @@ class VariantRefBase : public VariantShortcuts >, FORCE_INLINE VariantRef add() const; - using ArrayShortcuts >::add; + template + FORCE_INLINE bool add(const T& value) const { + return add().set(value); + } + // + // bool add(TValue); + // TValue = char*, const char*, const __FlashStringHelper* + template + FORCE_INLINE bool add(T* value) const { + return add().set(value); + } FORCE_INLINE void remove(size_t index) const { VariantData* data = getData(); @@ -187,6 +204,43 @@ class VariantRefBase : public VariantShortcuts >, data->remove(adaptString(key)); } + FORCE_INLINE ArrayRef createNestedArray() const; + FORCE_INLINE ObjectRef createNestedObject() const; + FORCE_INLINE VariantProxy > operator[]( + size_t index) const; + + template + FORCE_INLINE typename enable_if::value, bool>::type + containsKey(const TString& key) const; + + template + FORCE_INLINE typename enable_if::value, bool>::type + containsKey(TChar* key) const; + + template + FORCE_INLINE typename enable_if< + IsString::value, + VariantProxy > >::type + operator[](const TString& key) const; + + template + FORCE_INLINE typename enable_if< + IsString::value, + VariantProxy > >::type + operator[](TChar* key) const; + + template + FORCE_INLINE ArrayRef createNestedArray(const TString& key) const; + + template + FORCE_INLINE ArrayRef createNestedArray(TChar* key) const; + + template + ObjectRef createNestedObject(const TString& key) const; + + template + ObjectRef createNestedObject(TChar* key) const; + protected: FORCE_INLINE MemoryPool* getPool() const { return _source.getPool(); diff --git a/src/ArduinoJson/Variant/VariantShortcuts.hpp b/src/ArduinoJson/Variant/VariantShortcuts.hpp deleted file mode 100644 index 3b324832..00000000 --- a/src/ArduinoJson/Variant/VariantShortcuts.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// ArduinoJson - https://arduinojson.org -// Copyright © 2014-2022, Benoit BLANCHON -// MIT License - -#pragma once - -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -template -class VariantShortcuts : public ObjectShortcuts, - public ArrayShortcuts { - public: - using ArrayShortcuts::createNestedArray; - using ArrayShortcuts::createNestedObject; - using ArrayShortcuts::operator[]; - using ObjectShortcuts::createNestedArray; - using ObjectShortcuts::createNestedObject; - using ObjectShortcuts::operator[]; -}; -} // namespace ARDUINOJSON_NAMESPACE