Skip to content

Commit dd8d4a1

Browse files
committed
Merge ArrayImpl, CollectionImpl, and ObjectImpl into VariantImpl
1 parent 485078a commit dd8d4a1

28 files changed

+234
-336
lines changed

src/ArduinoJson/Array/ArrayData.hpp

Lines changed: 0 additions & 41 deletions
This file was deleted.

src/ArduinoJson/Array/ArrayImpl.hpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@
44

55
#pragma once
66

7-
#include <ArduinoJson/Array/ArrayData.hpp>
87
#include <ArduinoJson/Variant/VariantCompare.hpp>
9-
#include <ArduinoJson/Variant/VariantData.hpp>
8+
#include <ArduinoJson/Variant/VariantImpl.hpp>
109

1110
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1211

13-
inline ArrayImpl::iterator ArrayImpl::at(size_t index) const {
14-
if (isNull())
12+
inline VariantImpl::iterator VariantImpl::at(size_t index) const {
13+
if (!isArray())
1514
return iterator();
1615

1716
auto it = createIterator();
@@ -22,17 +21,17 @@ inline ArrayImpl::iterator ArrayImpl::at(size_t index) const {
2221
return it;
2322
}
2423

25-
inline VariantData* ArrayImpl::addElement() {
26-
if (isNull())
24+
inline VariantData* VariantImpl::addElement() {
25+
if (!isArray())
2726
return nullptr;
2827
auto slot = allocVariant();
2928
if (!slot)
3029
return nullptr;
31-
CollectionImpl::appendOne(slot);
30+
VariantImpl::appendOne(slot);
3231
return slot.ptr();
3332
}
3433

35-
inline VariantData* ArrayImpl::getOrAddElement(size_t index) {
34+
inline VariantData* VariantImpl::getOrAddElement(size_t index) {
3635
auto it = createIterator();
3736
while (!it.done() && index > 0) {
3837
it.next(resources_);
@@ -50,17 +49,17 @@ inline VariantData* ArrayImpl::getOrAddElement(size_t index) {
5049
return element;
5150
}
5251

53-
inline VariantData* ArrayImpl::getElement(size_t index) const {
52+
inline VariantData* VariantImpl::getElement(size_t index) const {
5453
return at(index).data();
5554
}
5655

57-
inline void ArrayImpl::removeElement(size_t index) {
58-
remove(at(index));
56+
inline void VariantImpl::removeElement(size_t index) {
57+
removeElement(at(index));
5958
}
6059

6160
template <typename T>
62-
inline bool ArrayImpl::addValue(const T& value) {
63-
if (isNull())
61+
inline bool VariantImpl::addValue(const T& value) {
62+
if (!isArray())
6463
return false;
6564
auto slot = allocVariant();
6665
if (!slot)
@@ -70,7 +69,7 @@ inline bool ArrayImpl::addValue(const T& value) {
7069
freeVariant(slot);
7170
return false;
7271
}
73-
CollectionImpl::appendOne(slot);
72+
appendOne(slot);
7473
return true;
7574
}
7675

src/ArduinoJson/Array/ElementProxy.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,12 @@ class ElementProxy : public VariantRefBase<ElementProxy<TUpstream>>,
5959
}
6060

6161
VariantData* getOrCreateData() const {
62-
return VariantAttorney::getOrCreateVariantImpl(upstream_).getOrAddElement(
63-
index_);
62+
auto data = VariantAttorney::getOrCreateData(upstream_);
63+
auto resources = VariantAttorney::getResourceManager(upstream_);
64+
if (!data)
65+
return nullptr;
66+
data->getOrCreateArray();
67+
return VariantImpl(data, resources).getOrAddElement(index_);
6468
}
6569

6670
TUpstream upstream_;

src/ArduinoJson/Array/JsonArray.hpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,19 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
2626
JsonArray(detail::VariantData* data, detail::ResourceManager* resources)
2727
: impl_(data, resources) {}
2828

29+
// INTERNAL USE ONLY
30+
JsonArray(detail::VariantImpl impl) : impl_(impl) {}
31+
2932
// Returns a JsonVariant pointing to the array.
3033
// https://arduinojson.org/v7/api/jsonvariant/
3134
operator JsonVariant() {
32-
return JsonVariant(getData(), getResourceManager());
35+
return JsonVariant(impl_);
3336
}
3437

3538
// Returns a read-only reference to the array.
3639
// https://arduinojson.org/v7/api/jsonarrayconst/
3740
operator JsonArrayConst() const {
38-
return JsonArrayConst(getData(), getResourceManager());
41+
return JsonArrayConst(impl_);
3942
}
4043

4144
// Appends a new (empty) element to the array.
@@ -101,7 +104,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
101104
// Removes the element at the specified iterator.
102105
// https://arduinojson.org/v7/api/jsonarray/remove/
103106
void remove(iterator it) const {
104-
impl_.remove(it.iterator_);
107+
impl_.removeElement(it.iterator_);
105108
}
106109

107110
// Removes the element at the specified index.
@@ -122,7 +125,8 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
122125
// Removes all the elements of the array.
123126
// https://arduinojson.org/v7/api/jsonarray/clear/
124127
void clear() const {
125-
impl_.clear();
128+
if (impl_.isArray())
129+
impl_.empty();
126130
}
127131

128132
// Gets or sets the element at the specified index.
@@ -145,7 +149,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
145149
}
146150

147151
operator JsonVariantConst() const {
148-
return JsonVariantConst(getData(), getResourceManager());
152+
return JsonVariantConst(impl_);
149153
}
150154

151155
// Returns true if the reference is unbound.
@@ -207,7 +211,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
207211
return impl_.getData();
208212
}
209213

210-
mutable detail::ArrayImpl impl_;
214+
mutable detail::VariantImpl impl_;
211215
};
212216

213217
ARDUINOJSON_END_PUBLIC_NAMESPACE

src/ArduinoJson/Array/JsonArrayConst.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
4141
: impl_(data, resources) {}
4242

4343
// INTERNAL USE ONLY
44-
JsonArrayConst(const detail::ArrayImpl& impl) : impl_(impl) {}
44+
JsonArrayConst(const detail::VariantImpl& impl) : impl_(impl) {}
4545

4646
// Returns the element at the specified index.
4747
// https://arduinojson.org/v7/api/jsonarrayconst/subscript/
@@ -64,7 +64,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
6464
}
6565

6666
operator JsonVariantConst() const {
67-
return JsonVariantConst(impl_.getData(), impl_.getResourceManager());
67+
return JsonVariantConst(impl_);
6868
}
6969

7070
// Returns true if the reference is unbound.
@@ -102,7 +102,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
102102
return impl_.getData();
103103
}
104104

105-
detail::ArrayImpl impl_;
105+
detail::VariantImpl impl_;
106106
};
107107

108108
// Compares the content of two arrays.

src/ArduinoJson/Array/JsonArrayIterator.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class JsonArrayIterator {
3030

3131
public:
3232
JsonArrayIterator() {}
33-
explicit JsonArrayIterator(detail::ArrayImpl::iterator iterator,
33+
explicit JsonArrayIterator(detail::VariantImpl::iterator iterator,
3434
detail::ResourceManager* resources)
3535
: iterator_(iterator), resources_(resources) {}
3636

@@ -55,7 +55,7 @@ class JsonArrayIterator {
5555
}
5656

5757
private:
58-
detail::ArrayImpl::iterator iterator_;
58+
detail::VariantImpl::iterator iterator_;
5959
detail::ResourceManager* resources_;
6060
};
6161

@@ -64,7 +64,7 @@ class JsonArrayConstIterator {
6464

6565
public:
6666
JsonArrayConstIterator() {}
67-
explicit JsonArrayConstIterator(detail::ArrayImpl::iterator iterator,
67+
explicit JsonArrayConstIterator(detail::VariantImpl::iterator iterator,
6868
detail::ResourceManager* resources)
6969
: iterator_(iterator), resources_(resources) {}
7070

@@ -89,7 +89,7 @@ class JsonArrayConstIterator {
8989
}
9090

9191
private:
92-
mutable detail::ArrayImpl::iterator iterator_;
92+
mutable detail::VariantImpl::iterator iterator_;
9393
mutable detail::ResourceManager* resources_;
9494
};
9595

src/ArduinoJson/Collection/CollectionData.hpp

Lines changed: 1 addition & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct VariantData;
1515
class ResourceManager;
1616

1717
class CollectionIterator {
18-
friend class CollectionImpl;
18+
friend class VariantImpl;
1919

2020
public:
2121
CollectionIterator() : slot_(nullptr), currentId_(NULL_SLOT) {}
@@ -64,76 +64,4 @@ class CollectionIterator {
6464
SlotId currentId_, nextId_;
6565
};
6666

67-
class CollectionImpl {
68-
protected:
69-
VariantData* data_;
70-
ResourceManager* resources_;
71-
72-
public:
73-
using iterator = CollectionIterator;
74-
75-
CollectionImpl() : data_(nullptr), resources_(nullptr) {}
76-
77-
CollectionImpl(VariantData* data, ResourceManager* resources)
78-
: data_(data), resources_(resources) {}
79-
80-
explicit operator bool() const {
81-
return data_ && data_->isCollection();
82-
}
83-
84-
bool isNull() const {
85-
return !operator bool();
86-
}
87-
88-
VariantData* getData() const {
89-
return data_;
90-
}
91-
92-
ResourceManager* getResourceManager() const {
93-
return resources_;
94-
}
95-
96-
iterator createIterator() const;
97-
98-
size_t size() const;
99-
size_t nesting() const;
100-
101-
void clear();
102-
103-
SlotId head() const {
104-
return getCollectionData()->head;
105-
}
106-
107-
protected:
108-
void appendOne(Slot<VariantData> slot);
109-
void appendPair(Slot<VariantData> key, Slot<VariantData> value);
110-
111-
void removeOne(iterator it);
112-
void removePair(iterator it);
113-
114-
VariantData* getVariant(SlotId id) const {
115-
ARDUINOJSON_ASSERT(resources_ != nullptr);
116-
return resources_->getVariant(id);
117-
}
118-
119-
void freeVariant(Slot<VariantData> slot) {
120-
ARDUINOJSON_ASSERT(resources_ != nullptr);
121-
resources_->freeVariant(slot);
122-
}
123-
124-
Slot<VariantData> allocVariant() {
125-
ARDUINOJSON_ASSERT(resources_ != nullptr);
126-
return resources_->allocVariant();
127-
}
128-
129-
private:
130-
Slot<VariantData> getPreviousSlot(VariantData*) const;
131-
132-
CollectionData* getCollectionData() const {
133-
ARDUINOJSON_ASSERT(data_ != nullptr);
134-
ARDUINOJSON_ASSERT(data_->isCollection());
135-
return &data_->content.asCollection;
136-
}
137-
};
138-
13967
ARDUINOJSON_END_PRIVATE_NAMESPACE

0 commit comments

Comments
 (0)