From 584770dc6fa04c3a9b14af3f8991d54d5e556c3f Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Tue, 29 Nov 2022 15:29:36 +0100 Subject: [PATCH] Inline class `ArrayRefBase` --- src/ArduinoJson/Array/ArrayRef.hpp | 115 ++++++++++++++++------------- 1 file changed, 64 insertions(+), 51 deletions(-) diff --git a/src/ArduinoJson/Array/ArrayRef.hpp b/src/ArduinoJson/Array/ArrayRef.hpp index 5cf5857a..a6831ec0 100644 --- a/src/ArduinoJson/Array/ArrayRef.hpp +++ b/src/ArduinoJson/Array/ArrayRef.hpp @@ -13,48 +13,9 @@ namespace ARDUINOJSON_NAMESPACE { class ObjectRef; -template -class ArrayRefBase { - friend class VariantAttorney; - - public: - 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; - } - - protected: - const VariantData* getData() const { - return collectionToVariant(_data); - } - - ArrayRefBase(TData* data) : _data(data) {} - TData* _data; -}; - -class ArrayConstRef : public ArrayRefBase, - public VariantOperators { +class ArrayConstRef : public VariantOperators { friend class ArrayRef; - typedef ArrayRefBase base_type; + friend class VariantAttorney; public: typedef ArrayConstRefIterator iterator; @@ -69,8 +30,8 @@ class ArrayConstRef : public ArrayRefBase, return iterator(); } - FORCE_INLINE ArrayConstRef() : base_type(0) {} - FORCE_INLINE ArrayConstRef(const CollectionData* data) : base_type(data) {} + FORCE_INLINE ArrayConstRef() : _data(0) {} + FORCE_INLINE ArrayConstRef(const CollectionData* data) : _data(data) {} FORCE_INLINE bool operator==(ArrayConstRef rhs) const { if (_data == rhs._data) @@ -98,20 +59,48 @@ class ArrayConstRef : public ArrayRefBase, FORCE_INLINE VariantConstRef operator[](size_t index) const { return VariantConstRef(_data ? _data->getElement(index) : 0); } + + 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; + } + + private: + const VariantData* getData() const { + return collectionToVariant(_data); + } + + const CollectionData* _data; }; -class ArrayRef : public ArrayRefBase, - public VariantOperators { - typedef ArrayRefBase base_type; - +class ArrayRef : public VariantOperators { friend class VariantAttorney; public: typedef ArrayIterator iterator; - FORCE_INLINE ArrayRef() : base_type(0), _pool(0) {} + FORCE_INLINE ArrayRef() : _data(0), _pool(0) {} FORCE_INLINE ArrayRef(MemoryPool* pool, CollectionData* data) - : base_type(data), _pool(pool) {} + : _data(data), _pool(pool) {} operator VariantRef() { void* data = _data; // prevent warning cast-align @@ -190,7 +179,31 @@ class ArrayRef : public ArrayRefBase, return add().to(); } - protected: + 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; + } + + private: MemoryPool* getPool() const { return _pool; } @@ -203,7 +216,7 @@ class ArrayRef : public ArrayRefBase, return collectionToVariant(_data); } - private: + CollectionData* _data; MemoryPool* _pool; };