Skip to content

Commit 485078a

Browse files
committed
CollectionImpl: attach to VariantData* instead of CollectionData*
1 parent 9a26c04 commit 485078a

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
@@ -66,28 +66,27 @@ class CollectionIterator {
6666

6767
class CollectionImpl {
6868
protected:
69-
CollectionData* data_;
69+
VariantData* data_;
7070
ResourceManager* resources_;
7171

7272
public:
7373
using iterator = CollectionIterator;
7474

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

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

8080
explicit operator bool() const {
81-
return data_ != nullptr;
81+
return data_ && data_->isCollection();
8282
}
8383

8484
bool isNull() const {
85-
return data_ == nullptr;
85+
return !operator bool();
8686
}
8787

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

9392
ResourceManager* getResourceManager() const {
@@ -132,7 +131,8 @@ class CollectionImpl {
132131

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

src/ArduinoJson/Collection/CollectionImpl.hpp

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

2828
inline CollectionImpl::iterator CollectionImpl::createIterator() const {
29-
if (!data_)
29+
if (!data_ || !data_->isCollection())
3030
return iterator();
3131
auto coll = getCollectionData();
3232
return iterator(getVariant(coll->head), coll->head);
@@ -62,7 +62,7 @@ inline void CollectionImpl::appendPair(Slot<VariantData> key,
6262
}
6363

6464
inline void CollectionImpl::clear() {
65-
if (!data_)
65+
if (!data_ || !data_->isCollection())
6666
return;
6767

6868
auto coll = getCollectionData();
@@ -128,7 +128,7 @@ inline void CollectionImpl::removePair(ObjectImpl::iterator it) {
128128
}
129129

130130
inline size_t CollectionImpl::nesting() const {
131-
if (!data_)
131+
if (!data_ || !data_->isCollection())
132132
return 0;
133133
size_t maxChildNesting = 0;
134134
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)