From f5e7570f8471441917743ba2d40c98482cc10bb9 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 17 Apr 2023 11:57:19 +0200 Subject: [PATCH] Simplify `CollectionData` to work only with `VariantSlot*` --- src/ArduinoJson/Array/JsonArrayConst.hpp | 2 +- src/ArduinoJson/Collection/CollectionData.hpp | 30 ++++--------------- .../Collection/CollectionFunctions.hpp | 10 +++---- src/ArduinoJson/Collection/CollectionImpl.hpp | 28 ++++------------- src/ArduinoJson/Json/JsonDeserializer.hpp | 13 ++++---- .../MsgPack/MsgPackDeserializer.hpp | 2 +- src/ArduinoJson/Object/JsonObject.hpp | 4 +-- src/ArduinoJson/Object/JsonObjectConst.hpp | 2 +- src/ArduinoJson/Variant/SlotFunctions.hpp | 4 --- src/ArduinoJson/Variant/VariantData.hpp | 12 +++++--- src/ArduinoJson/Variant/VariantFunctions.hpp | 4 +-- src/ArduinoJson/Variant/VariantSlot.hpp | 4 +++ 12 files changed, 41 insertions(+), 74 deletions(-) diff --git a/src/ArduinoJson/Array/JsonArrayConst.hpp b/src/ArduinoJson/Array/JsonArrayConst.hpp index 6c60e981..9c1be822 100644 --- a/src/ArduinoJson/Array/JsonArrayConst.hpp +++ b/src/ArduinoJson/Array/JsonArrayConst.hpp @@ -70,7 +70,7 @@ class JsonArrayConst : public detail::VariantOperators { // Returns the element at the specified index. // https://arduinojson.org/v6/api/jsonarrayconst/subscript/ FORCE_INLINE JsonVariantConst operator[](size_t index) const { - return JsonVariantConst(_data ? _data->getElement(index) : 0); + return JsonVariantConst(_data ? slotData(_data->get(index)) : 0); } operator JsonVariantConst() const { diff --git a/src/ArduinoJson/Collection/CollectionData.hpp b/src/ArduinoJson/Collection/CollectionData.hpp index 4ca334ef..3b7c3aae 100644 --- a/src/ArduinoJson/Collection/CollectionData.hpp +++ b/src/ArduinoJson/Collection/CollectionData.hpp @@ -19,32 +19,12 @@ class CollectionData { VariantSlot* _tail; public: - // Must be a POD! - // - no constructor - // - no destructor - // - no virtual - // - no inheritance - - // Array only - - VariantData* getElement(size_t index) const; - - // Object only - - template - VariantData* getMember(TAdaptedString key) const; - - template - bool containsKey(const TAdaptedString& key) const; - - // Generic - void clear(); size_t memoryUsage() const; size_t size() const; - void addSlot(VariantSlot*); - void removeSlot(VariantSlot* slot); + void add(VariantSlot*); + void remove(VariantSlot* slot); VariantSlot* head() const { return _head; @@ -52,13 +32,13 @@ class CollectionData { void movePointers(ptrdiff_t variantDistance); - VariantSlot* getSlot(size_t index) const; + VariantSlot* get(size_t index) const; template - VariantSlot* getSlot(TAdaptedString key) const; + VariantSlot* get(TAdaptedString key) const; private: - VariantSlot* getPreviousSlot(VariantSlot*) const; + VariantSlot* getPrevious(VariantSlot*) const; }; inline const VariantData* collectionToVariant( diff --git a/src/ArduinoJson/Collection/CollectionFunctions.hpp b/src/ArduinoJson/Collection/CollectionFunctions.hpp index 9ae96e21..f9416276 100644 --- a/src/ArduinoJson/Collection/CollectionFunctions.hpp +++ b/src/ArduinoJson/Collection/CollectionFunctions.hpp @@ -15,7 +15,7 @@ inline VariantData* collectionAddElement(CollectionData* array, auto slot = pool->allocVariant(); if (!slot) return nullptr; - array->addSlot(slot); + array->add(slot); return slot->data(); } @@ -33,7 +33,7 @@ inline VariantData* collectionAddMember(CollectionData* obj, TAdaptedString key, if (!storedKey) return nullptr; slot->setKey(storedKey); - obj->addSlot(slot); + obj->add(slot); return slot->data(); } @@ -71,7 +71,7 @@ inline void collectionRemove(CollectionData* data, VariantSlot* slot, MemoryPool* pool) { if (!data || !slot) return; - data->removeSlot(slot); + data->remove(slot); slotRelease(slot, pool); } @@ -79,7 +79,7 @@ inline void collectionRemoveElement(CollectionData* array, size_t index, MemoryPool* pool) { if (!array) return; - collectionRemove(array, array->getSlot(index), pool); + collectionRemove(array, array->get(index), pool); } template @@ -87,7 +87,7 @@ inline void collectionRemoveMember(CollectionData* obj, TAdaptedString key, MemoryPool* pool) { if (!obj) return; - collectionRemove(obj, obj->getSlot(key), pool); + collectionRemove(obj, obj->get(key), pool); } ARDUINOJSON_END_PRIVATE_NAMESPACE diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index 27701688..8647bdb4 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -11,7 +11,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -inline void CollectionData::addSlot(VariantSlot* slot) { +inline void CollectionData::add(VariantSlot* slot) { ARDUINOJSON_ASSERT(slot != nullptr); if (_tail) { @@ -29,12 +29,7 @@ inline void CollectionData::clear() { } template -inline bool CollectionData::containsKey(const TAdaptedString& key) const { - return getSlot(key) != 0; -} - -template -inline VariantSlot* CollectionData::getSlot(TAdaptedString key) const { +inline VariantSlot* CollectionData::get(TAdaptedString key) const { if (key.isNull()) return 0; VariantSlot* slot = _head; @@ -46,13 +41,13 @@ inline VariantSlot* CollectionData::getSlot(TAdaptedString key) const { return slot; } -inline VariantSlot* CollectionData::getSlot(size_t index) const { +inline VariantSlot* CollectionData::get(size_t index) const { if (!_head) return 0; return _head->next(index); } -inline VariantSlot* CollectionData::getPreviousSlot(VariantSlot* target) const { +inline VariantSlot* CollectionData::getPrevious(VariantSlot* target) const { VariantSlot* current = _head; while (current) { VariantSlot* next = current->next(); @@ -63,21 +58,10 @@ inline VariantSlot* CollectionData::getPreviousSlot(VariantSlot* target) const { return 0; } -template -inline VariantData* CollectionData::getMember(TAdaptedString key) const { - VariantSlot* slot = getSlot(key); - return slot ? slot->data() : 0; -} - -inline VariantData* CollectionData::getElement(size_t index) const { - VariantSlot* slot = getSlot(index); - return slot ? slot->data() : 0; -} - -inline void CollectionData::removeSlot(VariantSlot* slot) { +inline void CollectionData::remove(VariantSlot* slot) { if (!slot) return; - VariantSlot* prev = getPreviousSlot(slot); + VariantSlot* prev = getPrevious(slot); VariantSlot* next = slot->next(); if (prev) prev->setNext(next); diff --git a/src/ArduinoJson/Json/JsonDeserializer.hpp b/src/ArduinoJson/Json/JsonDeserializer.hpp index dfee6d9b..6f4dc6dc 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -274,24 +274,23 @@ class JsonDeserializer { TFilter memberFilter = filter[key.c_str()]; if (memberFilter.allow()) { - VariantData* variant = object.getMember(adaptString(key.c_str())); - if (!variant) { + VariantSlot* slot = object.get(adaptString(key.c_str())); + if (!slot) { // Save key in memory pool. key = _stringStorage.save(); // Allocate slot in object - VariantSlot* slot = _pool->allocVariant(); + slot = _pool->allocVariant(); if (!slot) return DeserializationError::NoMemory; slot->setKey(key); - object.addSlot(slot); - - variant = slot->data(); + object.add(slot); } // Parse value - err = parseVariant(*variant, memberFilter, nestingLimit.decrement()); + err = + parseVariant(*slot->data(), memberFilter, nestingLimit.decrement()); if (err) return err; } else { diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index 71c52edf..839c2c64 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -501,7 +501,7 @@ class MsgPackDeserializer { return DeserializationError::NoMemory; slot->setKey(key); - object->addSlot(slot); + object->add(slot); member = slot->data(); } else { diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index a14b76c0..ba6aef22 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -203,12 +203,12 @@ class JsonObject : public detail::VariantOperators { inline detail::VariantData* getMember(TAdaptedString key) const { if (!_data) return 0; - return _data->getMember(key); + return slotData(_data->get(key)); } template void removeMember(TAdaptedString key) const { - collectionRemove(_data, _data->getSlot(key), _pool); + collectionRemove(_data, _data->get(key), _pool); } detail::CollectionData* _data; diff --git a/src/ArduinoJson/Object/JsonObjectConst.hpp b/src/ArduinoJson/Object/JsonObjectConst.hpp index ee2af92d..bb8aca02 100644 --- a/src/ArduinoJson/Object/JsonObjectConst.hpp +++ b/src/ArduinoJson/Object/JsonObjectConst.hpp @@ -130,7 +130,7 @@ class JsonObjectConst : public detail::VariantOperators { const detail::VariantData* getMember(TAdaptedString key) const { if (!_data) return 0; - return _data->getMember(key); + return slotData(_data->get(key)); } const detail::CollectionData* _data; diff --git a/src/ArduinoJson/Variant/SlotFunctions.hpp b/src/ArduinoJson/Variant/SlotFunctions.hpp index 992dd4f5..c0683c0d 100644 --- a/src/ArduinoJson/Variant/SlotFunctions.hpp +++ b/src/ArduinoJson/Variant/SlotFunctions.hpp @@ -18,10 +18,6 @@ inline size_t slotSize(const VariantSlot* var) { return n; } -inline VariantData* slotData(VariantSlot* slot) { - return reinterpret_cast(slot); -} - inline void slotRelease(const VariantSlot* slot, MemoryPool* pool) { ARDUINOJSON_ASSERT(slot != nullptr); if (slot->ownsKey()) diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index cfc8af41..ffe6d5aa 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -226,14 +226,18 @@ class VariantData { } VariantData* getElement(size_t index) const { - const CollectionData* col = asArray(); - return col ? col->getElement(index) : 0; + auto array = asArray(); + if (!array) + return nullptr; + return slotData(array->get(index)); } template VariantData* getMember(TAdaptedString key) const { - const CollectionData* col = asObject(); - return col ? col->getMember(key) : 0; + auto object = asObject(); + if (!object) + return nullptr; + return slotData(object->get(key)); } void movePointers(ptrdiff_t variantDistance) { diff --git a/src/ArduinoJson/Variant/VariantFunctions.hpp b/src/ArduinoJson/Variant/VariantFunctions.hpp index eb8e780e..8e1fafed 100644 --- a/src/ArduinoJson/Variant/VariantFunctions.hpp +++ b/src/ArduinoJson/Variant/VariantFunctions.hpp @@ -195,7 +195,7 @@ inline NO_INLINE VariantData* variantGetOrAddElement(VariantData* var, slot = pool->allocVariant(); if (!slot) return nullptr; - array->addSlot(slot); + array->add(slot); index--; } return slot->data(); @@ -223,7 +223,7 @@ VariantData* variantGetOrAddMember(VariantData* var, TAdaptedString key, auto obj = var->isNull() ? &var->toObject() : var->asObject(); if (!obj) return nullptr; - auto slot = obj->getSlot(key); + auto slot = obj->get(key); if (slot) return slot->data(); return collectionAddMember(obj, key, pool); diff --git a/src/ArduinoJson/Variant/VariantSlot.hpp b/src/ArduinoJson/Variant/VariantSlot.hpp index 35885c08..cd35abd2 100644 --- a/src/ArduinoJson/Variant/VariantSlot.hpp +++ b/src/ArduinoJson/Variant/VariantSlot.hpp @@ -105,4 +105,8 @@ class VariantSlot { } }; +inline VariantData* slotData(VariantSlot* slot) { + return reinterpret_cast(slot); +} + ARDUINOJSON_END_PRIVATE_NAMESPACE