forked from bblanchon/ArduinoJson
Add VariantData::copyFrom()
This commit is contained in:
@@ -15,6 +15,8 @@
|
|||||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||||
|
|
||||||
VariantData* collectionAddElement(CollectionData* array, MemoryPool* pool);
|
VariantData* collectionAddElement(CollectionData* array, MemoryPool* pool);
|
||||||
|
bool collectionCopy(CollectionData* dst, const CollectionData* src,
|
||||||
|
MemoryPool* pool);
|
||||||
void collectionRemoveElement(CollectionData* data, size_t index,
|
void collectionRemoveElement(CollectionData* data, size_t index,
|
||||||
MemoryPool* pool);
|
MemoryPool* pool);
|
||||||
template <typename T>
|
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 {
|
VariantData* getElement(size_t index) const {
|
||||||
auto array = asArray();
|
auto array = asArray();
|
||||||
if (!array)
|
if (!array)
|
||||||
|
@@ -11,9 +11,6 @@
|
|||||||
|
|
||||||
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
||||||
|
|
||||||
bool collectionCopy(CollectionData* dst, const CollectionData* src,
|
|
||||||
MemoryPool* pool);
|
|
||||||
|
|
||||||
template <typename TVisitor>
|
template <typename TVisitor>
|
||||||
inline typename TVisitor::result_type variantAccept(const VariantData* var,
|
inline typename TVisitor::result_type variantAccept(const VariantData* var,
|
||||||
TVisitor& visitor) {
|
TVisitor& visitor) {
|
||||||
@@ -27,35 +24,7 @@ inline bool variantCopyFrom(VariantData* dst, const VariantData* src,
|
|||||||
MemoryPool* pool) {
|
MemoryPool* pool) {
|
||||||
if (!dst)
|
if (!dst)
|
||||||
return false;
|
return false;
|
||||||
if (!src) {
|
return dst->copyFrom(src, pool);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void variantSetNull(VariantData* var, MemoryPool* pool) {
|
inline void variantSetNull(VariantData* var, MemoryPool* pool) {
|
||||||
|
Reference in New Issue
Block a user