diff --git a/src/ArduinoJson/Object/ObjectRef.hpp b/src/ArduinoJson/Object/ObjectRef.hpp index 8e9b84ad..dee81675 100644 --- a/src/ArduinoJson/Object/ObjectRef.hpp +++ b/src/ArduinoJson/Object/ObjectRef.hpp @@ -11,11 +11,16 @@ namespace ARDUINOJSON_NAMESPACE { class ArrayRef; -template -class ObjectRefBase { +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)); } @@ -40,33 +45,6 @@ class ObjectRefBase { return _data ? _data->size() : 0; } - protected: - const VariantData* getData() const { - return collectionToVariant(_data); - } - - template - inline VariantData* getMember(TAdaptedString key) const { - if (!_data) - return 0; - return _data->getMember(key); - } - - ObjectRefBase(TData* data) : _data(data) {} - TData* _data; -}; - -class ObjectConstRef : public ObjectRefBase, - public VariantOperators { - friend class ObjectRef; - typedef ObjectRefBase base_type; - - public: - typedef ObjectConstIterator iterator; - - ObjectConstRef() : base_type(0) {} - ObjectConstRef(const CollectionData* data) : base_type(data) {} - FORCE_INLINE iterator begin() const { if (!_data) return iterator(); @@ -126,20 +104,31 @@ class ObjectConstRef : public ObjectRefBase, } 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 ObjectRefBase, - public VariantOperators { - typedef ObjectRefBase base_type; - +class ObjectRef : public VariantOperators { friend class VariantAttorney; public: typedef ObjectIterator iterator; - FORCE_INLINE ObjectRef() : base_type(0), _pool(0) {} + FORCE_INLINE ObjectRef() : _data(0), _pool(0) {} FORCE_INLINE ObjectRef(MemoryPool* buf, CollectionData* data) - : base_type(data), _pool(buf) {} + : _data(data), _pool(buf) {} operator VariantRef() const { void* data = _data; // prevent warning cast-align @@ -150,6 +139,30 @@ class ObjectRef : public ObjectRefBase, return ObjectConstRef(_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(); @@ -239,7 +252,7 @@ class ObjectRef : public ObjectRefBase, return operator[](key).template to(); } - protected: + private: MemoryPool* getPool() const { return _pool; } @@ -252,6 +265,13 @@ class ObjectRef : public ObjectRefBase, return collectionToVariant(_data); } + template + inline VariantData* getMember(TAdaptedString key) const { + if (!_data) + return 0; + return _data->getMember(key); + } + template void removeMember(TAdaptedString key) const { if (!_data) @@ -259,7 +279,7 @@ class ObjectRef : public ObjectRefBase, _data->removeMember(key); } - private: + CollectionData* _data; MemoryPool* _pool; };