diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 76a5ead5..5429cb88 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -15,6 +15,8 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE VariantData* collectionAddElement(CollectionData* array, MemoryPool* pool); +bool collectionCopy(CollectionData* dst, const CollectionData* src, + MemoryPool* pool); void collectionRemoveElement(CollectionData* data, size_t index, MemoryPool* pool); template @@ -170,6 +172,40 @@ class VariantData { } } + bool copyFrom(const VariantData* src, MemoryPool* pool) { + release(pool); + if (!src) { + setNull(); + return true; + } + switch (src->type()) { + case VALUE_IS_ARRAY: + return collectionCopy(&toArray(), src->asArray(), pool); + case VALUE_IS_OBJECT: + return collectionCopy(&toObject(), src->asObject(), pool); + case VALUE_IS_OWNED_STRING: { + auto str = adaptString(src->asString()); + auto dup = pool->saveString(str); + if (!dup) + return false; + setOwnedString(dup); + return true; + } + case VALUE_IS_RAW_STRING: { + auto str = adaptString(src->asRawString()); + auto dup = pool->saveString(str); + if (!dup) + return false; + setRawString(dup); + return true; + } + default: + content_ = src->content_; + flags_ = src->flags_; + return true; + } + } + VariantData* getElement(size_t index) const { auto array = asArray(); if (!array) diff --git a/src/ArduinoJson/Variant/VariantFunctions.hpp b/src/ArduinoJson/Variant/VariantFunctions.hpp index cecd33e4..f2b2bdf8 100644 --- a/src/ArduinoJson/Variant/VariantFunctions.hpp +++ b/src/ArduinoJson/Variant/VariantFunctions.hpp @@ -11,9 +11,6 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE -bool collectionCopy(CollectionData* dst, const CollectionData* src, - MemoryPool* pool); - template inline typename TVisitor::result_type variantAccept(const VariantData* var, TVisitor& visitor) { @@ -27,35 +24,7 @@ inline bool variantCopyFrom(VariantData* dst, const VariantData* src, MemoryPool* pool) { if (!dst) return false; - if (!src) { - dst->setNull(); - return true; - } - switch (src->type()) { - case VALUE_IS_ARRAY: - return collectionCopy(&dst->toArray(), src->asArray(), pool); - case VALUE_IS_OBJECT: - return collectionCopy(&dst->toObject(), src->asObject(), pool); - case VALUE_IS_OWNED_STRING: { - auto str = adaptString(src->asString()); - auto dup = pool->saveString(str); - if (!dup) - return false; - dst->setOwnedString(dup); - return true; - } - case VALUE_IS_RAW_STRING: { - auto str = adaptString(src->asRawString()); - auto dup = pool->saveString(str); - if (!dup) - return false; - dst->setRawString(dup); - return true; - } - default: - *dst = *src; - return true; - } + return dst->copyFrom(src, pool); } inline void variantSetNull(VariantData* var, MemoryPool* pool) {