Skip to content

Commit 462fab6

Browse files
committed
Extract ArrayImpl, CollectionImpl, and ObjectImpl
1 parent 2feb07d commit 462fab6

26 files changed

+376
-474
lines changed

src/ArduinoJson/Array/ArrayData.hpp

Lines changed: 12 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,59 +8,30 @@
88

99
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1010

11-
class ArrayData : public CollectionData {
11+
class ArrayImpl : public CollectionImpl {
1212
public:
13-
VariantData* addElement(ResourceManager* resources);
13+
ArrayImpl() {}
1414

15-
static VariantData* addElement(ArrayData* array, ResourceManager* resources) {
16-
if (!array)
17-
return nullptr;
18-
return array->addElement(resources);
19-
}
15+
ArrayImpl(CollectionData* data, ResourceManager* resources)
16+
: CollectionImpl(data, resources) {}
2017

21-
template <typename T>
22-
bool addValue(const T& value, ResourceManager* resources);
18+
VariantData* addElement();
2319

2420
template <typename T>
25-
static bool addValue(ArrayData* array, const T& value,
26-
ResourceManager* resources) {
27-
if (!array)
28-
return false;
29-
return array->addValue(value, resources);
30-
}
21+
bool addValue(const T& value);
3122

32-
VariantData* getOrAddElement(size_t index, ResourceManager* resources);
23+
VariantData* getOrAddElement(size_t index);
3324

34-
VariantData* getElement(size_t index, const ResourceManager* resources) const;
35-
36-
static VariantData* getElement(const ArrayData* array, size_t index,
37-
const ResourceManager* resources) {
38-
if (!array)
39-
return nullptr;
40-
return array->getElement(index, resources);
41-
}
25+
VariantData* getElement(size_t index) const;
4226

43-
void removeElement(size_t index, ResourceManager* resources);
44-
45-
static void removeElement(ArrayData* array, size_t index,
46-
ResourceManager* resources) {
47-
if (!array)
48-
return;
49-
array->removeElement(index, resources);
50-
}
51-
52-
void remove(iterator it, ResourceManager* resources) {
53-
CollectionData::removeOne(it, resources);
54-
}
27+
void removeElement(size_t index);
5528

56-
static void remove(ArrayData* array, iterator it,
57-
ResourceManager* resources) {
58-
if (array)
59-
return array->remove(it, resources);
29+
void remove(iterator it) {
30+
CollectionImpl::removeOne(it);
6031
}
6132

6233
private:
63-
iterator at(size_t index, const ResourceManager* resources) const;
34+
iterator at(size_t index) const;
6435
};
6536

6637
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Array/ArrayImpl.hpp

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,64 +10,66 @@
1010

1111
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1212

13-
inline ArrayData::iterator ArrayData::at(
14-
size_t index, const ResourceManager* resources) const {
15-
auto it = createIterator(resources);
13+
inline ArrayImpl::iterator ArrayImpl::at(size_t index) const {
14+
auto it = createIterator();
1615
while (!it.done() && index) {
17-
it.next(resources);
16+
it.next(resources_);
1817
--index;
1918
}
2019
return it;
2120
}
2221

23-
inline VariantData* ArrayData::addElement(ResourceManager* resources) {
24-
auto slot = resources->allocVariant();
22+
inline VariantData* ArrayImpl::addElement() {
23+
if (!data_)
24+
return nullptr;
25+
ARDUINOJSON_ASSERT(resources_ != nullptr);
26+
auto slot = resources_->allocVariant();
2527
if (!slot)
2628
return nullptr;
27-
CollectionData::appendOne(slot, resources);
29+
CollectionImpl::appendOne(slot);
2830
return slot.ptr();
2931
}
3032

31-
inline VariantData* ArrayData::getOrAddElement(size_t index,
32-
ResourceManager* resources) {
33-
auto it = createIterator(resources);
33+
inline VariantData* ArrayImpl::getOrAddElement(size_t index) {
34+
auto it = createIterator();
3435
while (!it.done() && index > 0) {
35-
it.next(resources);
36+
it.next(resources_);
3637
index--;
3738
}
3839
if (it.done())
3940
index++;
4041
VariantData* element = it.data();
4142
while (index > 0) {
42-
element = addElement(resources);
43+
element = addElement();
4344
if (!element)
4445
return nullptr;
4546
index--;
4647
}
4748
return element;
4849
}
4950

50-
inline VariantData* ArrayData::getElement(
51-
size_t index, const ResourceManager* resources) const {
52-
return at(index, resources).data();
51+
inline VariantData* ArrayImpl::getElement(size_t index) const {
52+
return at(index).data();
5353
}
5454

55-
inline void ArrayData::removeElement(size_t index, ResourceManager* resources) {
56-
remove(at(index, resources), resources);
55+
inline void ArrayImpl::removeElement(size_t index) {
56+
remove(at(index));
5757
}
5858

5959
template <typename T>
60-
inline bool ArrayData::addValue(const T& value, ResourceManager* resources) {
61-
ARDUINOJSON_ASSERT(resources != nullptr);
62-
auto slot = resources->allocVariant();
60+
inline bool ArrayImpl::addValue(const T& value) {
61+
if (!data_)
62+
return false;
63+
ARDUINOJSON_ASSERT(resources_ != nullptr);
64+
auto slot = resources_->allocVariant();
6365
if (!slot)
6466
return false;
65-
JsonVariant variant(slot.ptr(), resources);
67+
JsonVariant variant(slot.ptr(), resources_);
6668
if (!variant.set(value)) {
67-
resources->freeVariant(slot);
69+
resources_->freeVariant(slot);
6870
return false;
6971
}
70-
CollectionData::appendOne(slot, resources);
72+
CollectionImpl::appendOne(slot);
7173
return true;
7274
}
7375

src/ArduinoJson/Array/ElementProxy.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ class ElementProxy : public VariantRefBase<ElementProxy<TUpstream>>,
5555
}
5656

5757
FORCE_INLINE VariantData* getData() const {
58-
return VariantData::getElement(
59-
VariantAttorney::getData(upstream_), index_,
60-
VariantAttorney::getResourceManager(upstream_));
58+
auto data = VariantAttorney::getData(upstream_);
59+
auto resources = VariantAttorney::getResourceManager(upstream_);
60+
return VariantData::asArray(data, resources).getElement(index_);
6161
}
6262

6363
VariantData* getOrCreateData() const {

src/ArduinoJson/Array/JsonArray.hpp

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,25 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
2020
using iterator = JsonArrayIterator;
2121

2222
// Constructs an unbound reference.
23-
JsonArray() : data_(0), resources_(0) {}
23+
JsonArray() {}
2424

2525
// INTERNAL USE ONLY
2626
JsonArray(detail::VariantData* data, detail::ResourceManager* resources)
27-
: data_(data), resources_(resources) {}
27+
: impl_(detail::VariantData::asArray(data, resources)) {}
28+
29+
// INTERNAL USE ONLY
30+
JsonArray(const detail::ArrayImpl& impl) : impl_(impl) {}
2831

2932
// Returns a JsonVariant pointing to the array.
3033
// https://arduinojson.org/v7/api/jsonvariant/
3134
operator JsonVariant() {
32-
void* data = data_; // prevent warning cast-align
33-
return JsonVariant(reinterpret_cast<detail::VariantData*>(data),
34-
resources_);
35+
return JsonVariant(getData(), getResourceManager());
3536
}
3637

3738
// Returns a read-only reference to the array.
3839
// https://arduinojson.org/v7/api/jsonarrayconst/
3940
operator JsonArrayConst() const {
40-
return JsonArrayConst(getData(), resources_);
41+
return JsonArrayConst(getData(), getResourceManager());
4142
}
4243

4344
// Appends a new (empty) element to the array.
@@ -55,32 +56,28 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
5556
template <typename T, detail::enable_if_t<
5657
detail::is_same<T, JsonVariant>::value, int> = 0>
5758
JsonVariant add() const {
58-
return JsonVariant(detail::VariantData::addElement(data_, resources_),
59-
resources_);
59+
return JsonVariant(impl_.addElement(), 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 detail::VariantData::addValue(data_, value, resources_);
66+
return impl_.addValue(value);
6767
}
6868

6969
// Appends a value to the array.
7070
// https://arduinojson.org/v7/api/jsonarray/add/
7171
template <typename T,
7272
detail::enable_if_t<!detail::is_const<T>::value, int> = 0>
7373
bool add(T* value) const {
74-
return detail::VariantData::addValue(data_, value, resources_);
74+
return impl_.addValue(value);
7575
}
7676

7777
// Returns an iterator to the first element of the array.
7878
// https://arduinojson.org/v7/api/jsonarray/begin/
7979
iterator begin() const {
80-
auto array = detail::VariantData::asArray(data_);
81-
if (!array)
82-
return iterator();
83-
return iterator(array->createIterator(resources_), resources_);
80+
return iterator(impl_.createIterator(), impl_.getResourceManager());
8481
}
8582

8683
// Returns an iterator following the last element of the array.
@@ -92,7 +89,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
9289
// Copies an array.
9390
// https://arduinojson.org/v7/api/jsonarray/set/
9491
bool set(JsonArrayConst src) const {
95-
if (!data_)
92+
if (isNull())
9693
return false;
9794

9895
clear();
@@ -107,14 +104,13 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
107104
// Removes the element at the specified iterator.
108105
// https://arduinojson.org/v7/api/jsonarray/remove/
109106
void remove(iterator it) const {
110-
detail::ArrayData::remove(detail::VariantData::asArray(data_), it.iterator_,
111-
resources_);
107+
impl_.remove(it.iterator_);
112108
}
113109

114110
// Removes the element at the specified index.
115111
// https://arduinojson.org/v7/api/jsonarray/remove/
116112
void remove(size_t index) const {
117-
detail::VariantData::removeElement(data_, index, resources_);
113+
impl_.removeElement(index);
118114
}
119115

120116
// Removes the element at the specified index.
@@ -129,7 +125,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
129125
// Removes all the elements of the array.
130126
// https://arduinojson.org/v7/api/jsonarray/clear/
131127
void clear() const {
132-
detail::ArrayData::clear(detail::VariantData::asArray(data_), resources_);
128+
impl_.clear();
133129
}
134130

135131
// Gets or sets the element at the specified index.
@@ -152,13 +148,13 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
152148
}
153149

154150
operator JsonVariantConst() const {
155-
return JsonVariantConst(data_, resources_);
151+
return JsonVariantConst(getData(), getResourceManager());
156152
}
157153

158154
// Returns true if the reference is unbound.
159155
// https://arduinojson.org/v7/api/jsonarray/isnull/
160156
bool isNull() const {
161-
return !data_ || !data_->isArray();
157+
return impl_.isNull();
162158
}
163159

164160
// Returns true if the reference is bound.
@@ -170,13 +166,13 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
170166
// Returns the depth (nesting level) of the array.
171167
// https://arduinojson.org/v7/api/jsonarray/nesting/
172168
size_t nesting() const {
173-
return detail::VariantData::nesting(data_, resources_);
169+
return impl_.nesting();
174170
}
175171

176172
// Returns the number of elements in the array.
177173
// https://arduinojson.org/v7/api/jsonarray/size/
178174
size_t size() const {
179-
return data_ ? data_->size(resources_) : 0;
175+
return impl_.size();
180176
}
181177

182178
// DEPRECATED: use add<JsonVariant>() instead
@@ -203,19 +199,18 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
203199

204200
private:
205201
detail::ResourceManager* getResourceManager() const {
206-
return resources_;
202+
return impl_.getResourceManager();
207203
}
208204

209205
detail::VariantData* getData() const {
210-
return data_;
206+
return impl_.getData();
211207
}
212208

213209
detail::VariantData* getOrCreateData() const {
214-
return data_;
210+
return impl_.getData();
215211
}
216212

217-
detail::VariantData* data_;
218-
detail::ResourceManager* resources_;
213+
mutable detail::ArrayImpl impl_;
219214
};
220215

221216
ARDUINOJSON_END_PUBLIC_NAMESPACE

0 commit comments

Comments
 (0)