Skip to content

Commit c61d173

Browse files
committed
VariantImpl: add copyVariant() and copyCollection() (WIP)
1 parent f680598 commit c61d173

File tree

8 files changed

+74
-66
lines changed

8 files changed

+74
-66
lines changed

src/ArduinoJson.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
#include "ArduinoJson/Object/MemberProxy.hpp"
4949
#include "ArduinoJson/Object/ObjectImpl.hpp"
5050
#include "ArduinoJson/Variant/ConverterImpl.hpp"
51-
#include "ArduinoJson/Variant/JsonVariantCopier.hpp"
5251
#include "ArduinoJson/Variant/VariantCompare.hpp"
5352
#include "ArduinoJson/Variant/VariantRefBaseImpl.hpp"
5453

src/ArduinoJson/Array/JsonArray.hpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,10 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
8989
// Copies an array.
9090
// https://arduinojson.org/v7/api/jsonarray/set/
9191
bool set(JsonArrayConst src) const {
92-
if (isNull())
93-
return false;
94-
95-
clear();
96-
for (auto element : src) {
97-
if (!add(element))
98-
return false;
99-
}
100-
101-
return true;
92+
impl_.clear();
93+
if (src.isNull())
94+
return true;
95+
return impl_.copyCollection(detail::VariantAttorney::getImpl(src));
10296
}
10397

10498
// Removes the element at the specified iterator.

src/ArduinoJson/Collection/CollectionImpl.hpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,25 @@ inline size_t VariantImpl::size() const {
108108
return count;
109109
}
110110

111+
inline bool VariantImpl::copyCollection(const VariantImpl& src) {
112+
ARDUINOJSON_ASSERT(src.type() & VariantTypeBits::CollectionMask);
113+
ARDUINOJSON_ASSERT(isNull());
114+
115+
if (!data_)
116+
return false;
117+
118+
data_->toCollection(src.type());
119+
120+
for (auto it = src.createIterator(); !it.done(); it.move()) {
121+
auto slot = allocVariant();
122+
auto impl = VariantImpl(slot.ptr(), resources_);
123+
if (!impl.copyVariant(*it)) {
124+
freeVariant(slot);
125+
return false;
126+
}
127+
appendOne(slot);
128+
}
129+
return true;
130+
}
131+
111132
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Object/JsonObject.hpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,10 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
8383
// Copies an object.
8484
// https://arduinojson.org/v7/api/jsonobject/set/
8585
bool set(JsonObjectConst src) {
86-
if (isNull() || src.isNull())
87-
return false;
88-
89-
clear();
90-
for (auto kvp : src) {
91-
if (!operator[](kvp.key()).set(kvp.value()))
92-
return false;
93-
}
94-
95-
return true;
86+
impl_.clear();
87+
if (src.isNull())
88+
return true;
89+
return impl_.copyCollection(detail::VariantAttorney::getImpl(src));
9690
}
9791

9892
// Gets or sets the member with specified key.

src/ArduinoJson/Variant/JsonVariant.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,12 @@ class JsonVariant : public detail::VariantRefBase<JsonVariant>,
3737
mutable detail::VariantImpl impl_;
3838
};
3939

40-
namespace detail {
41-
bool copyVariant(JsonVariant dst, JsonVariantConst src);
42-
}
43-
4440
template <>
4541
struct Converter<JsonVariant> : private detail::VariantAttorney {
4642
static bool toJson(JsonVariantConst src, JsonVariant dst) {
47-
return copyVariant(dst, src);
43+
auto impl = getImpl(dst);
44+
impl.clear();
45+
return impl.copyVariant(getImpl(src));
4846
}
4947

5048
static JsonVariant fromJson(JsonVariant src) {
@@ -59,7 +57,9 @@ struct Converter<JsonVariant> : private detail::VariantAttorney {
5957
template <>
6058
struct Converter<JsonVariantConst> : private detail::VariantAttorney {
6159
static bool toJson(JsonVariantConst src, JsonVariant dst) {
62-
return copyVariant(dst, src);
60+
auto impl = getImpl(dst);
61+
impl.clear();
62+
return impl.copyVariant(getImpl(src));
6363
}
6464

6565
static JsonVariantConst fromJson(JsonVariantConst src) {

src/ArduinoJson/Variant/JsonVariantCopier.hpp

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/ArduinoJson/Variant/VariantData.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,19 @@ struct VariantData {
8585
}
8686

8787
VariantData* toArray() {
88+
return toCollection(VariantType::Array);
89+
}
90+
91+
VariantData* toCollection(VariantType collectionType) {
8892
ARDUINOJSON_ASSERT(type == VariantType::Null);
89-
type = VariantType::Array;
93+
ARDUINOJSON_ASSERT(collectionType & VariantTypeBits::CollectionMask);
94+
type = collectionType;
9095
new (&content.asCollection) CollectionData();
9196
return this;
9297
}
9398

9499
VariantData* toObject() {
95-
ARDUINOJSON_ASSERT(type == VariantType::Null);
96-
type = VariantType::Object;
97-
new (&content.asCollection) CollectionData();
98-
return this;
100+
return toCollection(VariantType::Object);
99101
}
100102

101103
VariantData* getOrCreateArray() {

src/ArduinoJson/Variant/VariantImpl.hpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,38 @@ class VariantImpl {
354354

355355
void removeMember(iterator it);
356356

357+
bool copyArray(const VariantImpl& src) {
358+
if (!src.isArray())
359+
return false;
360+
return copyCollection(src);
361+
}
362+
363+
bool copyVariant(const VariantImpl& src) {
364+
switch (src.type()) {
365+
case VariantType::Null:
366+
return true;
367+
368+
case VariantType::Array:
369+
case VariantType::Object:
370+
return copyCollection(src);
371+
372+
case VariantType::RawString:
373+
return setRawString(adaptString(src.asRawString()));
374+
375+
case VariantType::LinkedString:
376+
return setLinkedString(src.asLinkedString());
377+
378+
case VariantType::OwnedString:
379+
return setOwnedString(adaptString(src.asString()));
380+
381+
default:
382+
*data_ = *src.data_;
383+
return true;
384+
}
385+
}
386+
387+
bool copyCollection(const VariantImpl& src);
388+
357389
bool setBoolean(bool value) {
358390
if (!data_)
359391
return false;

0 commit comments

Comments
 (0)