Skip to content

Commit 1f1227d

Browse files
committed
CollectionImpl: attach to VariantData* instead of CollectionData*
1 parent 6f28ec0 commit 1f1227d

File tree

13 files changed

+56
-77
lines changed

13 files changed

+56
-77
lines changed

src/ArduinoJson/Array/ArrayData.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ class ArrayImpl : public CollectionImpl {
1212
public:
1313
ArrayImpl() {}
1414

15-
ArrayImpl(CollectionData* data, ResourceManager* resources)
15+
ArrayImpl(VariantData* data, ResourceManager* resources)
1616
: CollectionImpl(data, resources) {}
1717

18+
bool isNull() const {
19+
return !data_ || data_->type != VariantType::Array;
20+
}
21+
1822
VariantData* addElement();
1923

2024
template <typename T>

src/ArduinoJson/Array/ArrayImpl.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1212

1313
inline ArrayImpl::iterator ArrayImpl::at(size_t index) const {
14+
if (isNull())
15+
return iterator();
16+
1417
auto it = createIterator();
1518
while (!it.done() && index) {
1619
it.next(resources_);
@@ -20,7 +23,7 @@ inline ArrayImpl::iterator ArrayImpl::at(size_t index) const {
2023
}
2124

2225
inline VariantData* ArrayImpl::addElement() {
23-
if (!data_)
26+
if (isNull())
2427
return nullptr;
2528
auto slot = allocVariant();
2629
if (!slot)
@@ -57,7 +60,7 @@ inline void ArrayImpl::removeElement(size_t index) {
5760

5861
template <typename T>
5962
inline bool ArrayImpl::addValue(const T& value) {
60-
if (!data_)
63+
if (isNull())
6164
return false;
6265
auto slot = allocVariant();
6366
if (!slot)

src/ArduinoJson/Array/JsonArray.hpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
2424

2525
// INTERNAL USE ONLY
2626
JsonArray(detail::VariantData* data, detail::ResourceManager* resources)
27-
: impl_(data ? data->asArray() : nullptr, resources) {}
28-
29-
// INTERNAL USE ONLY
30-
JsonArray(detail::CollectionData* data, detail::ResourceManager* resources)
3127
: impl_(data, resources) {}
3228

3329
// Returns a JsonVariant pointing to the array.

src/ArduinoJson/Array/JsonArrayConst.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
3838

3939
// INTERNAL USE ONLY
4040
JsonArrayConst(detail::VariantData* data, detail::ResourceManager* resources)
41-
: impl_(data ? data->asArray() : nullptr, resources) {}
41+
: impl_(data, resources) {}
4242

4343
// INTERNAL USE ONLY
4444
JsonArrayConst(const detail::ArrayImpl& impl) : impl_(impl) {}

src/ArduinoJson/Collection/CollectionData.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,28 +67,27 @@ class CollectionIterator {
6767

6868
class CollectionImpl {
6969
protected:
70-
CollectionData* data_;
70+
VariantData* data_;
7171
ResourceManager* resources_;
7272

7373
public:
7474
using iterator = CollectionIterator;
7575

7676
CollectionImpl() : data_(nullptr), resources_(nullptr) {}
7777

78-
CollectionImpl(CollectionData* data, ResourceManager* resources)
78+
CollectionImpl(VariantData* data, ResourceManager* resources)
7979
: data_(data), resources_(resources) {}
8080

8181
explicit operator bool() const {
82-
return data_ != nullptr;
82+
return data_ && data_->isCollection();
8383
}
8484

8585
bool isNull() const {
86-
return data_ == nullptr;
86+
return !operator bool();
8787
}
8888

8989
VariantData* getData() const {
90-
void* data = data_; // prevent warning cast-align
91-
return reinterpret_cast<VariantData*>(data);
90+
return data_;
9291
}
9392

9493
ResourceManager* getResourceManager() const {
@@ -133,7 +132,8 @@ class CollectionImpl {
133132

134133
CollectionData* getCollectionData() const {
135134
ARDUINOJSON_ASSERT(data_ != nullptr);
136-
return data_;
135+
ARDUINOJSON_ASSERT(data_->isCollection());
136+
return &data_->content.asCollection;
137137
}
138138
};
139139

src/ArduinoJson/Collection/CollectionImpl.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ inline void CollectionIterator::next(const ResourceManager* resources) {
2020
}
2121

2222
inline CollectionImpl::iterator CollectionImpl::createIterator() const {
23-
if (!data_)
23+
if (!data_ || !data_->isCollection())
2424
return iterator();
2525
auto coll = getCollectionData();
2626
return iterator(getVariant(coll->head), coll->head);
@@ -56,7 +56,7 @@ inline void CollectionImpl::appendPair(Slot<VariantData> key,
5656
}
5757

5858
inline void CollectionImpl::clear() {
59-
if (!data_)
59+
if (!data_ || !data_->isCollection())
6060
return;
6161

6262
auto coll = getCollectionData();
@@ -122,7 +122,7 @@ inline void CollectionImpl::removePair(ObjectImpl::iterator it) {
122122
}
123123

124124
inline size_t CollectionImpl::nesting() const {
125-
if (!data_)
125+
if (!data_ || !data_->isCollection())
126126
return 0;
127127
size_t maxChildNesting = 0;
128128
for (auto it = createIterator(); !it.done(); it.next(resources_)) {

src/ArduinoJson/Json/JsonDeserializer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ class JsonDeserializer {
148148

149149
template <typename TFilter>
150150
DeserializationError::Code parseArray(
151-
CollectionData* arrayData, TFilter filter,
151+
VariantData* arrayData, TFilter filter,
152152
DeserializationOption::NestingLimit nestingLimit) {
153153
DeserializationError::Code err;
154154

@@ -236,7 +236,7 @@ class JsonDeserializer {
236236

237237
template <typename TFilter>
238238
DeserializationError::Code parseObject(
239-
CollectionData* objectData, TFilter filter,
239+
VariantData* objectData, TFilter filter,
240240
DeserializationOption::NestingLimit nestingLimit) {
241241
DeserializationError::Code err;
242242

src/ArduinoJson/Object/JsonObject.hpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,9 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
2222
// Creates an unbound reference.
2323
JsonObject() {}
2424

25-
// INTERNAL USE ONLY
26-
JsonObject(detail::CollectionData* data, detail::ResourceManager* resource)
27-
: impl_(data, resource) {}
28-
2925
// INTERNAL USE ONLY
3026
JsonObject(detail::VariantData* data, detail::ResourceManager* resource)
31-
: impl_(data ? data->asObject() : nullptr, resource) {}
27+
: impl_(data, resource) {}
3228

3329
operator JsonVariant() const {
3430
return JsonVariant(getData(), getResourceManager());

src/ArduinoJson/Object/JsonObjectConst.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
2323

2424
// INTERNAL USE ONLY
2525
JsonObjectConst(detail::VariantData* data, detail::ResourceManager* resources)
26-
: impl_(data ? data->asObject() : nullptr, resources) {}
26+
: impl_(data, resources) {}
2727

2828
// INTERNAL USE ONLY
2929
JsonObjectConst(const detail::ObjectImpl& impl) : impl_(impl) {}

src/ArduinoJson/Object/ObjectData.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,13 @@ class ObjectImpl : public CollectionImpl {
1414
public:
1515
ObjectImpl() {}
1616

17-
ObjectImpl(CollectionData* data, ResourceManager* resources)
17+
ObjectImpl(VariantData* data, ResourceManager* resources)
1818
: CollectionImpl(data, resources) {}
1919

20+
bool isNull() const {
21+
return !data_ || data_->type != VariantType::Object;
22+
}
23+
2024
template <typename TAdaptedString>
2125
VariantData* addMember(TAdaptedString key);
2226

0 commit comments

Comments
 (0)