Skip to content

Commit 6e7eddb

Browse files
committed
JsonObject: replace ObjectData* member with VariantData*
1 parent 3a49896 commit 6e7eddb

File tree

3 files changed

+31
-26
lines changed

3 files changed

+31
-26
lines changed

src/ArduinoJson/Object/JsonObject.hpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
2323
JsonObject() : data_(0), resources_(0) {}
2424

2525
// INTERNAL USE ONLY
26-
JsonObject(detail::ObjectData* data, detail::ResourceManager* resource)
26+
JsonObject(detail::VariantData* data, detail::ResourceManager* resource)
2727
: data_(data), resources_(resource) {}
2828

2929
operator JsonVariant() const {
@@ -33,29 +33,29 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
3333
}
3434

3535
operator JsonObjectConst() const {
36-
return JsonObjectConst(collectionToVariant(data_), resources_);
36+
return JsonObjectConst(data_, resources_);
3737
}
3838

3939
operator JsonVariantConst() const {
40-
return JsonVariantConst(collectionToVariant(data_), resources_);
40+
return JsonVariantConst(data_, resources_);
4141
}
4242

4343
// Returns true if the reference is unbound.
4444
// https://arduinojson.org/v7/api/jsonobject/isnull/
4545
bool isNull() const {
46-
return data_ == 0;
46+
return !data_ || !data_->isObject();
4747
}
4848

4949
// Returns true if the reference is bound.
5050
// https://arduinojson.org/v7/api/jsonobject/isnull/
5151
operator bool() const {
52-
return data_ != 0;
52+
return !isNull();
5353
}
5454

5555
// Returns the depth (nesting level) of the object.
5656
// https://arduinojson.org/v7/api/jsonobject/nesting/
5757
size_t nesting() const {
58-
return detail::VariantData::nesting(collectionToVariant(data_), resources_);
58+
return detail::VariantData::nesting(data_, resources_);
5959
}
6060

6161
// Returns the number of members in the object.
@@ -67,9 +67,10 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
6767
// Returns an iterator to the first key-value pair of the object.
6868
// https://arduinojson.org/v7/api/jsonobject/begin/
6969
iterator begin() const {
70-
if (!data_)
70+
auto obj = detail::VariantData::asObject(data_);
71+
if (!obj)
7172
return iterator();
72-
return iterator(data_->createIterator(resources_), resources_);
73+
return iterator(obj->createIterator(resources_), resources_);
7374
}
7475

7576
// Returns an iterator following the last key-value pair of the object.
@@ -81,7 +82,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
8182
// Removes all the members of the object.
8283
// https://arduinojson.org/v7/api/jsonobject/clear/
8384
void clear() const {
84-
detail::ObjectData::clear(data_, resources_);
85+
detail::ObjectData::clear(detail::VariantData::asObject(data_), resources_);
8586
}
8687

8788
// Copies an object.
@@ -131,16 +132,17 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
131132
// Removes the member at the specified iterator.
132133
// https://arduinojson.org/v7/api/jsonobject/remove/
133134
FORCE_INLINE void remove(iterator it) const {
134-
detail::ObjectData::remove(data_, it.iterator_, resources_);
135+
detail::ObjectData::remove(detail::VariantData::asObject(data_),
136+
it.iterator_, resources_);
135137
}
136138

137139
// Removes the member with the specified key.
138140
// https://arduinojson.org/v7/api/jsonobject/remove/
139141
template <typename TString,
140142
detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
141143
void remove(const TString& key) const {
142-
detail::ObjectData::removeMember(data_, detail::adaptString(key),
143-
resources_);
144+
detail::VariantData::removeMember(data_, detail::adaptString(key),
145+
resources_);
144146
}
145147

146148
// Removes the member with the specified key.
@@ -156,8 +158,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
156158
// https://arduinojson.org/v7/api/jsonobject/remove/
157159
template <typename TChar>
158160
FORCE_INLINE void remove(TChar* key) const {
159-
detail::ObjectData::removeMember(data_, detail::adaptString(key),
160-
resources_);
161+
detail::VariantData::removeMember(data_, detail::adaptString(key),
162+
resources_);
161163
}
162164

163165
// DEPRECATED: use obj[key].is<T>() instead
@@ -166,8 +168,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
166168
detail::enable_if_t<detail::IsString<TString>::value, int> = 0>
167169
ARDUINOJSON_DEPRECATED("use obj[key].is<T>() instead")
168170
bool containsKey(const TString& key) const {
169-
return detail::ObjectData::getMember(data_, detail::adaptString(key),
170-
resources_) != 0;
171+
return detail::VariantData::getMember(data_, detail::adaptString(key),
172+
resources_) != 0;
171173
}
172174

173175
// DEPRECATED: use obj["key"].is<T>() instead
@@ -178,8 +180,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
178180
int> = 0>
179181
ARDUINOJSON_DEPRECATED("use obj[\"key\"].is<T>() instead")
180182
bool containsKey(TChar* key) const {
181-
return detail::ObjectData::getMember(data_, detail::adaptString(key),
182-
resources_) != 0;
183+
return detail::VariantData::getMember(data_, detail::adaptString(key),
184+
resources_) != 0;
183185
}
184186

185187
// DEPRECATED: use obj[key].is<T>() instead
@@ -231,14 +233,14 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
231233
}
232234

233235
detail::VariantData* getData() const {
234-
return detail::collectionToVariant(data_);
236+
return data_;
235237
}
236238

237239
detail::VariantData* getOrCreateData() const {
238-
return detail::collectionToVariant(data_);
240+
return data_;
239241
}
240242

241-
detail::ObjectData* data_;
243+
detail::VariantData* data_;
242244
detail::ResourceManager* resources_;
243245
};
244246

src/ArduinoJson/Variant/ConverterImpl.hpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,9 +386,7 @@ struct Converter<JsonObject> : private detail::VariantAttorney {
386386
}
387387

388388
static JsonObject fromJson(JsonVariant src) {
389-
auto data = getData(src);
390-
auto resources = getResourceManager(src);
391-
return JsonObject(data != 0 ? data->asObject() : 0, resources);
389+
return JsonObject(getData(src), getResourceManager(src));
392390
}
393391

394392
static bool checkJson(JsonVariant src) {

src/ArduinoJson/Variant/VariantData.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,10 @@ class VariantData {
287287
return const_cast<VariantData*>(this)->asObject();
288288
}
289289

290+
static ObjectData* asObject(VariantData* var) {
291+
return var ? var->asObject() : 0;
292+
}
293+
290294
static const ObjectData* asObject(const VariantData* var) {
291295
return var ? var->asObject() : 0;
292296
}
@@ -578,11 +582,12 @@ class VariantData {
578582
return content_.asObject;
579583
}
580584

581-
static ObjectData* toObject(VariantData* var, ResourceManager* resources) {
585+
static VariantData* toObject(VariantData* var, ResourceManager* resources) {
582586
if (!var)
583587
return 0;
584588
var->clear(resources);
585-
return &var->toObject();
589+
var->toObject();
590+
return var;
586591
}
587592

588593
VariantType type() const {

0 commit comments

Comments
 (0)