diff --git a/src/ArduinoJson/Object/ObjectConstRef.hpp b/src/ArduinoJson/Object/ObjectConstRef.hpp new file mode 100644 index 00000000..fc62d9b1 --- /dev/null +++ b/src/ArduinoJson/Object/ObjectConstRef.hpp @@ -0,0 +1,138 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2022, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include + +namespace ARDUINOJSON_NAMESPACE { + +class ObjectConstRef : public VariantOperators { + 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 + 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 + FORCE_INLINE bool containsKey(TChar* key) const { + return getMember(adaptString(key)) != 0; + } + + // operator[](const std::string&) const + // operator[](const String&) const + template + FORCE_INLINE + typename enable_if::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 + FORCE_INLINE + typename enable_if::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 + const VariantData* getMember(TAdaptedString key) const { + if (!_data) + return 0; + return _data->getMember(key); + } + + const CollectionData* _data; +}; + +template <> +struct Converter : 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 diff --git a/src/ArduinoJson/Object/ObjectRef.hpp b/src/ArduinoJson/Object/ObjectRef.hpp index dee81675..469316dd 100644 --- a/src/ArduinoJson/Object/ObjectRef.hpp +++ b/src/ArduinoJson/Object/ObjectRef.hpp @@ -5,121 +5,12 @@ #pragma once #include -#include +#include namespace ARDUINOJSON_NAMESPACE { class ArrayRef; -class ObjectConstRef : public VariantOperators { - 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 - 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 - FORCE_INLINE bool containsKey(TChar* key) const { - return getMember(adaptString(key)) != 0; - } - - // operator[](const std::string&) const - // operator[](const String&) const - template - FORCE_INLINE - typename enable_if::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 - FORCE_INLINE - typename enable_if::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 - const VariantData* getMember(TAdaptedString key) const { - if (!_data) - return 0; - return _data->getMember(key); - } - - const CollectionData* _data; -}; - class ObjectRef : public VariantOperators { friend class VariantAttorney; @@ -283,23 +174,6 @@ class ObjectRef : public VariantOperators { MemoryPool* _pool; }; -template <> -struct Converter : 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 <> struct Converter : private VariantAttorney { static void toJson(VariantConstRef src, VariantRef dst) {