@@ -20,24 +20,25 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
20
20
using iterator = JsonArrayIterator;
21
21
22
22
// Constructs an unbound reference.
23
- JsonArray () : data_( 0 ), resources_( 0 ) {}
23
+ JsonArray () {}
24
24
25
25
// INTERNAL USE ONLY
26
26
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) {}
28
31
29
32
// Returns a JsonVariant pointing to the array.
30
33
// https://arduinojson.org/v7/api/jsonvariant/
31
34
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 ());
35
36
}
36
37
37
38
// Returns a read-only reference to the array.
38
39
// https://arduinojson.org/v7/api/jsonarrayconst/
39
40
operator JsonArrayConst () const {
40
- return JsonArrayConst (getData (), resources_ );
41
+ return JsonArrayConst (getData (), getResourceManager () );
41
42
}
42
43
43
44
// Appends a new (empty) element to the array.
@@ -55,32 +56,28 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
55
56
template <typename T, detail::enable_if_t <
56
57
detail::is_same<T, JsonVariant>::value, int > = 0 >
57
58
JsonVariant add () const {
58
- return JsonVariant (detail::VariantData::addElement (data_, resources_),
59
- resources_);
59
+ return JsonVariant (impl_.addElement (), impl_.getResourceManager ());
60
60
}
61
61
62
62
// Appends a value to the array.
63
63
// https://arduinojson.org/v7/api/jsonarray/add/
64
64
template <typename T>
65
65
bool add (const T& value) const {
66
- return detail::VariantData:: addValue (data_, value, resources_ );
66
+ return impl_. addValue (value);
67
67
}
68
68
69
69
// Appends a value to the array.
70
70
// https://arduinojson.org/v7/api/jsonarray/add/
71
71
template <typename T,
72
72
detail::enable_if_t <!detail::is_const<T>::value, int > = 0 >
73
73
bool add (T* value) const {
74
- return detail::VariantData:: addValue (data_, value, resources_ );
74
+ return impl_. addValue (value);
75
75
}
76
76
77
77
// Returns an iterator to the first element of the array.
78
78
// https://arduinojson.org/v7/api/jsonarray/begin/
79
79
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 ());
84
81
}
85
82
86
83
// Returns an iterator following the last element of the array.
@@ -92,7 +89,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
92
89
// Copies an array.
93
90
// https://arduinojson.org/v7/api/jsonarray/set/
94
91
bool set (JsonArrayConst src) const {
95
- if (!data_ )
92
+ if (isNull () )
96
93
return false ;
97
94
98
95
clear ();
@@ -107,14 +104,13 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
107
104
// Removes the element at the specified iterator.
108
105
// https://arduinojson.org/v7/api/jsonarray/remove/
109
106
void remove (iterator it) const {
110
- detail::ArrayData::remove (detail::VariantData::asArray (data_), it.iterator_ ,
111
- resources_);
107
+ impl_.remove (it.iterator_ );
112
108
}
113
109
114
110
// Removes the element at the specified index.
115
111
// https://arduinojson.org/v7/api/jsonarray/remove/
116
112
void remove (size_t index) const {
117
- detail::VariantData:: removeElement (data_, index, resources_ );
113
+ impl_. removeElement (index);
118
114
}
119
115
120
116
// Removes the element at the specified index.
@@ -129,7 +125,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
129
125
// Removes all the elements of the array.
130
126
// https://arduinojson.org/v7/api/jsonarray/clear/
131
127
void clear () const {
132
- detail::ArrayData:: clear (detail::VariantData::asArray (data_), resources_ );
128
+ impl_. clear ();
133
129
}
134
130
135
131
// Gets or sets the element at the specified index.
@@ -152,13 +148,13 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
152
148
}
153
149
154
150
operator JsonVariantConst () const {
155
- return JsonVariantConst (data_, resources_ );
151
+ return JsonVariantConst (getData (), getResourceManager () );
156
152
}
157
153
158
154
// Returns true if the reference is unbound.
159
155
// https://arduinojson.org/v7/api/jsonarray/isnull/
160
156
bool isNull () const {
161
- return !data_ || !data_-> isArray ();
157
+ return impl_. isNull ();
162
158
}
163
159
164
160
// Returns true if the reference is bound.
@@ -170,13 +166,13 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
170
166
// Returns the depth (nesting level) of the array.
171
167
// https://arduinojson.org/v7/api/jsonarray/nesting/
172
168
size_t nesting () const {
173
- return detail::VariantData:: nesting (data_, resources_ );
169
+ return impl_. nesting ();
174
170
}
175
171
176
172
// Returns the number of elements in the array.
177
173
// https://arduinojson.org/v7/api/jsonarray/size/
178
174
size_t size () const {
179
- return data_ ? data_-> size (resources_) : 0 ;
175
+ return impl_. size () ;
180
176
}
181
177
182
178
// DEPRECATED: use add<JsonVariant>() instead
@@ -203,19 +199,18 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
203
199
204
200
private:
205
201
detail::ResourceManager* getResourceManager () const {
206
- return resources_ ;
202
+ return impl_. getResourceManager () ;
207
203
}
208
204
209
205
detail::VariantData* getData () const {
210
- return data_ ;
206
+ return impl_. getData () ;
211
207
}
212
208
213
209
detail::VariantData* getOrCreateData () const {
214
- return data_ ;
210
+ return impl_. getData () ;
215
211
}
216
212
217
- detail::VariantData* data_;
218
- detail::ResourceManager* resources_;
213
+ mutable detail::ArrayImpl impl_;
219
214
};
220
215
221
216
ARDUINOJSON_END_PUBLIC_NAMESPACE
0 commit comments