From 68b1602c35a13cfb75b6d3b58b753c02321757be Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 26 Jun 2023 11:42:25 +0200 Subject: [PATCH] Extract `ObjectData` from `CollectionData` --- src/ArduinoJson.hpp | 1 + src/ArduinoJson/Collection/CollectionData.hpp | 23 ---- .../Collection/CollectionFunctions.hpp | 24 ---- src/ArduinoJson/Collection/CollectionImpl.hpp | 102 ----------------- src/ArduinoJson/Json/JsonDeserializer.hpp | 2 +- src/ArduinoJson/Json/JsonSerializer.hpp | 2 +- src/ArduinoJson/Json/PrettyJsonSerializer.hpp | 2 +- .../MsgPack/MsgPackDeserializer.hpp | 2 +- src/ArduinoJson/MsgPack/MsgPackSerializer.hpp | 2 +- src/ArduinoJson/Object/JsonObject.hpp | 18 +-- src/ArduinoJson/Object/JsonObjectConst.hpp | 14 +-- src/ArduinoJson/Object/ObjectData.hpp | 69 ++++++++++++ src/ArduinoJson/Object/ObjectImpl.hpp | 104 ++++++++++++++++++ src/ArduinoJson/Variant/VariantCompare.hpp | 10 +- src/ArduinoJson/Variant/VariantContent.hpp | 6 +- src/ArduinoJson/Variant/VariantData.hpp | 26 ++--- src/ArduinoJson/Variant/Visitor.hpp | 5 +- 17 files changed, 219 insertions(+), 193 deletions(-) create mode 100644 src/ArduinoJson/Object/ObjectData.hpp create mode 100644 src/ArduinoJson/Object/ObjectImpl.hpp diff --git a/src/ArduinoJson.hpp b/src/ArduinoJson.hpp index dd5b1df8..da628d5e 100644 --- a/src/ArduinoJson.hpp +++ b/src/ArduinoJson.hpp @@ -40,6 +40,7 @@ #include "ArduinoJson/Memory/VariantPoolImpl.hpp" #include "ArduinoJson/Object/JsonObjectImpl.hpp" #include "ArduinoJson/Object/MemberProxy.hpp" +#include "ArduinoJson/Object/ObjectImpl.hpp" #include "ArduinoJson/Variant/ConverterImpl.hpp" #include "ArduinoJson/Variant/VariantCompare.hpp" diff --git a/src/ArduinoJson/Collection/CollectionData.hpp b/src/ArduinoJson/Collection/CollectionData.hpp index 264c0a66..12d91ef9 100644 --- a/src/ArduinoJson/Collection/CollectionData.hpp +++ b/src/ArduinoJson/Collection/CollectionData.hpp @@ -29,25 +29,10 @@ class CollectionData { size_t memoryUsage() const; size_t size() const; - VariantData* addMember(StringNode* key, ResourceManager* resources); - - template - VariantData* addMember(TAdaptedString key, ResourceManager* resources); - void clear(ResourceManager* resources); - bool copyFrom(const CollectionData& src, ResourceManager* resources); - - template - VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources); - - template - VariantData* getMember(TAdaptedString key) const; void removeSlot(VariantSlot* slot, ResourceManager* resources); - template - void removeMember(TAdaptedString key, ResourceManager* resources); - VariantSlot* head() const { return head_; } @@ -57,9 +42,6 @@ class CollectionData { protected: void addSlot(VariantSlot*); - template - VariantSlot* getSlot(TAdaptedString key) const; - private: VariantSlot* getPreviousSlot(VariantSlot*) const; }; @@ -75,9 +57,4 @@ inline VariantData* collectionToVariant(CollectionData* collection) { return reinterpret_cast(data); } -bool objectEquals(const detail::CollectionData& lhs, - const detail::CollectionData& rhs); -bool objectEquals(const detail::CollectionData* lhs, - const detail::CollectionData* rhs); - ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Collection/CollectionFunctions.hpp b/src/ArduinoJson/Collection/CollectionFunctions.hpp index 44387373..a8c356d3 100644 --- a/src/ArduinoJson/Collection/CollectionFunctions.hpp +++ b/src/ArduinoJson/Collection/CollectionFunctions.hpp @@ -14,22 +14,6 @@ inline void collectionClear(CollectionData* c, ResourceManager* resources) { c->clear(resources); } -inline bool collectionCopy(CollectionData* dst, const CollectionData* src, - ResourceManager* resources) { - if (!dst || !src) - return false; - - return dst->copyFrom(*src, resources); -} - -template -inline VariantData* collectionGetMember(const CollectionData* obj, - TAdaptedString key) { - if (!obj) - return nullptr; - return obj->getMember(key); -} - inline void collectionRemove(CollectionData* data, VariantSlot* slot, ResourceManager* resources) { if (!data) @@ -37,12 +21,4 @@ inline void collectionRemove(CollectionData* data, VariantSlot* slot, data->removeSlot(slot, resources); } -template -inline void collectionRemoveMember(CollectionData* obj, TAdaptedString key, - ResourceManager* resources) { - if (!obj) - return; - obj->removeMember(key, resources); -} - ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index 32091a3a..d1285d70 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -23,51 +23,6 @@ inline void CollectionData::addSlot(VariantSlot* slot) { } } -inline VariantData* CollectionData::addMember(StringNode* key, - ResourceManager* resources) { - ARDUINOJSON_ASSERT(key != nullptr); - auto slot = resources->allocVariant(); - if (!slot) - return nullptr; - - slot->setKey(key); - addSlot(slot); - return slot->data(); -} - -template -inline VariantData* CollectionData::addMember(TAdaptedString key, - ResourceManager* resources) { - ARDUINOJSON_ASSERT(!key.isNull()); - auto slot = resources->allocVariant(); - if (!slot) - return nullptr; - if (key.isLinked()) - slot->setKey(key.data()); - else { - auto storedKey = resources->saveString(key); - if (!storedKey) - return nullptr; - slot->setKey(storedKey); - } - addSlot(slot); - return slot->data(); -} - -template -inline VariantData* CollectionData::getMember(TAdaptedString key) const { - return slotData(getSlot(key)); -} - -template -VariantData* CollectionData::getOrAddMember(TAdaptedString key, - ResourceManager* resources) { - auto slot = getSlot(key); - if (slot) - return slot->data(); - return addMember(key, resources); -} - inline void CollectionData::clear(ResourceManager* resources) { for (auto slot = head_; slot; slot = slot->next()) slotRelease(slot, resources); @@ -75,34 +30,6 @@ inline void CollectionData::clear(ResourceManager* resources) { tail_ = 0; } -inline bool CollectionData::copyFrom(const CollectionData& src, - ResourceManager* resources) { - clear(resources); - - for (VariantSlot* s = src.head(); s; s = s->next()) { - 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; - } - return true; -} - -template -inline VariantSlot* CollectionData::getSlot(TAdaptedString key) const { - if (key.isNull()) - return 0; - VariantSlot* slot = head_; - while (slot) { - if (stringEquals(key, adaptString(slot->key()))) - break; - slot = slot->next(); - } - return slot; -} - inline VariantSlot* CollectionData::getPreviousSlot(VariantSlot* target) const { VariantSlot* current = head_; while (current) { @@ -129,12 +56,6 @@ inline void CollectionData::removeSlot(VariantSlot* slot, slotRelease(slot, resources); } -template -inline void CollectionData::removeMember(TAdaptedString key, - ResourceManager* resources) { - removeSlot(getSlot(key), resources); -} - inline size_t CollectionData::memoryUsage() const { size_t total = 0; for (VariantSlot* s = head_; s; s = s->next()) { @@ -165,27 +86,4 @@ inline void CollectionData::movePointers(ptrdiff_t variantDistance) { slot->data()->movePointers(variantDistance); } -inline bool objectEquals(const CollectionData& lhs, const CollectionData& rhs) { - size_t count = 0; - for (auto a = lhs.head(); a; a = a->next()) { - auto b = rhs.getMember(adaptString(a->key())); - if (!b) - return false; - if (compare(a->data(), b) != COMPARE_RESULT_EQUAL) - return false; - count++; - } - return count == rhs.size(); -} - -inline bool objectEquals(const CollectionData* lhs, const CollectionData* rhs) { - if (lhs == rhs) - return true; - - if (!lhs || !rhs) - return false; - - return objectEquals(*lhs, *rhs); -} - ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Json/JsonDeserializer.hpp b/src/ArduinoJson/Json/JsonDeserializer.hpp index e5480a34..8e4b8b9d 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -232,7 +232,7 @@ class JsonDeserializer { template DeserializationError::Code parseObject( - CollectionData& object, TFilter filter, + ObjectData& object, TFilter filter, DeserializationOption::NestingLimit nestingLimit) { DeserializationError::Code err; diff --git a/src/ArduinoJson/Json/JsonSerializer.hpp b/src/ArduinoJson/Json/JsonSerializer.hpp index 459cf488..d75863d0 100644 --- a/src/ArduinoJson/Json/JsonSerializer.hpp +++ b/src/ArduinoJson/Json/JsonSerializer.hpp @@ -37,7 +37,7 @@ class JsonSerializer : public Visitor { return bytesWritten(); } - size_t visitObject(const CollectionData& object) { + size_t visitObject(const ObjectData& object) { write('{'); const VariantSlot* slot = object.head(); diff --git a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp index 66058fdd..13c69b38 100644 --- a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp +++ b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp @@ -39,7 +39,7 @@ class PrettyJsonSerializer : public JsonSerializer { return this->bytesWritten(); } - size_t visitObject(const CollectionData& object) { + size_t visitObject(const ObjectData& object) { const VariantSlot* slot = object.head(); if (slot) { base::write("{\r\n"); diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index ca2b5934..c00548ba 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -472,7 +472,7 @@ class MsgPackDeserializer { if (nestingLimit.reached()) return DeserializationError::TooDeep; - CollectionData* object; + ObjectData* object; if (filter.allowObject()) { ARDUINOJSON_ASSERT(variant != 0); object = &variant->toObject(); diff --git a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp index 83b4ec67..ec4373b9 100644 --- a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp @@ -61,7 +61,7 @@ class MsgPackSerializer : public Visitor { return bytesWritten(); } - size_t visitObject(const CollectionData& object) { + size_t visitObject(const ObjectData& object) { size_t n = object.size(); if (n < 0x10) { writeByte(uint8_t(0x80 + n)); diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index 56ce3a65..87b31cb6 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -23,7 +23,7 @@ class JsonObject : public detail::VariantOperators { FORCE_INLINE JsonObject() : data_(0), resources_(0) {} // INTERNAL USE ONLY - FORCE_INLINE JsonObject(detail::CollectionData* data, + FORCE_INLINE JsonObject(detail::ObjectData* data, detail::ResourceManager* resource) : data_(data), resources_(resource) {} @@ -95,12 +95,12 @@ class JsonObject : public detail::VariantOperators { // Copies an object. // https://arduinojson.org/v6/api/jsonobject/set/ FORCE_INLINE bool set(JsonObjectConst src) { - return collectionCopy(data_, src.data_, resources_); + return detail::ObjectData::copy(data_, src.data_, resources_); } // Compares the content of two objects. FORCE_INLINE bool operator==(JsonObject rhs) const { - return objectEquals(data_, rhs.data_); + return detail::ObjectData::equals(data_, rhs.data_); } // Gets or sets the member with specified key. @@ -135,7 +135,8 @@ class JsonObject : public detail::VariantOperators { // https://arduinojson.org/v6/api/jsonobject/remove/ template FORCE_INLINE void remove(const TString& key) const { - collectionRemoveMember(data_, detail::adaptString(key), resources_); + detail::ObjectData::removeMember(data_, detail::adaptString(key), + resources_); } // Removes the member with the specified key. @@ -143,7 +144,8 @@ class JsonObject : public detail::VariantOperators { // https://arduinojson.org/v6/api/jsonobject/remove/ template FORCE_INLINE void remove(TChar* key) const { - collectionRemoveMember(data_, detail::adaptString(key), resources_); + detail::ObjectData::removeMember(data_, detail::adaptString(key), + resources_); } // Returns true if the object contains the specified key. @@ -152,7 +154,7 @@ class JsonObject : public detail::VariantOperators { FORCE_INLINE typename detail::enable_if::value, bool>::type containsKey(const TString& key) const { - return collectionGetMember(data_, detail::adaptString(key)) != 0; + return detail::ObjectData::getMember(data_, detail::adaptString(key)) != 0; } // Returns true if the object contains the specified key. @@ -161,7 +163,7 @@ class JsonObject : public detail::VariantOperators { FORCE_INLINE typename detail::enable_if::value, bool>::type containsKey(TChar* key) const { - return collectionGetMember(data_, detail::adaptString(key)) != 0; + return detail::ObjectData::getMember(data_, detail::adaptString(key)) != 0; } // Creates an array and adds it to the object. @@ -201,7 +203,7 @@ class JsonObject : public detail::VariantOperators { return detail::collectionToVariant(data_); } - detail::CollectionData* data_; + detail::ObjectData* data_; detail::ResourceManager* resources_; }; diff --git a/src/ArduinoJson/Object/JsonObjectConst.hpp b/src/ArduinoJson/Object/JsonObjectConst.hpp index 8759b935..330ab3f2 100644 --- a/src/ArduinoJson/Object/JsonObjectConst.hpp +++ b/src/ArduinoJson/Object/JsonObjectConst.hpp @@ -22,7 +22,7 @@ class JsonObjectConst : public detail::VariantOperators { JsonObjectConst() : data_(0) {} // INTERNAL USE ONLY - JsonObjectConst(const detail::CollectionData* data) : data_(data) {} + JsonObjectConst(const detail::ObjectData* data) : data_(data) {} operator JsonVariantConst() const { return JsonVariantConst(collectionToVariant(data_)); @@ -76,14 +76,14 @@ class JsonObjectConst : public detail::VariantOperators { // https://arduinojson.org/v6/api/jsonobjectconst/containskey/ template FORCE_INLINE bool containsKey(const TString& key) const { - return collectionGetMember(data_, detail::adaptString(key)) != 0; + return detail::ObjectData::getMember(data_, detail::adaptString(key)) != 0; } // Returns true if the object contains the specified key. // https://arduinojson.org/v6/api/jsonobjectconst/containskey/ template FORCE_INLINE bool containsKey(TChar* key) const { - return collectionGetMember(data_, detail::adaptString(key)) != 0; + return detail::ObjectData::getMember(data_, detail::adaptString(key)) != 0; } // Gets the member with specified key. @@ -93,7 +93,7 @@ class JsonObjectConst : public detail::VariantOperators { JsonVariantConst>::type operator[](const TString& key) const { return JsonVariantConst( - collectionGetMember(data_, detail::adaptString(key))); + detail::ObjectData::getMember(data_, detail::adaptString(key))); } // Gets the member with specified key. @@ -103,12 +103,12 @@ class JsonObjectConst : public detail::VariantOperators { JsonVariantConst>::type operator[](TChar* key) const { return JsonVariantConst( - collectionGetMember(data_, detail::adaptString(key))); + detail::ObjectData::getMember(data_, detail::adaptString(key))); } // Compares objects. FORCE_INLINE bool operator==(JsonObjectConst rhs) const { - return objectEquals(data_, rhs.data_); + return detail::ObjectData::equals(data_, rhs.data_); } private: @@ -116,7 +116,7 @@ class JsonObjectConst : public detail::VariantOperators { return collectionToVariant(data_); } - const detail::CollectionData* data_; + const detail::ObjectData* data_; }; template <> diff --git a/src/ArduinoJson/Object/ObjectData.hpp b/src/ArduinoJson/Object/ObjectData.hpp new file mode 100644 index 00000000..ef9267b6 --- /dev/null +++ b/src/ArduinoJson/Object/ObjectData.hpp @@ -0,0 +1,69 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2023, Benoit BLANCHON +// MIT License + +#pragma once + +#include + +ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE + +class ObjectData : public CollectionData { + public: + VariantData* addMember(StringNode* key, ResourceManager* resources); + + template + VariantData* addMember(TAdaptedString key, ResourceManager* resources); + + bool copyFrom(const ObjectData& src, ResourceManager* resources); + + static bool copy(ObjectData* dst, const ObjectData* src, + ResourceManager* resources) { + if (!dst || !src) + return false; + + return dst->copyFrom(*src, resources); + } + + bool equals(const ObjectData& other) const; + + static bool equals(const ObjectData* lhs, const ObjectData* rhs) { + if (lhs == rhs) + return true; + + if (!lhs || !rhs) + return false; + + return lhs->equals(*rhs); + } + + template + VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources); + + template + VariantData* getMember(TAdaptedString key) const; + + template + static VariantData* getMember(const ObjectData* object, TAdaptedString key) { + if (!object) + return nullptr; + return object->getMember(key); + } + + template + void removeMember(TAdaptedString key, ResourceManager* resources); + + template + static void removeMember(ObjectData* obj, TAdaptedString key, + ResourceManager* resources) { + if (!obj) + return; + obj->removeMember(key, resources); + } + + private: + template + VariantSlot* getSlot(TAdaptedString key) const; +}; + +ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Object/ObjectImpl.hpp b/src/ArduinoJson/Object/ObjectImpl.hpp new file mode 100644 index 00000000..85db5bcf --- /dev/null +++ b/src/ArduinoJson/Object/ObjectImpl.hpp @@ -0,0 +1,104 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2023, Benoit BLANCHON +// MIT License + +#pragma once + +#include +#include + +ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE + +inline VariantData* ObjectData::addMember(StringNode* key, + ResourceManager* resources) { + ARDUINOJSON_ASSERT(key != nullptr); + auto slot = resources->allocVariant(); + if (!slot) + return nullptr; + + slot->setKey(key); + addSlot(slot); + return slot->data(); +} + +template +inline VariantData* ObjectData::addMember(TAdaptedString key, + ResourceManager* resources) { + ARDUINOJSON_ASSERT(!key.isNull()); + auto slot = resources->allocVariant(); + if (!slot) + return nullptr; + if (key.isLinked()) + slot->setKey(key.data()); + else { + auto storedKey = resources->saveString(key); + if (!storedKey) + return nullptr; + slot->setKey(storedKey); + } + addSlot(slot); + return slot->data(); +} + +inline bool ObjectData::copyFrom(const ObjectData& src, + ResourceManager* resources) { + clear(resources); + + for (VariantSlot* s = src.head(); s; s = s->next()) { + 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; + } + return true; +} + +inline bool ObjectData::equals(const ObjectData& other) const { + size_t count = 0; + for (auto a = head(); a; a = a->next()) { + auto b = other.getMember(adaptString(a->key())); + if (!b) + return false; + if (compare(a->data(), b) != COMPARE_RESULT_EQUAL) + return false; + count++; + } + return count == other.size(); +} + +template +inline VariantData* ObjectData::getMember(TAdaptedString key) const { + return slotData(getSlot(key)); +} + +template +VariantData* ObjectData::getOrAddMember(TAdaptedString key, + ResourceManager* resources) { + auto slot = getSlot(key); + if (slot) + return slot->data(); + return addMember(key, resources); +} + +template +inline VariantSlot* ObjectData::getSlot(TAdaptedString key) const { + if (key.isNull()) + return 0; + VariantSlot* slot = head(); + while (slot) { + if (stringEquals(key, adaptString(slot->key()))) + break; + slot = slot->next(); + } + return slot; +} + +template +inline void ObjectData::removeMember(TAdaptedString key, + ResourceManager* resources) { + removeSlot(getSlot(key), resources); +} + +ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Variant/VariantCompare.hpp b/src/ArduinoJson/Variant/VariantCompare.hpp index a635d5c6..70bd3a9a 100644 --- a/src/ArduinoJson/Variant/VariantCompare.hpp +++ b/src/ArduinoJson/Variant/VariantCompare.hpp @@ -92,12 +92,12 @@ struct ArrayComparer : ComparerBase { }; struct ObjectComparer : ComparerBase { - const CollectionData* rhs_; + const ObjectData* rhs_; - explicit ObjectComparer(const CollectionData& rhs) : rhs_(&rhs) {} + explicit ObjectComparer(const ObjectData& rhs) : rhs_(&rhs) {} - CompareResult visitObject(const CollectionData& lhs) { - if (objectEquals(lhs, *rhs_)) + CompareResult visitObject(const ObjectData& lhs) { + if (rhs_->equals(lhs)) return COMPARE_RESULT_EQUAL; else return COMPARE_RESULT_DIFFER; @@ -133,7 +133,7 @@ struct VariantComparer : ComparerBase { return accept(comparer); } - CompareResult visitObject(const CollectionData& lhs) { + CompareResult visitObject(const ObjectData& lhs) { ObjectComparer comparer(lhs); return accept(comparer); } diff --git a/src/ArduinoJson/Variant/VariantContent.hpp b/src/ArduinoJson/Variant/VariantContent.hpp index 80976a41..aa576dcb 100644 --- a/src/ArduinoJson/Variant/VariantContent.hpp +++ b/src/ArduinoJson/Variant/VariantContent.hpp @@ -7,10 +7,9 @@ #include // size_t #include -#include #include #include - +#include ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE @@ -46,8 +45,9 @@ union VariantContent { bool asBoolean; JsonUInt asUnsignedInteger; JsonInteger asSignedInteger; - CollectionData asCollection; ArrayData asArray; + ObjectData asObject; + CollectionData asCollection; const char* asLinkedString; struct StringNode* asOwnedString; }; diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 33259bf5..d6854c63 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -14,8 +14,6 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -bool collectionCopy(CollectionData* dst, const CollectionData* src, - ResourceManager* resources); template T parseNumber(const char* s); void slotRelease(VariantSlot* slot, ResourceManager* resources); @@ -37,7 +35,7 @@ class VariantData { return visitor.visitArray(content_.asArray); case VALUE_IS_OBJECT: - return visitor.visitObject(content_.asCollection); + return visitor.visitObject(content_.asObject); case VALUE_IS_LINKED_STRING: return visitor.visitString(content_.asLinkedString, @@ -139,11 +137,11 @@ class VariantData { } } - CollectionData* asObject() { - return isObject() ? &content_.asCollection : 0; + ObjectData* asObject() { + return isObject() ? &content_.asObject : 0; } - const CollectionData* asObject() const { + const ObjectData* asObject() const { return const_cast(this)->asObject(); } @@ -179,7 +177,7 @@ class VariantData { case VALUE_IS_ARRAY: return toArray().copyFrom(*src->asArray(), resources); case VALUE_IS_OBJECT: - return collectionCopy(&toObject(), src->asObject(), resources); + return toObject().copyFrom(*src->asObject(), resources); case VALUE_IS_OWNED_STRING: { auto str = adaptString(src->asString()); auto dup = resources->saveString(str); @@ -320,7 +318,7 @@ class VariantData { template void removeMember(TAdaptedString key, ResourceManager* resources) { - collectionRemoveMember(asObject(), key, resources); + ObjectData::removeMember(asObject(), key, resources); } void reset() { @@ -434,13 +432,13 @@ class VariantData { return toArray(); } - CollectionData& toObject() { + ObjectData& toObject() { setType(VALUE_IS_OBJECT); - new (&content_.asCollection) CollectionData(); - return content_.asCollection; + new (&content_.asObject) ObjectData(); + return content_.asObject; } - CollectionData& toObject(ResourceManager* resources) { + ObjectData& toObject(ResourceManager* resources) { release(resources); return toObject(); } @@ -596,8 +594,8 @@ inline ArrayData* variantToArray(VariantData* var, ResourceManager* resources) { return &var->toArray(resources); } -inline CollectionData* variantToObject(VariantData* var, - ResourceManager* resources) { +inline ObjectData* variantToObject(VariantData* var, + ResourceManager* resources) { if (!var) return 0; return &var->toObject(resources); diff --git a/src/ArduinoJson/Variant/Visitor.hpp b/src/ArduinoJson/Variant/Visitor.hpp index 424062d5..f4bc76a3 100644 --- a/src/ArduinoJson/Variant/Visitor.hpp +++ b/src/ArduinoJson/Variant/Visitor.hpp @@ -4,9 +4,10 @@ #pragma once -#include +#include #include #include +#include ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE @@ -34,7 +35,7 @@ struct Visitor { return TResult(); } - TResult visitObject(const CollectionData&) { + TResult visitObject(const ObjectData&) { return TResult(); }