Skip to content

Commit 1433658

Browse files
committed
VariantImpl: remove addValue()
This removes the two-way dependency between `JsonVariant` and `VariantImpl`
1 parent 87ec8f8 commit 1433658

File tree

7 files changed

+60
-53
lines changed

7 files changed

+60
-53
lines changed

src/ArduinoJson/Array/ArrayImpl.hpp

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#pragma once
66

77
#include <ArduinoJson/Collection/CollectionIterator.hpp>
8-
#include <ArduinoJson/Variant/VariantCompare.hpp>
98
#include <ArduinoJson/Variant/VariantImpl.hpp>
109

1110
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
@@ -28,10 +27,23 @@ inline VariantData* VariantImpl::addElement() {
2827
auto slot = allocVariant();
2928
if (!slot)
3029
return nullptr;
31-
VariantImpl::appendOne(slot);
30+
addElement(slot);
3231
return slot.ptr();
3332
}
3433

34+
inline void VariantImpl::addElement(Slot<VariantData> slot) {
35+
auto coll = getCollectionData();
36+
37+
if (coll->tail != NULL_SLOT) {
38+
auto tail = getVariant(coll->tail);
39+
tail->next = slot.id();
40+
coll->tail = slot.id();
41+
} else {
42+
coll->head = slot.id();
43+
coll->tail = slot.id();
44+
}
45+
}
46+
3547
inline VariantData* VariantImpl::getOrAddElement(size_t index) {
3648
auto it = createIterator();
3749
while (!it.done() && index > 0) {
@@ -64,22 +76,6 @@ inline void VariantImpl::removeElement(size_t index) {
6476
removeElement(at(index));
6577
}
6678

67-
template <typename T>
68-
inline bool VariantImpl::addValue(const T& value) {
69-
if (!isArray())
70-
return false;
71-
auto slot = allocVariant();
72-
if (!slot)
73-
return false;
74-
JsonVariant variant(slot.ptr(), resources_);
75-
if (!variant.set(value)) {
76-
freeVariant(slot);
77-
return false;
78-
}
79-
appendOne(slot);
80-
return true;
81-
}
82-
8379
// Returns the size (in bytes) of an array with n elements.
8480
constexpr size_t sizeofArray(size_t n) {
8581
return n * sizeof(VariantData);

src/ArduinoJson/Array/JsonArray.hpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
2525
// INTERNAL USE ONLY
2626
JsonArray(detail::VariantImpl impl) : impl_(impl) {}
2727

28+
// INTERNAL USE ONLY
29+
JsonArray(detail::VariantData* data, detail::ResourceManager* resources)
30+
: impl_(data, resources) {}
31+
2832
// Returns a JsonVariant pointing to the array.
2933
// https://arduinojson.org/v7/api/jsonvariant/
3034
operator JsonVariant() {
@@ -59,15 +63,15 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
5963
// https://arduinojson.org/v7/api/jsonarray/add/
6064
template <typename T>
6165
bool add(const T& value) const {
62-
return impl_.addValue(value);
66+
return doAdd(value);
6367
}
6468

6569
// Appends a value to the array.
6670
// https://arduinojson.org/v7/api/jsonarray/add/
6771
template <typename T,
6872
detail::enable_if_t<!detail::is_const<T>::value, int> = 0>
6973
bool add(T* value) const {
70-
return impl_.addValue(value);
74+
return doAdd(value);
7175
}
7276

7377
// Returns an iterator to the first element of the array.
@@ -203,6 +207,27 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
203207
return impl_;
204208
}
205209

210+
template <typename T>
211+
bool doAdd(const T& value) const {
212+
if (!impl_.isArray())
213+
return false;
214+
215+
auto resources = impl_.resources();
216+
ARDUINOJSON_ASSERT(resources != nullptr);
217+
218+
auto slot = resources->allocVariant();
219+
if (!slot)
220+
return false;
221+
222+
if (!JsonVariant(slot.ptr(), resources).set(value)) {
223+
detail::VariantImpl(slot.ptr(), resources).clear();
224+
resources->freeVariant(slot);
225+
return false;
226+
}
227+
impl_.addElement(slot);
228+
return true;
229+
}
230+
206231
mutable detail::VariantImpl impl_;
207232
};
208233

src/ArduinoJson/Collection/CollectionImpl.hpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,6 @@ inline VariantImpl::iterator VariantImpl::createIterator() const {
1818
return iterator(coll->head, resources_);
1919
}
2020

21-
inline void VariantImpl::appendOne(Slot<VariantData> slot) {
22-
auto coll = getCollectionData();
23-
24-
if (coll->tail != NULL_SLOT) {
25-
auto tail = getVariant(coll->tail);
26-
tail->next = slot.id();
27-
coll->tail = slot.id();
28-
} else {
29-
coll->head = slot.id();
30-
coll->tail = slot.id();
31-
}
32-
}
33-
3421
inline void VariantImpl::appendPair(Slot<VariantData> key,
3522
Slot<VariantData> value) {
3623
auto coll = getCollectionData();

src/ArduinoJson/Document/JsonDocument.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,22 +267,22 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
267267
template <typename T, detail::enable_if_t<
268268
detail::is_same<T, JsonVariant>::value, int> = 0>
269269
JsonVariant add() {
270-
return JsonVariant(getOrCreateArray().addElement(), &resources_);
270+
return getOrCreateArray().add<T>();
271271
}
272272

273273
// Appends a value to the root array.
274274
// https://arduinojson.org/v7/api/jsondocument/add/
275275
template <typename TValue>
276276
bool add(const TValue& value) {
277-
return getOrCreateArray().addValue(value);
277+
return getOrCreateArray().add(value);
278278
}
279279

280280
// Appends a value to the root array.
281281
// https://arduinojson.org/v7/api/jsondocument/add/
282282
template <typename TChar,
283283
detail::enable_if_t<!detail::is_const<TChar>::value, int> = 0>
284284
bool add(TChar* value) {
285-
return getOrCreateArray().addValue(value);
285+
return getOrCreateArray().add(value);
286286
}
287287

288288
// Removes an element of the root array.
@@ -396,8 +396,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
396396
return {&data_, &resources_};
397397
}
398398

399-
detail::VariantImpl getOrCreateArray() {
400-
return detail::VariantImpl(data_.getOrCreateArray(), &resources_);
399+
JsonArray getOrCreateArray() {
400+
return JsonArray(data_.getOrCreateArray(), &resources_);
401401
}
402402

403403
JsonVariant getVariant() {

src/ArduinoJson/Variant/VariantImpl.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,7 @@ class VariantImpl {
9494
}
9595

9696
VariantData* addElement();
97-
98-
template <typename T>
99-
bool addValue(const T& value);
97+
void addElement(Slot<VariantData> slot);
10098

10199
bool asBoolean() const {
102100
if (!data_)
@@ -518,7 +516,6 @@ class VariantImpl {
518516

519517
iterator at(size_t index) const;
520518

521-
void appendOne(Slot<VariantData> slot);
522519
void appendPair(Slot<VariantData> key, Slot<VariantData> value);
523520

524521
void removeOne(iterator it);

src/ArduinoJson/Variant/VariantRefBase.hpp

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

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

133133
// Removes an element of the array.
@@ -267,13 +267,7 @@ class VariantRefBase : public VariantTag {
267267
return VariantAttorney::getOrCreateImpl(derived());
268268
}
269269

270-
VariantImpl getOrCreateArray() const {
271-
auto impl = getOrCreateImpl();
272-
auto data = impl.data();
273-
if (data)
274-
data->getOrCreateArray();
275-
return impl;
276-
}
270+
JsonArray getOrCreateArray() const;
277271

278272
FORCE_INLINE ArduinoJson::JsonVariant getVariant() const;
279273

src/ArduinoJson/Variant/VariantRefBaseImpl.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ inline bool 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-
auto impl = getOrCreateArray();
73-
return JsonVariant(impl.addElement(), impl.resources());
72+
return getOrCreateArray().template add<T>();
7473
}
7574

7675
template <typename TDerived>
@@ -141,6 +140,15 @@ inline bool VariantRefBase<TDerived>::doSet(const T& value, true_type) const {
141140
return TConverter::toJson(value, JsonVariant(impl));
142141
}
143142

143+
template <typename TDerived>
144+
inline JsonArray VariantRefBase<TDerived>::getOrCreateArray() const {
145+
auto impl = getOrCreateImpl();
146+
auto data = impl.data();
147+
if (data)
148+
data->getOrCreateArray();
149+
return JsonArray(impl);
150+
}
151+
144152
template <typename TDerived>
145153
template <typename T, enable_if_t<is_same<T, JsonArray>::value, int>>
146154
inline JsonArray VariantRefBase<TDerived>::to() const {

0 commit comments

Comments
 (0)