forked from bblanchon/ArduinoJson
Implement nesting()
out of VariantData
This commit is contained in:
@ -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;
|
||||
};
|
||||
|
@ -64,7 +64,6 @@ class CollectionData {
|
||||
|
||||
void clear();
|
||||
size_t memoryUsage() const;
|
||||
size_t nesting() const;
|
||||
size_t size() const;
|
||||
|
||||
VariantSlot *addSlot(MemoryPool *);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ class JsonDocument : public Visitable,
|
||||
}
|
||||
|
||||
size_t nesting() const {
|
||||
return _data.nesting();
|
||||
return variantNesting(&_data);
|
||||
}
|
||||
|
||||
size_t capacity() const {
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
Reference in New Issue
Block a user