Skip to content

Commit c4c5c69

Browse files
committed
VariantImpl: move addValue() to JsonArray
This way VariantImpl doesn't need to support generic types, which removes the dependency from `VariantImpl` to `JsonVariant`.
1 parent b017dfb commit c4c5c69

File tree

9 files changed

+66
-63
lines changed

9 files changed

+66
-63
lines changed

src/ArduinoJson/Array/ArrayImpl.hpp

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ inline VariantImpl::iterator VariantImpl::at(size_t index) const {
2121
return it;
2222
}
2323

24-
inline VariantData* VariantImpl::addElement(VariantData* data,
25-
ResourceManager* resources) {
24+
inline VariantData* VariantImpl::addNewElement(VariantData* data,
25+
ResourceManager* resources) {
2626
ARDUINOJSON_ASSERT(data != nullptr);
2727
ARDUINOJSON_ASSERT(data->isArray());
2828
ARDUINOJSON_ASSERT(resources != nullptr);
2929

3030
auto slot = resources->allocVariant();
3131
if (!slot)
3232
return nullptr;
33-
appendOne(slot, data, resources);
33+
addElement(slot, data, resources);
3434
return slot.ptr();
3535
}
3636

@@ -44,7 +44,7 @@ inline VariantData* VariantImpl::getOrAddElement(size_t index) {
4444
index++;
4545
VariantData* element = it.data();
4646
while (index > 0) {
47-
element = addElement();
47+
element = addNewElement();
4848
if (!element)
4949
return nullptr;
5050
index--;
@@ -60,23 +60,6 @@ inline void VariantImpl::removeElement(size_t index) {
6060
removeElement(at(index));
6161
}
6262

63-
template <typename T>
64-
inline bool VariantImpl::addValue(const T& value, VariantData* data,
65-
ResourceManager* resources) {
66-
ARDUINOJSON_ASSERT(data != nullptr);
67-
ARDUINOJSON_ASSERT(resources != nullptr);
68-
auto slot = resources->allocVariant();
69-
if (!slot)
70-
return false;
71-
JsonVariant variant(slot.ptr(), resources);
72-
if (!variant.set(value)) {
73-
freeVariant(slot, resources);
74-
return false;
75-
}
76-
appendOne(slot, data, resources);
77-
return true;
78-
}
79-
8063
// Returns the size (in bytes) of an array with n elements.
8164
constexpr size_t sizeofArray(size_t n) {
8265
return n * sizeof(VariantData);

src/ArduinoJson/Array/JsonArray.hpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,26 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
5656
template <typename T, detail::enable_if_t<
5757
detail::is_same<T, JsonVariant>::value, int> = 0>
5858
JsonVariant add() const {
59-
return JsonVariant(impl_.addElement(), impl_.getResourceManager());
59+
return JsonVariant(impl_.addNewElement(), impl_.getResourceManager());
6060
}
6161

6262
// Appends a value to the array.
6363
// https://arduinojson.org/v7/api/jsonarray/add/
6464
template <typename T>
6565
bool add(const T& value) const {
66-
return impl_.addValue(value);
66+
if (!impl_.isArray())
67+
return false;
68+
return addValue(value, impl_.getData(), impl_.getResourceManager());
6769
}
6870

6971
// Appends a value to the array.
7072
// https://arduinojson.org/v7/api/jsonarray/add/
7173
template <typename T,
7274
detail::enable_if_t<!detail::is_const<T>::value, int> = 0>
7375
bool add(T* value) const {
74-
return impl_.addValue(value);
76+
if (!impl_.isArray())
77+
return false;
78+
return addValue(value, impl_.getData(), impl_.getResourceManager());
7579
}
7680

7781
// Returns an iterator to the first element of the array.
@@ -207,6 +211,28 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
207211
return impl_.getData();
208212
}
209213

214+
// HACK: this function has been pulled out of VariantImpl to avoid the
215+
// circular dependency between VariantImpl and JsonVariant
216+
template <typename T>
217+
static bool addValue(const T& value, detail::VariantData* data,
218+
detail::ResourceManager* resources) {
219+
ARDUINOJSON_ASSERT(data != nullptr);
220+
ARDUINOJSON_ASSERT(data->isArray());
221+
ARDUINOJSON_ASSERT(resources != nullptr);
222+
223+
auto slot = resources->allocVariant();
224+
if (!slot)
225+
return false;
226+
227+
if (!JsonVariant(slot.ptr(), resources).set(value)) {
228+
detail::VariantImpl::freeVariant(slot, resources);
229+
return false;
230+
}
231+
232+
detail::VariantImpl::addElement(slot, data, resources);
233+
return true;
234+
}
235+
210236
mutable detail::VariantImpl impl_;
211237
};
212238

src/ArduinoJson/Collection/CollectionImpl.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ inline VariantImpl::iterator VariantImpl::createIterator(
2424
return iterator(resources->getVariant(head), head);
2525
}
2626

27-
inline void VariantImpl::appendOne(Slot<VariantData> slot, VariantData* data,
28-
ResourceManager* resources) {
27+
inline void VariantImpl::addElement(Slot<VariantData> slot, VariantData* data,
28+
ResourceManager* resources) {
2929
ARDUINOJSON_ASSERT(data != nullptr);
3030
ARDUINOJSON_ASSERT(data->isCollection());
3131
ARDUINOJSON_ASSERT(resources != nullptr);

src/ArduinoJson/Document/JsonDocument.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,22 +287,22 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
287287
template <typename T, detail::enable_if_t<
288288
detail::is_same<T, JsonVariant>::value, int> = 0>
289289
JsonVariant add() {
290-
return JsonVariant(getOrCreateArray().addElement(), &resources_);
290+
return getOrCreateArray().add<T>();
291291
}
292292

293293
// Appends a value to the root array.
294294
// https://arduinojson.org/v7/api/jsondocument/add/
295295
template <typename TValue>
296296
bool add(const TValue& value) {
297-
return getOrCreateArray().addValue(value);
297+
return getOrCreateArray().add(value);
298298
}
299299

300300
// Appends a value to the root array.
301301
// https://arduinojson.org/v7/api/jsondocument/add/
302302
template <typename TChar,
303303
detail::enable_if_t<!detail::is_const<TChar>::value, int> = 0>
304304
bool add(TChar* value) {
305-
return getOrCreateArray().addValue(value);
305+
return getOrCreateArray().add(value);
306306
}
307307

308308
// Removes an element of the root array.
@@ -412,10 +412,10 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
412412
return detail::VariantImpl(&data_, &resources_);
413413
}
414414

415-
detail::VariantImpl getOrCreateArray() const {
415+
JsonArray getOrCreateArray() const {
416416
if (data_.type == detail::VariantType::Null)
417417
data_.toArray();
418-
return detail::VariantImpl(&data_, &resources_);
418+
return JsonArray(&data_, &resources_);
419419
}
420420

421421
JsonVariant getVariant() {

src/ArduinoJson/Json/JsonDeserializer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ class JsonDeserializer {
174174
for (;;) {
175175
if (elementFilter.allow()) {
176176
// Allocate slot in array
177-
VariantData* value = VariantImpl::addElement(array, resources_);
177+
VariantData* value = VariantImpl::addNewElement(array, resources_);
178178
if (!value)
179179
return DeserializationError::NoMemory;
180180

src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ class MsgPackDeserializer {
360360
VariantData* value;
361361

362362
if (elementFilter.allow()) {
363-
value = VariantImpl::addElement(variant, resources_);
363+
value = VariantImpl::addNewElement(variant, resources_);
364364
if (!value)
365365
return DeserializationError::NoMemory;
366366
} else {

src/ArduinoJson/Variant/VariantImpl.hpp

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,16 @@ class VariantImpl {
9696
}
9797
}
9898

99-
VariantData* addElement() {
99+
VariantData* addNewElement() {
100100
if (!isArray())
101101
return nullptr;
102-
return addElement(data_, resources_);
102+
return addNewElement(data_, resources_);
103103
}
104104

105-
static VariantData* addElement(VariantData*, ResourceManager*);
105+
static VariantData* addNewElement(VariantData*, ResourceManager*);
106+
107+
static void addElement(Slot<VariantData> slot, VariantData*,
108+
ResourceManager*);
106109

107110
template <typename TAdaptedString>
108111
VariantData* addMember(TAdaptedString key) {
@@ -124,16 +127,6 @@ class VariantImpl {
124127
static VariantData* addPair(VariantData** value, VariantData*,
125128
ResourceManager*);
126129

127-
template <typename T>
128-
bool addValue(const T& value) {
129-
if (!isArray())
130-
return false;
131-
return addValue(value, data_, resources_);
132-
}
133-
134-
template <typename T>
135-
static bool addValue(const T& value, VariantData*, ResourceManager*);
136-
137130
bool asBoolean() const {
138131
return asBoolean(data_, resources_);
139132
}
@@ -613,6 +606,11 @@ class VariantImpl {
613606

614607
static void empty(VariantData*, ResourceManager*);
615608

609+
static void freeVariant(Slot<VariantData> slot, ResourceManager* resources) {
610+
clear(slot.ptr(), resources);
611+
resources->freeVariant(slot);
612+
}
613+
616614
private:
617615
VariantData* data_;
618616
ResourceManager* resources_;
@@ -627,19 +625,12 @@ class VariantImpl {
627625
template <typename TAdaptedString>
628626
static iterator findKey(TAdaptedString key, VariantData*, ResourceManager*);
629627

630-
static void appendOne(Slot<VariantData> slot, VariantData*, ResourceManager*);
631-
632628
static void appendPair(Slot<VariantData> key, Slot<VariantData> value,
633629
VariantData*, ResourceManager*);
634630

635631
void removeOne(iterator it);
636632
void removePair(iterator it);
637633

638-
static void freeVariant(Slot<VariantData> slot, ResourceManager* resources) {
639-
clear(slot.ptr(), resources);
640-
resources->freeVariant(slot);
641-
}
642-
643634
Slot<VariantData> getPreviousSlot(VariantData*) const;
644635
};
645636

src/ArduinoJson/Variant/VariantRefBase.hpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,14 @@ class VariantRefBase : public VariantTag {
119119
// https://arduinojson.org/v7/api/jsonvariant/add/
120120
template <typename T>
121121
bool add(const T& value) const {
122-
return getOrCreateArray().addValue(value);
122+
return getOrCreateArray().add(value);
123123
}
124124

125125
// Appends a value to the array.
126126
// https://arduinojson.org/v7/api/jsonvariant/add/
127127
template <typename T, enable_if_t<!is_const<T>::value, int> = 0>
128128
bool add(T* value) const {
129-
return getOrCreateArray().addValue(value);
129+
return getOrCreateArray().add(value);
130130
}
131131

132132
// Removes an element of the array.
@@ -278,13 +278,7 @@ class VariantRefBase : public VariantTag {
278278
return VariantImpl(getOrCreateData(), getResourceManager());
279279
}
280280

281-
VariantImpl getOrCreateArray() const {
282-
auto data = getOrCreateData();
283-
auto resources = getResourceManager();
284-
if (data && data->type == VariantType::Null)
285-
data->toArray();
286-
return VariantImpl(data, resources);
287-
}
281+
JsonArray getOrCreateArray() const;
288282

289283
FORCE_INLINE ArduinoJson::JsonVariant getVariant() const;
290284

src/ArduinoJson/Variant/VariantRefBaseImpl.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ inline void convertToJson(const VariantRefBase<TDerived>& src,
6969
template <typename TDerived>
7070
template <typename T, enable_if_t<is_same<T, JsonVariant>::value, int>>
7171
inline T VariantRefBase<TDerived>::add() const {
72-
return JsonVariant(getOrCreateArray().addElement(), getResourceManager());
72+
return getOrCreateArray().template add<T>();
7373
}
7474

7575
template <typename TDerived>
@@ -95,6 +95,15 @@ inline JsonVariant VariantRefBase<TDerived>::getVariant() const {
9595
return JsonVariant(getData(), getResourceManager());
9696
}
9797

98+
template <typename TDerived>
99+
inline JsonArray VariantRefBase<TDerived>::getOrCreateArray() const {
100+
auto data = getOrCreateData();
101+
auto resources = getResourceManager();
102+
if (data && data->type == VariantType::Null)
103+
data->toArray();
104+
return JsonArray(data, resources);
105+
}
106+
98107
template <typename TDerived>
99108
inline JsonVariant VariantRefBase<TDerived>::getOrCreateVariant() const {
100109
return JsonVariant(getOrCreateData(), getResourceManager());

0 commit comments

Comments
 (0)