From 9a26c04e39900be1989fbb0b961925d8cb5b2931 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 3 Jul 2025 10:20:27 +0200 Subject: [PATCH] CollectionImpl: add `allocVariant()`, `getVariant()`, `freeVariant()` --- src/ArduinoJson/Array/ArrayImpl.hpp | 8 +++---- src/ArduinoJson/Collection/CollectionData.hpp | 16 +++++++++++++- src/ArduinoJson/Collection/CollectionImpl.hpp | 22 ++++++++----------- src/ArduinoJson/Object/ObjectImpl.hpp | 10 ++++----- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/ArduinoJson/Array/ArrayImpl.hpp b/src/ArduinoJson/Array/ArrayImpl.hpp index 3fdcb554..5f074d10 100644 --- a/src/ArduinoJson/Array/ArrayImpl.hpp +++ b/src/ArduinoJson/Array/ArrayImpl.hpp @@ -22,8 +22,7 @@ inline ArrayImpl::iterator ArrayImpl::at(size_t index) const { inline VariantData* ArrayImpl::addElement() { if (!data_) return nullptr; - ARDUINOJSON_ASSERT(resources_ != nullptr); - auto slot = resources_->allocVariant(); + auto slot = allocVariant(); if (!slot) return nullptr; CollectionImpl::appendOne(slot); @@ -60,13 +59,12 @@ template inline bool ArrayImpl::addValue(const T& value) { if (!data_) return false; - ARDUINOJSON_ASSERT(resources_ != nullptr); - auto slot = resources_->allocVariant(); + auto slot = allocVariant(); if (!slot) return false; JsonVariant variant(slot.ptr(), resources_); if (!variant.set(value)) { - resources_->freeVariant(slot); + freeVariant(slot); return false; } CollectionImpl::appendOne(slot); diff --git a/src/ArduinoJson/Collection/CollectionData.hpp b/src/ArduinoJson/Collection/CollectionData.hpp index d2735b70..7d78c433 100644 --- a/src/ArduinoJson/Collection/CollectionData.hpp +++ b/src/ArduinoJson/Collection/CollectionData.hpp @@ -4,7 +4,6 @@ #pragma once -#include #include #include @@ -113,6 +112,21 @@ class CollectionImpl { void removeOne(iterator it); void removePair(iterator it); + VariantData* getVariant(SlotId id) const { + ARDUINOJSON_ASSERT(resources_ != nullptr); + return resources_->getVariant(id); + } + + void freeVariant(Slot slot) { + ARDUINOJSON_ASSERT(resources_ != nullptr); + resources_->freeVariant(slot); + } + + Slot allocVariant() { + ARDUINOJSON_ASSERT(resources_ != nullptr); + return resources_->allocVariant(); + } + private: Slot getPreviousSlot(VariantData*) const; diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index 898b7340..3e980b8c 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -29,16 +29,14 @@ inline CollectionImpl::iterator CollectionImpl::createIterator() const { if (!data_) return iterator(); auto coll = getCollectionData(); - return iterator(resources_->getVariant(coll->head), coll->head); + return iterator(getVariant(coll->head), coll->head); } inline void CollectionImpl::appendOne(Slot slot) { - ARDUINOJSON_ASSERT(resources_ != nullptr); - auto coll = getCollectionData(); if (coll->tail != NULL_SLOT) { - auto tail = resources_->getVariant(coll->tail); + auto tail = getVariant(coll->tail); tail->next = slot.id(); coll->tail = slot.id(); } else { @@ -49,14 +47,12 @@ inline void CollectionImpl::appendOne(Slot slot) { inline void CollectionImpl::appendPair(Slot key, Slot value) { - ARDUINOJSON_ASSERT(resources_ != nullptr); - auto coll = getCollectionData(); key->next = value.id(); if (coll->tail != NULL_SLOT) { - auto tail = resources_->getVariant(coll->tail); + auto tail = getVariant(coll->tail); tail->next = key.id(); coll->tail = value.id(); } else { @@ -74,9 +70,9 @@ inline void CollectionImpl::clear() { auto next = coll->head; while (next != NULL_SLOT) { auto currId = next; - auto slot = resources_->getVariant(next); + auto slot = getVariant(next); next = slot->next; - resources_->freeVariant({slot, currId}); + freeVariant({slot, currId}); } coll->head = NULL_SLOT; @@ -89,7 +85,7 @@ inline Slot CollectionImpl::getPreviousSlot( auto prev = Slot(); auto currentId = coll->head; while (currentId != NULL_SLOT) { - auto currentSlot = resources_->getVariant(currentId); + auto currentSlot = getVariant(currentId); if (currentSlot == target) break; prev = Slot(currentSlot, currentId); @@ -111,7 +107,7 @@ inline void CollectionImpl::removeOne(iterator it) { coll->head = next; if (next == NULL_SLOT) coll->tail = prev.id(); - resources_->freeVariant({it.slot_, it.currentId_}); + freeVariant({it.slot_, it.currentId_}); } inline void CollectionImpl::removePair(ObjectImpl::iterator it) { @@ -121,11 +117,11 @@ inline void CollectionImpl::removePair(ObjectImpl::iterator it) { auto keySlot = it.slot_; auto valueId = it.nextId_; - auto valueSlot = resources_->getVariant(valueId); + auto valueSlot = getVariant(valueId); // remove value slot keySlot->next = valueSlot->next; - resources_->freeVariant({valueSlot, valueId}); + freeVariant({valueSlot, valueId}); // remove key slot removeOne(it); diff --git a/src/ArduinoJson/Object/ObjectImpl.hpp b/src/ArduinoJson/Object/ObjectImpl.hpp index a55503a2..c2ead28e 100644 --- a/src/ArduinoJson/Object/ObjectImpl.hpp +++ b/src/ArduinoJson/Object/ObjectImpl.hpp @@ -50,13 +50,12 @@ template inline VariantData* ObjectImpl::addMember(TAdaptedString key) { if (!data_) return nullptr; - ARDUINOJSON_ASSERT(resources_ != nullptr); - auto keySlot = resources_->allocVariant(); + auto keySlot = allocVariant(); if (!keySlot) return nullptr; - auto valueSlot = resources_->allocVariant(); + auto valueSlot = allocVariant(); if (!valueSlot) return nullptr; @@ -72,13 +71,12 @@ inline VariantData* ObjectImpl::addMember(TAdaptedString key) { inline VariantData* ObjectImpl::addPair(VariantData** value) { if (!data_) return nullptr; - ARDUINOJSON_ASSERT(resources_ != nullptr); - auto keySlot = resources_->allocVariant(); + auto keySlot = allocVariant(); if (!keySlot) return nullptr; - auto valueSlot = resources_->allocVariant(); + auto valueSlot = allocVariant(); if (!valueSlot) return nullptr; *value = valueSlot.ptr();