forked from bblanchon/ArduinoJson
Implement nesting()
out of VariantData
This commit is contained in:
@ -23,8 +23,7 @@ template <typename TData>
|
|||||||
class ArrayRefBase {
|
class ArrayRefBase {
|
||||||
public:
|
public:
|
||||||
operator VariantConstRef() const {
|
operator VariantConstRef() const {
|
||||||
const void* data = _data; // prevent warning cast-align
|
return VariantConstRef(getVariantData());
|
||||||
return VariantConstRef(reinterpret_cast<const VariantData*>(data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TVisitor>
|
template <typename TVisitor>
|
||||||
@ -45,7 +44,7 @@ class ArrayRefBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE size_t nesting() const {
|
FORCE_INLINE size_t nesting() const {
|
||||||
return _data ? _data->nesting() : 0;
|
return variantNesting(getVariantData());
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE size_t size() const {
|
FORCE_INLINE size_t size() const {
|
||||||
@ -53,6 +52,11 @@ class ArrayRefBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
const VariantData* getVariantData() const {
|
||||||
|
const void* data = _data; // prevent warning cast-align
|
||||||
|
return reinterpret_cast<const VariantData*>(data);
|
||||||
|
}
|
||||||
|
|
||||||
ArrayRefBase(TData* data) : _data(data) {}
|
ArrayRefBase(TData* data) : _data(data) {}
|
||||||
TData* _data;
|
TData* _data;
|
||||||
};
|
};
|
||||||
|
@ -64,7 +64,6 @@ class CollectionData {
|
|||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
size_t memoryUsage() const;
|
size_t memoryUsage() const;
|
||||||
size_t nesting() const;
|
|
||||||
size_t size() const;
|
size_t size() const;
|
||||||
|
|
||||||
VariantSlot *addSlot(MemoryPool *);
|
VariantSlot *addSlot(MemoryPool *);
|
||||||
|
@ -203,16 +203,6 @@ inline size_t CollectionData::memoryUsage() const {
|
|||||||
return total;
|
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 {
|
inline size_t CollectionData::size() const {
|
||||||
return slotSize(_head);
|
return slotSize(_head);
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ class JsonDocument : public Visitable,
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t nesting() const {
|
size_t nesting() const {
|
||||||
return _data.nesting();
|
return variantNesting(&_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t capacity() const {
|
size_t capacity() const {
|
||||||
|
@ -18,8 +18,7 @@ template <typename TData>
|
|||||||
class ObjectRefBase {
|
class ObjectRefBase {
|
||||||
public:
|
public:
|
||||||
operator VariantConstRef() const {
|
operator VariantConstRef() const {
|
||||||
const void* data = _data; // prevent warning cast-align
|
return VariantConstRef(getVariantData());
|
||||||
return VariantConstRef(reinterpret_cast<const VariantData*>(data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename TVisitor>
|
template <typename TVisitor>
|
||||||
@ -40,7 +39,7 @@ class ObjectRefBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE size_t nesting() const {
|
FORCE_INLINE size_t nesting() const {
|
||||||
return _data ? _data->nesting() : 0;
|
return variantNesting(getVariantData());
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE size_t size() const {
|
FORCE_INLINE size_t size() const {
|
||||||
@ -48,6 +47,11 @@ class ObjectRefBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
const VariantData* getVariantData() const {
|
||||||
|
const void* data = _data; // prevent warning cast-align
|
||||||
|
return reinterpret_cast<const VariantData*>(data);
|
||||||
|
}
|
||||||
|
|
||||||
ObjectRefBase(TData* data) : _data(data) {}
|
ObjectRefBase(TData* data) : _data(data) {}
|
||||||
TData* _data;
|
TData* _data;
|
||||||
};
|
};
|
||||||
|
@ -91,6 +91,10 @@ class VariantData {
|
|||||||
return const_cast<VariantData *>(this)->asArray();
|
return const_cast<VariantData *>(this)->asArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CollectionData *asCollection() const {
|
||||||
|
return isCollection() ? &_content.asCollection : 0;
|
||||||
|
}
|
||||||
|
|
||||||
CollectionData *asObject() {
|
CollectionData *asObject() {
|
||||||
return isObject() ? &_content.asCollection : 0;
|
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 {
|
size_t size() const {
|
||||||
return isCollection() ? _content.asCollection.size() : 0;
|
return isCollection() ? _content.asCollection.size() : 0;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <ArduinoJson/Polyfills/attributes.hpp>
|
#include <ArduinoJson/Polyfills/attributes.hpp>
|
||||||
#include <ArduinoJson/Strings/StoragePolicy.hpp>
|
#include <ArduinoJson/Strings/StoragePolicy.hpp>
|
||||||
#include <ArduinoJson/Variant/VariantData.hpp>
|
#include <ArduinoJson/Variant/VariantData.hpp>
|
||||||
|
#include <ArduinoJson/Variant/Visitor.hpp>
|
||||||
|
|
||||||
namespace ARDUINOJSON_NAMESPACE {
|
namespace ARDUINOJSON_NAMESPACE {
|
||||||
|
|
||||||
@ -106,4 +107,21 @@ inline bool variantIsNull(const VariantData *var) {
|
|||||||
return var == 0 || var->isNull();
|
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
|
} // namespace ARDUINOJSON_NAMESPACE
|
||||||
|
@ -41,7 +41,7 @@ class VariantRefBase : public VariantTag {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE size_t nesting() const {
|
FORCE_INLINE size_t nesting() const {
|
||||||
return _data ? _data->nesting() : 0;
|
return variantNesting(_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t size() const {
|
size_t size() const {
|
||||||
|
Reference in New Issue
Block a user