Implement nesting() out of VariantData

This commit is contained in:
Benoit Blanchon
2022-03-29 13:03:07 +02:00
parent ccfbb5fd1d
commit fc9d8aa31e
8 changed files with 38 additions and 23 deletions

View File

@ -23,8 +23,7 @@ template <typename TData>
class ArrayRefBase {
public:
operator VariantConstRef() const {
const void* data = _data; // prevent warning cast-align
return VariantConstRef(reinterpret_cast<const VariantData*>(data));
return VariantConstRef(getVariantData());
}
template <typename TVisitor>
@ -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<const VariantData*>(data);
}
ArrayRefBase(TData* data) : _data(data) {}
TData* _data;
};

View File

@ -64,7 +64,6 @@ class CollectionData {
void clear();
size_t memoryUsage() const;
size_t nesting() const;
size_t size() const;
VariantSlot *addSlot(MemoryPool *);

View File

@ -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);
}

View File

@ -60,7 +60,7 @@ class JsonDocument : public Visitable,
}
size_t nesting() const {
return _data.nesting();
return variantNesting(&_data);
}
size_t capacity() const {

View File

@ -18,8 +18,7 @@ template <typename TData>
class ObjectRefBase {
public:
operator VariantConstRef() const {
const void* data = _data; // prevent warning cast-align
return VariantConstRef(reinterpret_cast<const VariantData*>(data));
return VariantConstRef(getVariantData());
}
template <typename TVisitor>
@ -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<const VariantData*>(data);
}
ObjectRefBase(TData* data) : _data(data) {}
TData* _data;
};

View File

@ -91,6 +91,10 @@ class VariantData {
return const_cast<VariantData *>(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;
}

View File

@ -7,6 +7,7 @@
#include <ArduinoJson/Polyfills/attributes.hpp>
#include <ArduinoJson/Strings/StoragePolicy.hpp>
#include <ArduinoJson/Variant/VariantData.hpp>
#include <ArduinoJson/Variant/Visitor.hpp>
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

View File

@ -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 {