@@ -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
221216ARDUINOJSON_END_PUBLIC_NAMESPACE
0 commit comments