diff --git a/src/ArduinoJson/Array/ArrayRef.hpp b/src/ArduinoJson/Array/ArrayRef.hpp index a5df7abc..2c1d6ec6 100644 --- a/src/ArduinoJson/Array/ArrayRef.hpp +++ b/src/ArduinoJson/Array/ArrayRef.hpp @@ -23,8 +23,7 @@ template class ArrayRefBase { public: operator VariantConstRef() const { - const void* data = _data; // prevent warning cast-align - return VariantConstRef(reinterpret_cast(data)); + return VariantConstRef(getVariantData()); } template @@ -45,7 +44,7 @@ class ArrayRefBase { } FORCE_INLINE size_t nesting() const { - return _data ? _data->nesting() : 0; + return variantNesting(getVariantData()); } FORCE_INLINE size_t size() const { @@ -53,6 +52,11 @@ class ArrayRefBase { } protected: + const VariantData* getVariantData() const { + const void* data = _data; // prevent warning cast-align + return reinterpret_cast(data); + } + ArrayRefBase(TData* data) : _data(data) {} TData* _data; }; diff --git a/src/ArduinoJson/Collection/CollectionData.hpp b/src/ArduinoJson/Collection/CollectionData.hpp index 74b60546..36ffbf72 100644 --- a/src/ArduinoJson/Collection/CollectionData.hpp +++ b/src/ArduinoJson/Collection/CollectionData.hpp @@ -64,7 +64,6 @@ class CollectionData { void clear(); size_t memoryUsage() const; - size_t nesting() const; size_t size() const; VariantSlot *addSlot(MemoryPool *); diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index 35678eeb..a82917d7 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -203,16 +203,6 @@ inline size_t CollectionData::memoryUsage() const { return total; } -inline size_t CollectionData::nesting() const { - size_t maxChildNesting = 0; - for (VariantSlot* s = _head; s; s = s->next()) { - size_t childNesting = s->data()->nesting(); - if (childNesting > maxChildNesting) - maxChildNesting = childNesting; - } - return maxChildNesting + 1; -} - inline size_t CollectionData::size() const { return slotSize(_head); } diff --git a/src/ArduinoJson/Document/JsonDocument.hpp b/src/ArduinoJson/Document/JsonDocument.hpp index 274cce71..d9c4eb5b 100644 --- a/src/ArduinoJson/Document/JsonDocument.hpp +++ b/src/ArduinoJson/Document/JsonDocument.hpp @@ -60,7 +60,7 @@ class JsonDocument : public Visitable, } size_t nesting() const { - return _data.nesting(); + return variantNesting(&_data); } size_t capacity() const { diff --git a/src/ArduinoJson/Object/ObjectRef.hpp b/src/ArduinoJson/Object/ObjectRef.hpp index 6cf9c14d..ba7ce89a 100644 --- a/src/ArduinoJson/Object/ObjectRef.hpp +++ b/src/ArduinoJson/Object/ObjectRef.hpp @@ -18,8 +18,7 @@ template class ObjectRefBase { public: operator VariantConstRef() const { - const void* data = _data; // prevent warning cast-align - return VariantConstRef(reinterpret_cast(data)); + return VariantConstRef(getVariantData()); } template @@ -40,7 +39,7 @@ class ObjectRefBase { } FORCE_INLINE size_t nesting() const { - return _data ? _data->nesting() : 0; + return variantNesting(getVariantData()); } FORCE_INLINE size_t size() const { @@ -48,6 +47,11 @@ class ObjectRefBase { } protected: + const VariantData* getVariantData() const { + const void* data = _data; // prevent warning cast-align + return reinterpret_cast(data); + } + ObjectRefBase(TData* data) : _data(data) {} TData* _data; }; diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 27128706..162eab0c 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -91,6 +91,10 @@ class VariantData { return const_cast(this)->asArray(); } + const CollectionData *asCollection() const { + return isCollection() ? &_content.asCollection : 0; + } + CollectionData *asObject() { return isObject() ? &_content.asCollection : 0; } @@ -245,10 +249,6 @@ class VariantData { } } - size_t nesting() const { - return isCollection() ? _content.asCollection.nesting() : 0; - } - size_t size() const { return isCollection() ? _content.asCollection.size() : 0; } diff --git a/src/ArduinoJson/Variant/VariantFunctions.hpp b/src/ArduinoJson/Variant/VariantFunctions.hpp index 8890597e..e2820ce0 100644 --- a/src/ArduinoJson/Variant/VariantFunctions.hpp +++ b/src/ArduinoJson/Variant/VariantFunctions.hpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace ARDUINOJSON_NAMESPACE { @@ -106,4 +107,21 @@ inline bool variantIsNull(const VariantData *var) { return var == 0 || var->isNull(); } +inline size_t variantNesting(const VariantData *var) { + if (!var) + return 0; + + const CollectionData *collection = var->asCollection(); + if (!collection) + return 0; + + size_t maxChildNesting = 0; + for (const VariantSlot *s = collection->head(); s; s = s->next()) { + size_t childNesting = variantNesting(s->data()); + if (childNesting > maxChildNesting) + maxChildNesting = childNesting; + } + return maxChildNesting + 1; +} + } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantRef.hpp b/src/ArduinoJson/Variant/VariantRef.hpp index 31fd0219..e26ec2d5 100644 --- a/src/ArduinoJson/Variant/VariantRef.hpp +++ b/src/ArduinoJson/Variant/VariantRef.hpp @@ -41,7 +41,7 @@ class VariantRefBase : public VariantTag { } FORCE_INLINE size_t nesting() const { - return _data ? _data->nesting() : 0; + return variantNesting(_data); } size_t size() const {