forked from bblanchon/ArduinoJson
Add VariantData::copyFrom()
This commit is contained in:
@ -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)
|
||||
|
@ -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) {
|
||||
|
Reference in New Issue
Block a user