Skip to content

Commit 3f62a2c

Browse files
committed
VariantImpl: change the visitor interface for arrays and objects
1 parent 6dbdeca commit 3f62a2c

File tree

6 files changed

+63
-34
lines changed

6 files changed

+63
-34
lines changed

src/ArduinoJson/Json/JsonSerializer.hpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@ class JsonSerializer : public VariantDataVisitor<size_t> {
1919
JsonSerializer(TWriter writer, ResourceManager* resources)
2020
: formatter_(writer), resources_(resources) {}
2121

22-
size_t visit(const ArrayImpl& array) {
22+
size_t visitArray(VariantData* array) {
23+
ARDUINOJSON_ASSERT(array != nullptr);
24+
ARDUINOJSON_ASSERT(array->isArray());
25+
2326
write('[');
2427

25-
auto slotId = array.head();
28+
auto slotId = array->content.asCollection.head;
2629

2730
while (slotId != NULL_SLOT) {
2831
auto slot = resources_->getVariant(slotId);
@@ -39,10 +42,13 @@ class JsonSerializer : public VariantDataVisitor<size_t> {
3942
return bytesWritten();
4043
}
4144

42-
size_t visit(const ObjectImpl& object) {
45+
size_t visitObject(VariantData* object) {
46+
ARDUINOJSON_ASSERT(object != nullptr);
47+
ARDUINOJSON_ASSERT(object->isObject());
48+
4349
write('{');
4450

45-
auto slotId = object.head();
51+
auto slotId = object->content.asCollection.head;
4652

4753
bool isKey = true;
4854

src/ArduinoJson/Json/PrettyJsonSerializer.hpp

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,21 @@ class PrettyJsonSerializer : public JsonSerializer<TWriter> {
1919
PrettyJsonSerializer(TWriter writer, ResourceManager* resources)
2020
: base(writer, resources), nesting_(0) {}
2121

22-
size_t visit(const ArrayImpl& array) {
23-
auto it = array.createIterator();
24-
if (!it.done()) {
22+
size_t visitArray(VariantData* array) {
23+
ARDUINOJSON_ASSERT(array != nullptr);
24+
ARDUINOJSON_ASSERT(array->isArray());
25+
26+
auto slotId = array->content.asCollection.head;
27+
if (slotId != NULL_SLOT) {
2528
base::write("[\r\n");
2629
nesting_++;
27-
while (!it.done()) {
30+
while (slotId != NULL_SLOT) {
2831
indent();
29-
VariantImpl::accept(*this, it.data(), base::resources_);
32+
auto slot = base::resources_->getVariant(slotId);
33+
VariantImpl::accept(*this, slot, base::resources_);
3034

31-
it.next(base::resources_);
32-
base::write(it.done() ? "\r\n" : ",\r\n");
35+
slotId = slot->next;
36+
base::write(slotId == NULL_SLOT ? "\r\n" : ",\r\n");
3337
}
3438
nesting_--;
3539
indent();
@@ -40,21 +44,25 @@ class PrettyJsonSerializer : public JsonSerializer<TWriter> {
4044
return this->bytesWritten();
4145
}
4246

43-
size_t visit(const ObjectImpl& object) {
44-
auto it = object.createIterator();
45-
if (!it.done()) {
47+
size_t visitObject(VariantData* object) {
48+
ARDUINOJSON_ASSERT(object != nullptr);
49+
ARDUINOJSON_ASSERT(object->isObject());
50+
51+
auto slotId = object->content.asCollection.head;
52+
if (slotId != NULL_SLOT) {
4653
base::write("{\r\n");
4754
nesting_++;
4855
bool isKey = true;
49-
while (!it.done()) {
56+
while (slotId != NULL_SLOT) {
5057
if (isKey)
5158
indent();
52-
VariantImpl::accept(*this, it.data(), base::resources_);
53-
it.next(base::resources_);
59+
auto slot = base::resources_->getVariant(slotId);
60+
VariantImpl::accept(*this, slot, base::resources_);
61+
slotId = slot->next;
5462
if (isKey)
5563
base::write(": ");
5664
else
57-
base::write(it.done() ? "\r\n" : ",\r\n");
65+
base::write(slotId == NULL_SLOT ? "\r\n" : ",\r\n");
5866
isKey = !isKey;
5967
}
6068
nesting_--;

src/ArduinoJson/MsgPack/MsgPackSerializer.hpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,11 @@ class MsgPackSerializer : public VariantDataVisitor<size_t> {
4747
return bytesWritten();
4848
}
4949

50-
size_t visit(const ArrayImpl& array) {
51-
size_t n = array.size();
50+
size_t visitArray(VariantData* array) {
51+
ARDUINOJSON_ASSERT(array != nullptr);
52+
ARDUINOJSON_ASSERT(array->isArray());
53+
54+
auto n = VariantImpl::size(array, resources_);
5255
if (n < 0x10) {
5356
writeByte(uint8_t(0x90 + n));
5457
} else if (n < 0x10000) {
@@ -59,7 +62,7 @@ class MsgPackSerializer : public VariantDataVisitor<size_t> {
5962
writeInteger(uint32_t(n));
6063
}
6164

62-
auto slotId = array.head();
65+
auto slotId = array->content.asCollection.head;
6366
while (slotId != NULL_SLOT) {
6467
auto slot = resources_->getVariant(slotId);
6568
VariantImpl::accept(*this, slot, resources_);
@@ -69,8 +72,11 @@ class MsgPackSerializer : public VariantDataVisitor<size_t> {
6972
return bytesWritten();
7073
}
7174

72-
size_t visit(const ObjectImpl& object) {
73-
size_t n = object.size();
75+
size_t visitObject(VariantData* object) {
76+
ARDUINOJSON_ASSERT(object != nullptr);
77+
ARDUINOJSON_ASSERT(object->isObject());
78+
79+
auto n = VariantImpl::size(object, resources_);
7480
if (n < 0x10) {
7581
writeByte(uint8_t(0x80 + n));
7682
} else if (n < 0x10000) {
@@ -81,7 +87,7 @@ class MsgPackSerializer : public VariantDataVisitor<size_t> {
8187
writeInteger(uint32_t(n));
8288
}
8389

84-
auto slotId = object.head();
90+
auto slotId = object->content.asCollection.head;
8591
while (slotId != NULL_SLOT) {
8692
auto slot = resources_->getVariant(slotId);
8793
VariantImpl::accept(*this, slot, resources_);

src/ArduinoJson/Variant/JsonVariantVisitor.hpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@ class VisitorAdapter {
2626
public:
2727
using result_type = typename TVisitor::result_type;
2828

29-
VisitorAdapter(TVisitor& visitor) : visitor_(&visitor) {}
29+
VisitorAdapter(TVisitor& visitor, ResourceManager* resources)
30+
: visitor_(&visitor), resources_(resources) {}
3031

31-
result_type visit(const ArrayImpl& array) {
32-
return visitor_->visit(JsonArrayConst(array));
32+
result_type visitArray(VariantData* data) {
33+
return visitor_->visit(JsonArrayConst(data, resources_));
3334
}
3435

35-
result_type visit(const ObjectImpl& object) {
36-
return visitor_->visit(JsonObjectConst(object));
36+
result_type visitObject(VariantData* data) {
37+
return visitor_->visit(JsonObjectConst(data, resources_));
3738
}
3839

3940
template <typename T>
@@ -43,12 +44,14 @@ class VisitorAdapter {
4344

4445
private:
4546
TVisitor* visitor_;
47+
ResourceManager* resources_;
4648
};
4749

4850
template <typename TVisitor>
4951
typename TVisitor::result_type accept(JsonVariantConst variant,
5052
TVisitor& visit) {
51-
VisitorAdapter<TVisitor> adapter(visit);
53+
VisitorAdapter<TVisitor> adapter(
54+
visit, VariantAttorney::getResourceManager(variant));
5255
return VariantAttorney::getVariantImpl(variant).accept(adapter);
5356
}
5457

src/ArduinoJson/Variant/VariantDataVisitor.hpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44

55
#pragma once
66

7-
#include <ArduinoJson/Array/ArrayData.hpp>
87
#include <ArduinoJson/Numbers/JsonFloat.hpp>
98
#include <ArduinoJson/Numbers/JsonInteger.hpp>
10-
#include <ArduinoJson/Object/ObjectData.hpp>
119

1210
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1311

@@ -19,6 +17,14 @@ struct VariantDataVisitor {
1917
TResult visit(const T&) {
2018
return TResult();
2119
}
20+
21+
TResult visitArray(VariantData*) {
22+
return TResult();
23+
}
24+
25+
TResult visitObject(VariantData*) {
26+
return TResult();
27+
}
2228
};
2329

2430
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Variant/VariantImpl.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ class VariantImpl {
5757
#endif
5858

5959
case VariantType::Array:
60-
return visit.visit(ArrayImpl(data, resources));
60+
return visit.visitArray(data);
6161

6262
case VariantType::Object:
63-
return visit.visit(ObjectImpl(data, resources));
63+
return visit.visitObject(data);
6464

6565
case VariantType::TinyString:
6666
return visit.visit(JsonString(data->content.asTinyString));

0 commit comments

Comments
 (0)