Add VariantData::copyFrom()

This commit is contained in:
Benoit Blanchon
2023-05-25 18:15:15 +02:00
parent ab4e8547cb
commit 779ee07de9
2 changed files with 37 additions and 32 deletions

View File

@ -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 <typename T>
@ -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)

View File

@ -11,9 +11,6 @@
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
bool collectionCopy(CollectionData* dst, const CollectionData* src,
MemoryPool* pool);
template <typename TVisitor>
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) {