From 2fa8b9664c1027208f723ab0c32b8cf089b7baac Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 14 Jul 2025 18:30:28 +0200 Subject: [PATCH] VariantImpl: move out-of-class definitions back in the class --- src/ArduinoJson/Variant/VariantImpl.hpp | 162 +++++++++++------------- 1 file changed, 75 insertions(+), 87 deletions(-) diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index e04617ed..66e2e3fe 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -441,14 +441,68 @@ class VariantImpl { } template - void setRawString(SerializedValue value); + void setRawString(SerializedValue value) { + if (!data_) + return; + auto dup = resources_->saveString(adaptString(value.data(), value.size())); + if (dup) + data_->setRawString(dup); + } template - bool setString(TAdaptedString value); + bool setString(TAdaptedString value) { + ARDUINOJSON_ASSERT(isNull()); // must call clear() first - bool setLinkedString(const char* s); + if (!data_) + return false; - void empty(); + if (value.isNull()) + return false; + + if (value.isStatic()) + return setLinkedString(value.data()); + + if (isTinyString(value, value.size())) { + data_->setTinyString(value); + return true; + } + + auto dup = resources_->saveString(value); + if (dup) { + data_->setOwnedString(dup); + return true; + } + + return false; + } + + bool setLinkedString(const char* s) { + ARDUINOJSON_ASSERT(isNull()); // must call clear() first + ARDUINOJSON_ASSERT(s); + + auto slotId = resources_->saveStaticString(s); + if (slotId == NULL_SLOT) + return false; + + data_->type = VariantType::LinkedString; + data_->content.asSlotId = slotId; + return true; + } + + void empty() { + auto coll = getCollectionData(); + + auto next = coll->head; + while (next != NULL_SLOT) { + auto currId = next; + auto slot = getVariant(next); + next = slot->next; + freeVariant({slot, currId}); + } + + coll->head = NULL_SLOT; + coll->tail = NULL_SLOT; + } size_t size() const; @@ -457,7 +511,23 @@ class VariantImpl { } // Release the resources used by this variant and set it to null. - void clear(); + void clear() { + if (!data_) + return; + + if (data_->type & VariantTypeBits::OwnedStringBit) + resources_->dereferenceString(data_->content.asOwnedString->data); + +#if ARDUINOJSON_USE_8_BYTE_POOL + if (data_->type & VariantTypeBits::EightByteBit) + resources_->freeEightByte(data_->content.asSlotId); +#endif + + if (data_->type & VariantTypeBits::CollectionMask) + empty(); + + data_->type = VariantType::Null; + } private: template @@ -495,86 +565,4 @@ class VariantImpl { } }; -template -inline void VariantImpl::setRawString(SerializedValue value) { - if (!data_) - return; - auto dup = resources_->saveString(adaptString(value.data(), value.size())); - if (dup) - data_->setRawString(dup); -} - -inline bool VariantImpl::setLinkedString(const char* s) { - ARDUINOJSON_ASSERT(isNull()); // must call clear() first - ARDUINOJSON_ASSERT(s); - - auto slotId = resources_->saveStaticString(s); - if (slotId == NULL_SLOT) - return false; - - data_->type = VariantType::LinkedString; - data_->content.asSlotId = slotId; - return true; -} - -template -inline bool VariantImpl::setString(TAdaptedString value) { - ARDUINOJSON_ASSERT(isNull()); // must call clear() first - - if (!data_) - return false; - - if (value.isNull()) - return false; - - if (value.isStatic()) - return setLinkedString(value.data()); - - if (isTinyString(value, value.size())) { - data_->setTinyString(value); - return true; - } - - auto dup = resources_->saveString(value); - if (dup) { - data_->setOwnedString(dup); - return true; - } - - return false; -} - -inline void VariantImpl::clear() { - if (!data_) - return; - - if (data_->type & VariantTypeBits::OwnedStringBit) - resources_->dereferenceString(data_->content.asOwnedString->data); - -#if ARDUINOJSON_USE_8_BYTE_POOL - if (data_->type & VariantTypeBits::EightByteBit) - resources_->freeEightByte(data_->content.asSlotId); -#endif - - if (data_->type & VariantTypeBits::CollectionMask) - empty(); - - data_->type = VariantType::Null; -} - -inline void VariantImpl::empty() { - auto coll = getCollectionData(); - - auto next = coll->head; - while (next != NULL_SLOT) { - auto currId = next; - auto slot = getVariant(next); - next = slot->next; - freeVariant({slot, currId}); - } - - coll->head = NULL_SLOT; - coll->tail = NULL_SLOT; -} - ARDUINOJSON_END_PRIVATE_NAMESPACE