8000 Extracted VariantData and CollectionData classes · java64/ArduinoJson@b77b203 · GitHub
[go: up one dir, main page]

Skip to content

Commit b77b203

Browse files
committed
Extracted VariantData and CollectionData classes
1 parent 1ad97eb commit b77b203

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1077
-955
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ HEAD
77
* Removed the automatic expansion of `DynamicJsonDocument`, it now has a fixed capacity.
88
* Restored the monotonic allocator because the code was getting too big
99
* Reduced the memory usage
10+
* Reduced the code size
1011
* Removed spurious files in the Particle library
1112

1213
v6.6.0-beta (2018-11-13)

src/ArduinoJson.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "ArduinoJson/Array/ArrayImpl.hpp"
1717
#include "ArduinoJson/Array/ArraySubscript.hpp"
18+
#include "ArduinoJson/Collection/CollectionImpl.hpp"
1819
#include "ArduinoJson/Object/ObjectImpl.hpp"
1920
#include "ArduinoJson/Object/ObjectSubscript.hpp"
2021
#include "ArduinoJson/Variant/VariantAsImpl.hpp"

src/ArduinoJson/Array/ArrayFunctions.hpp

Lines changed: 12 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -4,92 +4,26 @@
44

55
#pragma once
66

7-
#include "../Variant/SlotFunctions.hpp"
8-
#include "../Variant/VariantData.hpp"
7+
#include "../Collection/CollectionData.hpp"
98

109
namespace ARDUINOJSON_NAMESPACE {
1110

12-
inline VariantData* arrayAdd(ArrayData* arr, MemoryPool* pool) {
13-
if (!arr) return 0;
14-
15-
VariantSlot* slot = pool->allocVariant();
16-
if (!slot) return 0;
17-
18-
slot->init();
19-
20-
if (arr->tail) {
21-
slot->attachTo(arr->tail);
22-
arr->tail = slot;
23-
} else {
24-
arr->head = slot;
25-
arr->tail = slot;
26-
}
27-
28-
return slot->getData();
29-
}
30-
31-
inline VariantSlot* arrayGetSlot(const ArrayData* arr, size_t index) {
32-
if (!arr) return 0;
33-
return arr->head->getNext(index);
34-
}
35-
36-
inline VariantData* arrayGet(const ArrayData* arr, size_t index) {
37-
VariantSlot* slot = arrayGetSlot(arr, index);
38-
return slot ? slot->getData() : 0;
11+
inline VariantData *arrayAdd(CollectionData *arr, MemoryPool *pool) {
12+
return arr ? arr->add(pool) : 0;
3913
}
4014

41-
inline void arrayRemove(ArrayData* arr, VariantSlot* slot) {
42-
if (!arr || !slot) return;
43-
44-
VariantSlot* prev = slot->getPrev(arr->head);
45-
VariantSlot* next = slot->getNext();
46-
47-
if (prev)
48-
prev->setNext(next);
15+
template <typename Visitor>
16+
inline void arrayAccept(const CollectionData *arr, Visitor &visitor) {
17+
if (arr)
18+
visitor.visitArray(*arr);
4919
else
50-
arr->head = next;
51-
if (!next) arr->tail = prev;
20+
visitor.visitNull();
5221
}
5322

54-
inline void arrayRemove(ArrayData* arr, size_t index) {
55-
arrayRemove(arr, arrayGetSlot(arr, index));
56-
}
57-
58-
inline void arrayClear(ArrayData* arr) {
59-
if (!arr) return;
60-
arr->head = 0;
61-
arr->tail = 0;
62-
}
63-
64-
bool variantCopy(VariantData*, const VariantData*, MemoryPool*);
65-
66-
inline bool arrayCopy(ArrayData* dst, const ArrayData* src, MemoryPool* pool) {
67-
if (!dst || !src) return false;
68-
arrayClear(dst);
69-
for (VariantSlot* s = src->head; s; s = s->getNext()) {
70-
if (!variantCopy(arrayAdd(dst, pool), s->getData(), pool)) return false;
71-
}
72-
return true;
73-
}
74-
75-
bool variantEquals(const VariantData*, const VariantData*);
76-
77-
inline bool arrayEquals(const ArrayData* a1, const ArrayData* a2) {
78-
if (a1 == a2) return true;
79-
if (!a1 || !a2) return false;
80-
VariantSlot* s1 = a1->head;
81-
VariantSlot* s2 = a2->head;
82-
for (;;) {
83-
if (s1 == s2) return true;
84-
if (!s1 || !s2) return false;
85-
if (!variantEquals(s1->getData(), s2->getData())) return false;
86-
s1 = s1->getNext();
87-
s2 = s2->getNext();
88-
}
89-
}
23+
inline bool arrayEquals(const CollectionData *lhs, const CollectionData *rhs) {
24+
if (lhs == rhs) return true;
25+
if (!lhs || !rhs) return false;
9026

91-
inline size_t arraySize(const ArrayData* arr) {
92-
if (!arr) return 0;
93-
return slotSize(arr->head);
27+
return lhs->equalsArray(*rhs);
9428
}
9529
} // namespace ARDUINOJSON_NAMESPACE

src/ArduinoJson/Array/ArrayIterator.hpp

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ namespace ARDUINOJSON_NAMESPACE {
1111

1212
class VariantPtr {
1313
public:
14-
VariantPtr(MemoryPool *memoryPool, VariantData *data)
15-
: _variant(memoryPool, data) {}
14+
VariantPtr(MemoryPool *pool, VariantData *data) : _variant(pool, data) {}
1615

1716
VariantRef *operator->() {
1817
return &_variant;
@@ -29,14 +28,14 @@ class VariantPtr {
2928
class ArrayIterator {
3029
public:
3130
ArrayIterator() : _slot(0) {}
32-
explicit ArrayIterator(MemoryPool *memoryPool, VariantSlot *slot)
33-
: _memoryPool(memoryPool), _slot(slot) {}
31+
explicit ArrayIterator(MemoryPool *pool, VariantSlot *slot)
32+
: _pool(pool), _slot(slot) {}
3433

3534
VariantRef operator*() const {
36-
return VariantRef(_memoryPool, _slot->getData());
35+
return VariantRef(_pool, _slot->data());
3736
}
3837
VariantPtr operator->() {
39-
return VariantPtr(_memoryPool, _slot->getData());
38+
return VariantPtr(_pool, _slot->data());
4039
}
4140

4241
bool operator==(const ArrayIterator &other) const {
@@ -48,12 +47,12 @@ class ArrayIterator {
4847
}
4948

5049
ArrayIterator &operator++() {
51-
_slot = _slot->getNext();
50+
_slot = _slot->next();
5251
return *this;
5352
}
5453

5554
ArrayIterator &operator+=(size_t distance) {
56-
_slot = _slot->getNext(distance);
55+
_slot = _slot->next(distance);
5756
return *this;
5857
}
5958

@@ -62,7 +61,7 @@ class ArrayIterator {
6261
}
6362

6463
private:
65-
MemoryPool *_memoryPool;
64+
MemoryPool *_pool;
6665
VariantSlot *_slot;
6766
};
6867

@@ -88,10 +87,10 @@ class ArrayConstRefIterator {
8887
explicit ArrayConstRefIterator(const VariantSlot *slot) : _slot(slot) {}
8988

9089
VariantConstRef operator*() const {
91-
return VariantConstRef(_slot->getData());
90+
return VariantConstRef(_slot->data());
9291
}
9392
VariantConstPtr operator->() {
94-
return VariantConstPtr(_slot->getData());
93+
return VariantConstPtr(_slot->data());
9594
}
9695

9796
bool operator==(const ArrayConstRefIterator &other) const {
@@ -103,12 +102,12 @@ class ArrayConstRefIterator {
103102
}
104103

105104
ArrayConstRefIterator &operator++() {
106-
_slot = _slot->getNext();
105+
_slot = _slot->next();
107106
return *this;
108107
}
109108

110109
ArrayConstRefIterator &operator+=(size_t distance) {
111-
_slot = _slot->getNext(distance);
110+
_slot = _slot->next(distance);
112111
return *this;
113112
}
114113

src/ArduinoJson/Array/ArrayRef.hpp

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,67 +21,65 @@ class ArraySubscript;
2121
template <typename TData>
2222
class ArrayRefBase {
2323
public:
24+
template <typename Visitor>
25+
FORCE_INLINE void accept(Visitor& visitor) const {
26+
arrayAccept(_data, visitor);
27+
}
28+
2429
FORCE_INLINE bool isNull() const {
2530
return _data == 0;
2631
}
2732

2833
FORCE_INLINE VariantConstRef operator[](size_t index) const {
29-
return VariantConstRef(arrayGet(_data, index));
34+
return VariantConstRef(_data ? _data->get(index) : 0);
3035
}
3136

3237
FORCE_INLINE size_t size() const {
33-
return arraySize(_data);
38+
return _data ? _data->size() : 0;
3439
}
3540

3641
protected:
3742
ArrayRefBase(TData* data) : _data(data) {}
3843
TData* _data;
3944
};
4045

41-
class ArrayConstRef : public ArrayRefBase<const ArrayData>, public Visitable {
46+
class ArrayConstRef : public ArrayRefBase<const CollectionData>,
47+
public Visitable {
4248
friend class ArrayRef;
43-
typedef ArrayRefBase<const ArrayData> base_type;
49+
typedef ArrayRefBase<const CollectionData> base_type;
4450

4551
public:
4652
typedef ArrayConstRefIterator iterator;
4753

48-
template <typename Visitor>
49-
FORCE_INLINE void accept(Visitor& visitor) const {
50-
if (_data)
51-
visitor.visitArray(*this);
52-
else
53-
visitor.visitNull();
54-
}
55-
5654
FORCE_INLINE iterator begin() const {
5755
if (!_data) return iterator();
58-
return iterator(_data->head);
56+
return iterator(_data->head());
5957
}
6058

6159
FORCE_INLINE iterator end() const {
6260
return iterator();
6361
}
6462

6563
FORCE_INLINE ArrayConstRef() : base_type(0) {}
66-
FORCE_INLINE ArrayConstRef(const ArrayData* data) : base_type(data) {}
64+
FORCE_INLINE ArrayConstRef(const CollectionData* data) : base_type(data) {}
6765

6866
FORCE_INLINE bool operator==(ArrayConstRef rhs) const {
6967
return arrayEquals(_data, rhs._data);
7068
}
7169
};
7270

73-
class ArrayRef : public ArrayRefBase<ArrayData>, public Visitable {
74-
typedef ArrayRefBase<ArrayData> base_type;
71+
class ArrayRef : public ArrayRefBase<CollectionData>, public Visitable {
72+
typedef ArrayRefBase<CollectionData> base_type;
7573

7674
public:
7775
typedef ArrayIterator iterator;
7876

79-
FORCE_INLINE ArrayRef() : base_type(0), _memoryPool(0) {}
80-
FORCE_INLINE ArrayRef(MemoryPool* pool, ArrayData* data)
81-
: base_type(data), _memoryPool(pool) {}
77+
FORCE_INLINE ArrayRef() : base_type(0), _pool(0) {}
78+
FORCE_INLINE ArrayRef(MemoryPool* pool, CollectionData* data)
79+
: base_type(data), _pool(pool) {}
8280

8381
operator VariantRef() {
84-
return VariantRef(_memoryPool, getVariantData(_data));
82+
return VariantRef(_pool, reinterpret_cast<VariantData*>(_data));
8583
}
8684

8785
operator ArrayConstRef() const {
@@ -110,12 +108,12 @@ class ArrayRef : public ArrayRefBase<ArrayData>, public Visitable {
110108
}
111109

112110
VariantRef add() const {
113-
return VariantRef(_memoryPool, arrayAdd(_data, _memoryPool));
111+
return VariantRef(_pool, arrayAdd(_data, _pool));
114112
}
115113

116114
FORCE_INLINE iterator begin() const {
117115
if (!_data) return iterator();
118-
return iterator(_memoryPool, _data->head);
116+
return iterator(_pool, _data->head());
119117
}
120118

121119
FORCE_INLINE iterator end() const {
@@ -153,7 +151,8 @@ class ArrayRef : public ArrayRefBase<ArrayData>, public Visitable {
153151

154152
// Copy a ArrayRef
155153
FORCE_INLINE bool copyFrom(ArrayRef src) const {
156-
return arrayCopy(_data, src._data, _memoryPool);
154+
if (!_data || !src._data) return false;
155+
return _data->copyFrom(*src._data, _pool);
157156
}
158157

159158
// Exports a 1D array
@@ -191,30 +190,22 @@ class ArrayRef : public ArrayRefBase<ArrayData>, public Visitable {
191190

192191
// Gets the value at the specified index.
193192
FORCE_INLINE VariantRef get(size_t index) const {
194-
return VariantRef(_memoryPool, arrayGet(_data, index));
193+
return VariantRef(_pool, _data ? _data->get(index) : 0);
195194
}
196195

197196
// Removes element at specified position.
198197
FORCE_INLINE void remove(iterator it) const {
199-
arrayRemove(_data, it.internal());
198+
if (!_data) return;
199+
_data->remove(it.internal());
200200
}
201201

202202
// Removes element at specified index.
203203
FORCE_INLINE void remove(size_t index) const {
204-
arrayRemove(_data, index);
205-
}
206-
207-
template <typename Visitor>
208-
FORCE_INLINE void accept(Visitor& visitor) const {
209-
ArrayConstRef(_data).accept(visitor);
204+
if (!_data) return;
205+
_data->remove(index);
210206
}
211207

212208
private:
213-
template <typename TValueRef>
214-
FORCE_INLINE bool add_impl(TValueRef value) const {
215-
return add().set(value);
216-
}
217-
218-
MemoryPool* _memoryPool;
209+
MemoryPool* _pool;
219210
};
220211
} // namespace ARDUINOJSON_NAMESPACE

0 commit comments

Comments
 (0)
0