From 7bc73d7849e1ad9ab244041f07a398f67d3fcc15 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 26 Jun 2023 10:48:56 +0200 Subject: [PATCH] Extract `ArrayData` from `CollectionData` --- src/ArduinoJson.hpp | 1 + src/ArduinoJson/Array/ArrayData.hpp | 65 +++++++++++++++ src/ArduinoJson/Array/ArrayImpl.hpp | 81 +++++++++++++++++++ src/ArduinoJson/Array/JsonArray.hpp | 13 +-- src/ArduinoJson/Array/JsonArrayConst.hpp | 9 +-- src/ArduinoJson/Collection/CollectionData.hpp | 21 +---- .../Collection/CollectionFunctions.hpp | 28 ------- src/ArduinoJson/Collection/CollectionImpl.hpp | 79 +----------------- src/ArduinoJson/Json/JsonDeserializer.hpp | 4 +- src/ArduinoJson/Json/JsonSerializer.hpp | 2 +- src/ArduinoJson/Json/PrettyJsonSerializer.hpp | 2 +- .../MsgPack/MsgPackDeserializer.hpp | 4 +- src/ArduinoJson/MsgPack/MsgPackSerializer.hpp | 2 +- src/ArduinoJson/Variant/VariantCompare.hpp | 10 +-- src/ArduinoJson/Variant/VariantContent.hpp | 3 + src/ArduinoJson/Variant/VariantData.hpp | 29 +++---- src/ArduinoJson/Variant/Visitor.hpp | 2 +- 17 files changed, 194 insertions(+), 161 deletions(-) create mode 100644 src/ArduinoJson/Array/ArrayData.hpp create mode 100644 src/ArduinoJson/Array/ArrayImpl.hpp diff --git a/src/ArduinoJson.hpp b/src/ArduinoJson.hpp index d9c43478..dd5b1df8 100644 --- a/src/ArduinoJson.hpp +++ b/src/ArduinoJson.hpp @@ -32,6 +32,7 @@ #include "ArduinoJson/Document/JsonDocument.hpp" +#include "ArduinoJson/Array/ArrayImpl.hpp" #include "ArduinoJson/Array/ElementProxy.hpp" #include "ArduinoJson/Array/JsonArrayImpl.hpp" #include "ArduinoJson/Array/Utilities.hpp" diff --git a/src/ArduinoJson/Array/ArrayData.hpp b/src/ArduinoJson/Array/ArrayData.hpp new file mode 100644 index 00000000..62b84ea8 --- /dev/null +++ b/src/ArduinoJson/Array/ArrayData.hpp @@ -0,0 +1,65 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2023, Benoit BLANCHON +// MIT License + +#pragma once + +#include + +ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE + +class ArrayData : public CollectionData { + public: + VariantData* addElement(ResourceManager* resources); + + static VariantData* addElement(ArrayData* array, ResourceManager* resources) { + if (!array) + return nullptr; + return array->addElement(resources); + } + + VariantData* getOrAddElement(size_t index, ResourceManager* resources); + + VariantData* getElement(size_t index) const; + + static VariantData* getElement(const ArrayData* array, size_t index) { + if (!array) + return nullptr; + return array->getElement(index); + } + + void removeElement(size_t index, ResourceManager* resources); + + static void removeElement(ArrayData* array, size_t index, + ResourceManager* resources) { + if (!array) + return; + array->removeElement(index, resources); + } + + bool equals(const ArrayData&) const; + + static bool equals(const ArrayData* lhs, const ArrayData* rhs) { + if (lhs == rhs) + return true; + if (!lhs || !rhs) + return false; + + return lhs->equals(*rhs); + } + + bool copyFrom(const ArrayData& src, ResourceManager* resources); + + static bool copy(ArrayData* dst, const ArrayData* src, + ResourceManager* resources) { + if (!dst || !src) + return false; + + return dst->copyFrom(*src, resources); + } + + private: + VariantSlot* getSlot(size_t index) const; +}; + +ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Array/ArrayImpl.hpp b/src/ArduinoJson/Array/ArrayImpl.hpp new file mode 100644 index 00000000..595a2915 --- /dev/null +++ b/src/ArduinoJson/Array/ArrayImpl.hpp @@ -0,0 +1,81 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2023, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include + +ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE + +inline VariantData* ArrayData::addElement(ResourceManager* resources) { + auto slot = resources->allocVariant(); + if (!slot) + return nullptr; + addSlot(slot); + return slot->data(); +} + +inline bool ArrayData::copyFrom(const ArrayData& src, + ResourceManager* resources) { + clear(resources); + + for (VariantSlot* s = src.head(); s; s = s->next()) { + auto var = addElement(resources); + if (!variantCopyFrom(var, s->data(), resources)) + return false; + } + return true; +} + +inline bool ArrayData::equals(const ArrayData& other) const { + auto a = head(); + auto b = other.head(); + + for (;;) { + if (!a && !b) // both ended + return true; + if (!a || !b) // one ended + return false; + if (compare(a->data(), b->data()) != COMPARE_RESULT_EQUAL) + return false; + a = a->next(); + b = b->next(); + } +} + +inline VariantData* ArrayData::getOrAddElement(size_t index, + ResourceManager* resources) { + VariantSlot* slot = head(); + while (slot && index > 0) { + slot = slot->next(); + index--; + } + if (!slot) + index++; + while (index > 0) { + slot = resources->allocVariant(); + if (!slot) + return nullptr; + addSlot(slot); + index--; + } + return slot->data(); +} + +inline VariantData* ArrayData::getElement(size_t index) const { + return slotData(getSlot(index)); +} + +inline VariantSlot* ArrayData::getSlot(size_t index) const { + if (!head()) + return 0; + return head()->next(index); +} + +inline void ArrayData::removeElement(size_t index, ResourceManager* resources) { + removeSlot(getSlot(index), resources); +} + +ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Array/JsonArray.hpp b/src/ArduinoJson/Array/JsonArray.hpp index 6a9b9b0c..6e7fe461 100644 --- a/src/ArduinoJson/Array/JsonArray.hpp +++ b/src/ArduinoJson/Array/JsonArray.hpp @@ -24,7 +24,7 @@ class JsonArray : public detail::VariantOperators { FORCE_INLINE JsonArray() : data_(0), resources_(0) {} // INTERNAL USE ONLY - FORCE_INLINE JsonArray(detail::CollectionData* data, + FORCE_INLINE JsonArray(detail::ArrayData* data, detail::ResourceManager* resources) : data_(data), resources_(resources) {} @@ -46,7 +46,8 @@ class JsonArray : public detail::VariantOperators { // Returns a reference to the new element. // https://arduinojson.org/v6/api/jsonarray/add/ JsonVariant add() const { - return JsonVariant(collectionAddElement(data_, resources_), resources_); + return JsonVariant(detail::ArrayData::addElement(data_, resources_), + resources_); } // Appends a value to the array. @@ -80,12 +81,12 @@ class JsonArray : public detail::VariantOperators { // Copies an array. // https://arduinojson.org/v6/api/jsonarray/set/ FORCE_INLINE bool set(JsonArrayConst src) const { - return collectionCopy(data_, src.data_, resources_); + return detail::ArrayData::copy(data_, src.data_, resources_); } // Compares the content of two arrays. FORCE_INLINE bool operator==(JsonArray rhs) const { - return arrayEquals(data_, rhs.data_); + return detail::ArrayData::equals(data_, rhs.data_); } // Removes the element at the specified iterator. @@ -99,7 +100,7 @@ class JsonArray : public detail::VariantOperators { // ⚠️ Doesn't release the memory associated with the removed element. // https://arduinojson.org/v6/api/jsonarray/remove/ FORCE_INLINE void remove(size_t index) const { - collectionRemoveElement(data_, index, resources_); + detail::ArrayData::removeElement(data_, index, resources_); } // Removes all the elements of the array. @@ -172,7 +173,7 @@ class JsonArray : public detail::VariantOperators { return collectionToVariant(data_); } - detail::CollectionData* data_; + detail::ArrayData* data_; detail::ResourceManager* resources_; }; diff --git a/src/ArduinoJson/Array/JsonArrayConst.hpp b/src/ArduinoJson/Array/JsonArrayConst.hpp index ecce75fc..8d820b26 100644 --- a/src/ArduinoJson/Array/JsonArrayConst.hpp +++ b/src/ArduinoJson/Array/JsonArrayConst.hpp @@ -40,19 +40,18 @@ class JsonArrayConst : public detail::VariantOperators { FORCE_INLINE JsonArrayConst() : data_(0) {} // INTERNAL USE ONLY - FORCE_INLINE JsonArrayConst(const detail::CollectionData* data) - : data_(data) {} + FORCE_INLINE JsonArrayConst(const detail::ArrayData* data) : data_(data) {} // Compares the content of two arrays. // Returns true if the two arrays are equal. FORCE_INLINE bool operator==(JsonArrayConst rhs) const { - return arrayEquals(data_, rhs.data_); + return detail::ArrayData::equals(data_, rhs.data_); } // Returns the element at the specified index. // https://arduinojson.org/v6/api/jsonarrayconst/subscript/ FORCE_INLINE JsonVariantConst operator[](size_t index) const { - return JsonVariantConst(collectionGetElement(data_, index)); + return JsonVariantConst(detail::ArrayData::getElement(data_, index)); } operator JsonVariantConst() const { @@ -94,7 +93,7 @@ class JsonArrayConst : public detail::VariantOperators { return collectionToVariant(data_); } - const detail::CollectionData* data_; + const detail::ArrayData* data_; }; template <> diff --git a/src/ArduinoJson/Collection/CollectionData.hpp b/src/ArduinoJson/Collection/CollectionData.hpp index 141e2bd2..264c0a66 100644 --- a/src/ArduinoJson/Collection/CollectionData.hpp +++ b/src/ArduinoJson/Collection/CollectionData.hpp @@ -29,8 +29,6 @@ class CollectionData { size_t memoryUsage() const; size_t size() const; - VariantData* addElement(ResourceManager* resources); - VariantData* addMember(StringNode* key, ResourceManager* resources); template @@ -39,10 +37,6 @@ class CollectionData { void clear(ResourceManager* resources); bool copyFrom(const CollectionData& src, ResourceManager* resources); - VariantData* getOrAddElement(size_t index, ResourceManager* resources); - - VariantData* getElement(size_t index) const; - template VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources); @@ -51,8 +45,6 @@ class CollectionData { void removeSlot(VariantSlot* slot, ResourceManager* resources); - void removeElement(size_t index, ResourceManager* resources); - template void removeMember(TAdaptedString key, ResourceManager* resources); @@ -62,15 +54,14 @@ class CollectionData { void movePointers(ptrdiff_t variantDistance); - private: + protected: void addSlot(VariantSlot*); - VariantSlot* getPreviousSlot(VariantSlot*) const; - - VariantSlot* getSlot(size_t index) const; - template VariantSlot* getSlot(TAdaptedString key) const; + + private: + VariantSlot* getPreviousSlot(VariantSlot*) const; }; inline const VariantData* collectionToVariant( @@ -84,10 +75,6 @@ inline VariantData* collectionToVariant(CollectionData* collection) { return reinterpret_cast(data); } -bool arrayEquals(const detail::CollectionData& lhs, - const detail::CollectionData& rhs); -bool arrayEquals(const detail::CollectionData* lhs, - const detail::CollectionData* rhs); bool objectEquals(const detail::CollectionData& lhs, const detail::CollectionData& rhs); bool objectEquals(const detail::CollectionData* lhs, diff --git a/src/ArduinoJson/Collection/CollectionFunctions.hpp b/src/ArduinoJson/Collection/CollectionFunctions.hpp index 80db6bb0..44387373 100644 --- a/src/ArduinoJson/Collection/CollectionFunctions.hpp +++ b/src/ArduinoJson/Collection/CollectionFunctions.hpp @@ -8,20 +8,6 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -inline VariantData* collectionAddElement(CollectionData* array, - ResourceManager* resources) { - if (!array) - return nullptr; - return array->addElement(resources); -} - -template -inline VariantData* collectionAddMember(CollectionData* obj, TAdaptedString key, - ResourceManager* resources) { - ARDUINOJSON_ASSERT(obj != nullptr); - return obj->addMember(key, resources); -} - inline void collectionClear(CollectionData* c, ResourceManager* resources) { if (!c) return; @@ -36,13 +22,6 @@ inline bool collectionCopy(CollectionData* dst, const CollectionData* src, return dst->copyFrom(*src, resources); } -inline VariantData* collectionGetElement(const CollectionData* obj, - size_t index) { - if (!obj) - return nullptr; - return obj->getElement(index); -} - template inline VariantData* collectionGetMember(const CollectionData* obj, TAdaptedString key) { @@ -58,13 +37,6 @@ inline void collectionRemove(CollectionData* data, VariantSlot* slot, data->removeSlot(slot, resources); } -inline void collectionRemoveElement(CollectionData* array, size_t index, - ResourceManager* resources) { - if (!array) - return; - array->removeElement(index, resources); -} - template inline void collectionRemoveMember(CollectionData* obj, TAdaptedString key, ResourceManager* resources) { diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index 42097ffb..32091a3a 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -23,14 +23,6 @@ inline void CollectionData::addSlot(VariantSlot* slot) { } } -inline VariantData* CollectionData::addElement(ResourceManager* resources) { - auto slot = resources->allocVariant(); - if (!slot) - return nullptr; - addSlot(slot); - return slot->data(); -} - inline VariantData* CollectionData::addMember(StringNode* key, ResourceManager* resources) { ARDUINOJSON_ASSERT(key != nullptr); @@ -67,25 +59,6 @@ inline VariantData* CollectionData::getMember(TAdaptedString key) const { return slotData(getSlot(key)); } -inline VariantData* CollectionData::getOrAddElement( - size_t index, ResourceManager* resources) { - VariantSlot* slot = head_; - while (slot && index > 0) { - slot = slot->next(); - index--; - } - if (!slot) - index++; - while (index > 0) { - slot = resources->allocVariant(); - if (!slot) - return nullptr; - addSlot(slot); - index--; - } - return slot->data(); -} - template VariantData* CollectionData::getOrAddMember(TAdaptedString key, ResourceManager* resources) { @@ -95,10 +68,6 @@ VariantData* CollectionData::getOrAddMember(TAdaptedString key, return addMember(key, resources); } -inline VariantData* CollectionData::getElement(size_t index) const { - return slotData(getSlot(index)); -} - inline void CollectionData::clear(ResourceManager* resources) { for (auto slot = head_; slot; slot = slot->next()) slotRelease(slot, resources); @@ -111,14 +80,10 @@ inline bool CollectionData::copyFrom(const CollectionData& src, clear(resources); for (VariantSlot* s = src.head(); s; s = s->next()) { - VariantData* var; - if (s->key() != 0) { - JsonString key(s->key(), - s->ownsKey() ? JsonString::Copied : JsonString::Linked); - var = addMember(adaptString(key), resources); - } else { - var = addElement(resources); - } + ARDUINOJSON_ASSERT(s->key() != 0); + JsonString key(s->key(), + s->ownsKey() ? JsonString::Copied : JsonString::Linked); + auto var = addMember(adaptString(key), resources); if (!variantCopyFrom(var, s->data(), resources)) return false; } @@ -138,12 +103,6 @@ inline VariantSlot* CollectionData::getSlot(TAdaptedString key) const { return slot; } -inline VariantSlot* CollectionData::getSlot(size_t index) const { - if (!head_) - return 0; - return head_->next(index); -} - inline VariantSlot* CollectionData::getPreviousSlot(VariantSlot* target) const { VariantSlot* current = head_; while (current) { @@ -170,11 +129,6 @@ inline void CollectionData::removeSlot(VariantSlot* slot, slotRelease(slot, resources); } -inline void CollectionData::removeElement(size_t index, - ResourceManager* resources) { - removeSlot(getSlot(index), resources); -} - template inline void CollectionData::removeMember(TAdaptedString key, ResourceManager* resources) { @@ -211,31 +165,6 @@ inline void CollectionData::movePointers(ptrdiff_t variantDistance) { slot->data()->movePointers(variantDistance); } -inline bool arrayEquals(const CollectionData& lhs, const CollectionData& rhs) { - auto a = lhs.head(); - auto b = rhs.head(); - - for (;;) { - if (!a && !b) // both ended - return true; - if (!a || !b) // one ended - return false; - if (compare(a->data(), b->data()) != COMPARE_RESULT_EQUAL) - return false; - a = a->next(); - b = b->next(); - } -} - -inline bool arrayEquals(const CollectionData* lhs, const CollectionData* rhs) { - if (lhs == rhs) - return true; - if (!lhs || !rhs) - return false; - - return arrayEquals(*lhs, *rhs); -} - inline bool objectEquals(const CollectionData& lhs, const CollectionData& rhs) { size_t count = 0; for (auto a = lhs.head(); a; a = a->next()) { diff --git a/src/ArduinoJson/Json/JsonDeserializer.hpp b/src/ArduinoJson/Json/JsonDeserializer.hpp index 962e2536..e5480a34 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -146,7 +146,7 @@ class JsonDeserializer { template DeserializationError::Code parseArray( - CollectionData& array, TFilter filter, + ArrayData& array, TFilter filter, DeserializationOption::NestingLimit nestingLimit) { DeserializationError::Code err; @@ -172,7 +172,7 @@ class JsonDeserializer { for (;;) { if (elementFilter.allow()) { // Allocate slot in array - VariantData* value = collectionAddElement(&array, resources_); + VariantData* value = array.addElement(resources_); if (!value) return DeserializationError::NoMemory; diff --git a/src/ArduinoJson/Json/JsonSerializer.hpp b/src/ArduinoJson/Json/JsonSerializer.hpp index bbd5ec54..459cf488 100644 --- a/src/ArduinoJson/Json/JsonSerializer.hpp +++ b/src/ArduinoJson/Json/JsonSerializer.hpp @@ -18,7 +18,7 @@ class JsonSerializer : public Visitor { JsonSerializer(TWriter writer) : formatter_(writer) {} - FORCE_INLINE size_t visitArray(const CollectionData& array) { + FORCE_INLINE size_t visitArray(const ArrayData& array) { write('['); const VariantSlot* slot = array.head(); diff --git a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp index e8a92064..66058fdd 100644 --- a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp +++ b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp @@ -18,7 +18,7 @@ class PrettyJsonSerializer : public JsonSerializer { public: PrettyJsonSerializer(TWriter writer) : base(writer), nesting_(0) {} - size_t visitArray(const CollectionData& array) { + size_t visitArray(const ArrayData& array) { const VariantSlot* slot = array.head(); if (slot) { base::write("[\r\n"); diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index a152dcad..ca2b5934 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -419,7 +419,7 @@ class MsgPackDeserializer { bool allowArray = filter.allowArray(); - CollectionData* array; + ArrayData* array; if (allowArray) { ARDUINOJSON_ASSERT(variant != 0); array = &variant->toArray(); @@ -434,7 +434,7 @@ class MsgPackDeserializer { if (elementFilter.allow()) { ARDUINOJSON_ASSERT(array != 0); - value = collectionAddElement(array, resources_); + value = array->addElement(resources_); if (!value) return DeserializationError::NoMemory; } else { diff --git a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp index f19f626c..83b4ec67 100644 --- a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp @@ -44,7 +44,7 @@ class MsgPackSerializer : public Visitor { return bytesWritten(); } - size_t visitArray(const CollectionData& array) { + size_t visitArray(const ArrayData& array) { size_t n = array.size(); if (n < 0x10) { writeByte(uint8_t(0x90 + array.size())); diff --git a/src/ArduinoJson/Variant/VariantCompare.hpp b/src/ArduinoJson/Variant/VariantCompare.hpp index 7911e48a..a635d5c6 100644 --- a/src/ArduinoJson/Variant/VariantCompare.hpp +++ b/src/ArduinoJson/Variant/VariantCompare.hpp @@ -79,12 +79,12 @@ struct Comparer : NullComparer { }; struct ArrayComparer : ComparerBase { - const CollectionData* rhs_; + const ArrayData* rhs_; - explicit ArrayComparer(const CollectionData& rhs) : rhs_(&rhs) {} + explicit ArrayComparer(const ArrayData& rhs) : rhs_(&rhs) {} - CompareResult visitArray(const CollectionData& lhs) { - if (arrayEquals(lhs, *rhs_)) + CompareResult visitArray(const ArrayData& lhs) { + if (rhs_->equals(lhs)) return COMPARE_RESULT_EQUAL; else return COMPARE_RESULT_DIFFER; @@ -128,7 +128,7 @@ struct VariantComparer : ComparerBase { explicit VariantComparer(const VariantData* value) : rhs(value) {} - CompareResult visitArray(const CollectionData& lhs) { + CompareResult visitArray(const ArrayData& lhs) { ArrayComparer comparer(lhs); return accept(comparer); } diff --git a/src/ArduinoJson/Variant/VariantContent.hpp b/src/ArduinoJson/Variant/VariantContent.hpp index ab0c68fd..80976a41 100644 --- a/src/ArduinoJson/Variant/VariantContent.hpp +++ b/src/ArduinoJson/Variant/VariantContent.hpp @@ -6,10 +6,12 @@ #include // size_t +#include #include #include #include + ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE enum { @@ -45,6 +47,7 @@ union VariantContent { JsonUInt asUnsignedInteger; JsonInteger asSignedInteger; CollectionData asCollection; + ArrayData asArray; const char* asLinkedString; struct StringNode* asOwnedString; }; diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 1c0705a4..33259bf5 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -14,12 +14,8 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -VariantData* collectionAddElement(CollectionData* array, - ResourceManager* resources); bool collectionCopy(CollectionData* dst, const CollectionData* src, ResourceManager* resources); -void collectionRemoveElement(CollectionData* data, size_t index, - ResourceManager* resources); template T parseNumber(const char* s); void slotRelease(VariantSlot* slot, ResourceManager* resources); @@ -38,7 +34,7 @@ class VariantData { return visitor.visitFloat(content_.asFloat); case VALUE_IS_ARRAY: - return visitor.visitArray(content_.asCollection); + return visitor.visitArray(content_.asArray); case VALUE_IS_OBJECT: return visitor.visitObject(content_.asCollection); @@ -71,7 +67,7 @@ class VariantData { VariantData* addElement(ResourceManager* resources) { auto array = isNull() ? &toArray() : asArray(); - return collectionAddElement(array, resources); + return detail::ArrayData::addElement(array, resources); } bool asBoolean() const { @@ -90,11 +86,11 @@ class VariantData { } } - CollectionData* asArray() { - return isArray() ? &content_.asCollection : 0; + ArrayData* asArray() { + return isArray() ? &content_.asArray : 0; } - const CollectionData* asArray() const { + const ArrayData* asArray() const { return const_cast(this)->asArray(); } @@ -181,7 +177,7 @@ class VariantData { } switch (src->type()) { case VALUE_IS_ARRAY: - return collectionCopy(&toArray(), src->asArray(), resources); + return toArray().copyFrom(*src->asArray(), resources); case VALUE_IS_OBJECT: return collectionCopy(&toObject(), src->asObject(), resources); case VALUE_IS_OWNED_STRING: { @@ -319,7 +315,7 @@ class VariantData { } void removeElement(size_t index, ResourceManager* resources) { - collectionRemoveElement(asArray(), index, resources); + ArrayData::removeElement(asArray(), index, resources); } template @@ -427,13 +423,13 @@ class VariantData { return isCollection() ? content_.asCollection.size() : 0; } - CollectionData& toArray() { + ArrayData& toArray() { setType(VALUE_IS_ARRAY); - new (&content_.asCollection) CollectionData(); - return content_.asCollection; + new (&content_.asArray) ArrayData(); + return content_.asArray; } - CollectionData& toArray(ResourceManager* resources) { + ArrayData& toArray(ResourceManager* resources) { release(resources); return toArray(); } @@ -594,8 +590,7 @@ inline size_t variantSize(const VariantData* var) { return var != 0 ? var->size() : 0; } -inline CollectionData* variantToArray(VariantData* var, - ResourceManager* resources) { +inline ArrayData* variantToArray(VariantData* var, ResourceManager* resources) { if (!var) return 0; return &var->toArray(resources); diff --git a/src/ArduinoJson/Variant/Visitor.hpp b/src/ArduinoJson/Variant/Visitor.hpp index bdc2a6b0..424062d5 100644 --- a/src/ArduinoJson/Variant/Visitor.hpp +++ b/src/ArduinoJson/Variant/Visitor.hpp @@ -14,7 +14,7 @@ template struct Visitor { typedef TResult result_type; - TResult visitArray(const CollectionData&) { + TResult visitArray(const ArrayData&) { return TResult(); }