Reduce size of CollectionData::clear()

This commit is contained in:
Benoit Blanchon
2023-07-24 10:24:33 +02:00
parent 228c4cf9fa
commit 2fdacb1ca0
2 changed files with 15 additions and 10 deletions

View File

@ -110,10 +110,10 @@ class CollectionData {
protected: protected:
iterator addSlot(ResourceManager*); iterator addSlot(ResourceManager*);
void releaseSlot(iterator, ResourceManager*);
private: private:
SlotWithId getPreviousSlot(VariantSlot*, const ResourceManager*) const; SlotWithId getPreviousSlot(VariantSlot*, const ResourceManager*) const;
void releaseSlot(SlotWithId, ResourceManager*);
}; };
inline const VariantData* collectionToVariant( inline const VariantData* collectionToVariant(

View File

@ -64,8 +64,14 @@ inline CollectionData::iterator CollectionData::addSlot(
} }
inline void CollectionData::clear(ResourceManager* resources) { inline void CollectionData::clear(ResourceManager* resources) {
for (auto it = createIterator(resources); !it.done(); it.next(resources)) auto next = head_;
releaseSlot(it, resources); while (next != NULL_SLOT) {
auto currId = next;
auto slot = resources->getSlot(next);
next = slot->next();
releaseSlot(SlotWithId(slot, currId), resources);
}
head_ = NULL_SLOT; head_ = NULL_SLOT;
tail_ = NULL_SLOT; tail_ = NULL_SLOT;
} }
@ -96,7 +102,7 @@ inline void CollectionData::remove(iterator it, ResourceManager* resources) {
head_ = next; head_ = next;
if (next == NULL_SLOT) if (next == NULL_SLOT)
tail_ = prev.id(); tail_ = prev.id();
releaseSlot(it, resources); releaseSlot({it.slot_, it.currentId_}, resources);
} }
inline size_t CollectionData::memoryUsage( inline size_t CollectionData::memoryUsage(
@ -127,13 +133,12 @@ inline size_t CollectionData::size(const ResourceManager* resources) const {
return count; return count;
} }
inline void CollectionData::releaseSlot(iterator it, inline void CollectionData::releaseSlot(SlotWithId slot,
ResourceManager* resources) { ResourceManager* resources) {
ARDUINOJSON_ASSERT(!it.done()); if (slot->ownsKey())
if (it.ownsKey()) resources->dereferenceString(slot->key());
resources->dereferenceString(it.key()); slot->data()->setNull(resources);
it->setNull(resources); resources->freeSlot(slot);
resources->freeSlot(SlotWithId(it.slot_, it.currentId_));
} }
ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_END_PRIVATE_NAMESPACE