Skip to content

Commit 01620bd

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

27 files changed

+217
-328
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: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
101101
// Removes the element at the specified iterator.
102102
// https://arduinojson.org/v7/api/jsonarray/remove/
103103
void remove(iterator it) const {
104-
impl_.remove(it.iterator_);
104+
impl_.removeElement(it.iterator_);
105105
}
106106

107107
// Removes the element at the specified index.
@@ -122,7 +122,8 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
122122
// Removes all the elements of the array.
123123
// https://arduinojson.org/v7/api/jsonarray/clear/
124124
void clear() const {
125-
impl_.clear();
125+
if (impl_.isArray())
126+
impl_.empty();
126127
}
127128

128129
// Gets or sets the element at the specified index.
@@ -207,7 +208,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
207208
return impl_.getData();
208209
}
209210

210-
mutable detail::ArrayImpl impl_;
211+
mutable detail::VariantImpl impl_;
211212
};
212213

213214
ARDUINOJSON_END_PUBLIC_NAMESPACE

src/ArduinoJson/Array/JsonArrayConst.hpp

Lines changed: 2 additions & 2 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/
@@ -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

src/ArduinoJson/Collection/CollectionImpl.hpp

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ inline void CollectionIterator::next(const ResourceManager* resources) {
2525
nextId_ = slot_->next;
2626
}
2727

28-
inline CollectionImpl::iterator CollectionImpl::createIterator() const {
28+
inline VariantImpl::iterator VariantImpl::createIterator() const {
2929
if (!data_ || !data_->isCollection())
3030
return iterator();
3131
auto coll = getCollectionData();
3232
return iterator(getVariant(coll->head), coll->head);
3333
}
3434

35-
inline void CollectionImpl::appendOne(Slot<VariantData> slot) {
35+
inline void VariantImpl::appendOne(Slot<VariantData> slot) {
3636
auto coll = getCollectionData();
3737

3838
if (coll->tail != NULL_SLOT) {
@@ -45,8 +45,8 @@ inline void CollectionImpl::appendOne(Slot<VariantData> slot) {
4545
}
4646
}
4747

48-
inline void CollectionImpl::appendPair(Slot<VariantData> key,
49-
Slot<VariantData> value) {
48+
inline void VariantImpl::appendPair(Slot<VariantData> key,
49+
Slot<VariantData> value) {
5050
auto coll = getCollectionData();
5151

5252
key->next = value.id();
@@ -60,26 +60,7 @@ inline void CollectionImpl::appendPair(Slot<VariantData> key,
6060
coll->tail = value.id();
6161
}
6262
}
63-
64-
inline void CollectionImpl::clear() {
65-
if (!data_ || !data_->isCollection())
66-
return;
67-
68-
auto coll = getCollectionData();
69-
70-
auto next = coll->head;
71-
while (next != NULL_SLOT) {
72-
auto currId = next;
73-
auto slot = getVariant(next);
74-
next = slot->next;
75-
freeVariant({slot, currId});
76-
}
77-
78-
coll->head = NULL_SLOT;
79-
coll->tail = NULL_SLOT;
80-
}
81-
82-
inline Slot<VariantData> CollectionImpl::getPreviousSlot(
63+
inline Slot<VariantData> VariantImpl::getPreviousSlot(
8364
VariantData* target) const {
8465
auto coll = getCollectionData();
8566
auto prev = Slot<VariantData>();
@@ -94,7 +75,7 @@ inline Slot<VariantData> CollectionImpl::getPreviousSlot(
9475
return prev;
9576
}
9677

97-
inline void CollectionImpl::removeOne(iterator it) {
78+
inline void VariantImpl::removeOne(iterator it) {
9879
if (it.done())
9980
return;
10081
auto coll = getCollectionData();
@@ -110,7 +91,7 @@ inline void CollectionImpl::removeOne(iterator it) {
11091
freeVariant({it.slot_, it.currentId_});
11192
}
11293

113-
inline void CollectionImpl::removePair(ObjectImpl::iterator it) {
94+
inline void VariantImpl::removePair(VariantImpl::iterator it) {
11495
if (it.done())
11596
return;
11697

@@ -127,7 +108,7 @@ inline void CollectionImpl::removePair(ObjectImpl::iterator it) {
127108
removeOne(it);
128109
}
129110

130-
inline size_t CollectionImpl::nesting() const {
111+
inline size_t VariantImpl::nesting() const {
131112
if (!data_ || !data_->isCollection())
132113
return 0;
133114
size_t maxChildNesting = 0;
@@ -140,11 +121,4 @@ inline size_t CollectionImpl::nesting() const {
140121
return maxChildNesting + 1;
141122
}
142123

143-
inline size_t CollectionImpl::size() const {
144-
size_t count = 0;
145-
for (auto it = createIterator(); !it.done(); it.next(resources_))
146-
count++;
147-
return count;
148-
}
149-
150124
ARDUINOJSON_END_PRIVATE_NAMESPACE

0 commit comments

Comments
 (0)