Skip to content

Commit 98daccf

Browse files
committed
Extract accept()
Before: 9802, 8718, 9630, 12606, 9880 After: 9802, 8568, 9630, 12434, 9796 Target: 9800, 8458, 9634, 12290, 9702
1 parent bc8dcff commit 98daccf

File tree

8 files changed

+74
-61
lines changed

8 files changed

+74
-61
lines changed

src/ArduinoJson/Json/JsonSerializer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class JsonSerializer : public VariantDataVisitor<size_t> {
2727
while (slotId != NULL_SLOT) {
2828
auto slot = resources_->getVariant(slotId);
2929

30-
VariantImpl(slot, resources_).accept(*this);
30+
VariantImpl::accept(*this, slot, resources_);
3131

3232
slotId = slot->next;
3333

@@ -48,7 +48,7 @@ class JsonSerializer : public VariantDataVisitor<size_t> {
4848

4949
while (slotId != NULL_SLOT) {
5050
auto slot = resources_->getVariant(slotId);
51-
VariantImpl(slot, resources_).accept(*this);
51+
VariantImpl::accept(*this, slot, resources_);
5252

5353
slotId = slot->next;
5454

src/ArduinoJson/Json/PrettyJsonSerializer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class PrettyJsonSerializer : public JsonSerializer<TWriter> {
2626
nesting_++;
2727
while (!it.done()) {
2828
indent();
29-
VariantImpl(it.data(), base::resources_).accept(*this);
29+
VariantImpl::accept(*this, it.data(), base::resources_);
3030

3131
it.next(base::resources_);
3232
base::write(it.done() ? "\r\n" : ",\r\n");
@@ -49,7 +49,7 @@ class PrettyJsonSerializer : public JsonSerializer<TWriter> {
4949
while (!it.done()) {
5050
if (isKey)
5151
indent();
52-
VariantImpl(it.data(), base::resources_).accept(*this);
52+
VariantImpl::accept(*this, it.data(), base::resources_);
5353
it.next(base::resources_);
5454
if (isKey)
5555
base::write(": ");

src/ArduinoJson/MsgPack/MsgPackSerializer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class MsgPackSerializer : public VariantDataVisitor<size_t> {
6262
auto slotId = array.head();
6363
while (slotId != NULL_SLOT) {
6464
auto slot = resources_->getVariant(slotId);
65-
VariantImpl(slot, resources_).accept(*this);
65+
VariantImpl::accept(*this, slot, resources_);
6666
slotId = slot->next;
6767
}
6868

@@ -84,7 +84,7 @@ class MsgPackSerializer : public VariantDataVisitor<size_t> {
8484
auto slotId = object.head();
8585
while (slotId != NULL_SLOT) {
8686
auto slot = resources_->getVariant(slotId);
87-
VariantImpl(slot, resources_).accept(*this);
87+
VariantImpl::accept(*this, slot, resources_);
8888
slotId = slot->next;
8989
}
9090

src/ArduinoJson/Serialization/measure.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ size_t measure(ArduinoJson::JsonVariantConst source) {
1414
auto data = VariantAttorney::getData(source);
1515
auto resources = VariantAttorney::getResourceManager(source);
1616
TSerializer<DummyWriter> serializer(dp, resources);
17-
return VariantImpl(data, resources).accept(serializer);
17+
return VariantImpl::accept(serializer, data, resources);
1818
}
1919

2020
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Serialization/serialize.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ size_t doSerialize(ArduinoJson::JsonVariantConst source, TWriter writer) {
1313
auto data = VariantAttorney::getData(source);
1414
auto resources = VariantAttorney::getResourceManager(source);
1515
TSerializer<TWriter> serializer(writer, resources);
16-
return VariantImpl(data, resources).accept(serializer);
16+
return VariantImpl::accept(serializer, data, resources);
1717
}
1818

1919
template <template <typename> class TSerializer, typename TDestination>

src/ArduinoJson/Variant/JsonVariantVisitor.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ typename TVisitor::result_type accept(JsonVariantConst variant,
5151
auto data = VariantAttorney::getData(variant);
5252
auto resources = VariantAttorney::getResourceManager(variant);
5353
VisitorAdapter<TVisitor> adapter(visit);
54-
return VariantImpl(data, resources).accept(adapter);
54+
return VariantImpl::accept(adapter, data, resources);
5555
}
5656

5757
ARDUINOJSON_END_PRIVATE_NAMESPACE

src/ArduinoJson/Variant/VariantData.hpp

Lines changed: 6 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -102,60 +102,14 @@ class VariantImpl {
102102

103103
template <typename TVisitor>
104104
typename TVisitor::result_type accept(TVisitor& visit) {
105-
if (!data_)
106-
return visit.visit(nullptr);
107-
108-
#if ARDUINOJSON_USE_8_BYTE_POOL
109-
auto eightByteValue = getEightByte();
110-
#endif
111-
switch (data_->type) {
112-
case VariantType::Float:
113-
return visit.visit(data_->content.asFloat);
114-
115-
#if ARDUINOJSON_USE_DOUBLE
116-
case VariantType::Double:
117-
return visit.visit(eightByteValue->asDouble);
118-
#endif
119-
120-
case VariantType::Array:
121-
return visit.visit(asArray());
122-
123-
case VariantType::Object:
124-
return visit.visit(asObject());
125-
126-
case VariantType::TinyString:
127-
return visit.visit(JsonString(data_->content.asTinyString));
128-
129-
case VariantType::LongString:
130-
return visit.visit(JsonString(data_->content.asStringNode->data,
131-
data_->content.asStringNode->length));
132-
133-
case VariantType::RawString:
134-
return visit.visit(RawString(data_->content.asStringNode->data,
135-
data_->content.asStringNode->length));
136-
137-
case VariantType::Int32:
138-
return visit.visit(static_cast<JsonInteger>(data_->content.asInt32));
139-
140-
case VariantType::Uint32:
141-
return visit.visit(static_cast<JsonUInt>(data_->content.asUint32));
142-
143-
#if ARDUINOJSON_USE_LONG_LONG
144-
case VariantType::Int64:
145-
return visit.visit(eightByteValue->asInt64);
146-
147-
case VariantType::Uint64:
148-
return visit.visit(eightByteValue->asUint64);
149-
#endif
150-
151-
case VariantType::Boolean:
152-
return visit.visit(data_->content.asBoolean != 0);
153-
154-
default:
155-
return visit.visit(nullptr);
156-
}
105+
return accept(visit, data_, resources_);
157106
}
158107

108+
template <typename TVisitor>
109+
static typename TVisitor::result_type accept(TVisitor& visit,
110+
VariantData* data_,
111+
ResourceManager* resources_);
112+
159113
VariantData* addElement() {
160114
auto array = isNull() ? toArray() : asArray();
161115
return array.addElement();

src/ArduinoJson/Variant/VariantImpl.hpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,65 @@
99

1010
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
1111

12+
template <typename TVisitor>
13+
typename TVisitor::result_type VariantImpl::accept(
14+
TVisitor& visit, VariantData* data_, ResourceManager* resources_) {
15+
if (!data_)
16+
return visit.visit(nullptr);
17+
18+
#if ARDUINOJSON_USE_8_BYTE_POOL
19+
auto eightByteValue = data_->type & VariantTypeBits::EightByteBit
20+
? resources_->getEightByte(data_->content.asSlotId)
21+
: 0;
22+
#endif
23+
switch (data_->type) {
24+
case VariantType::Float:
25+
return visit.visit(data_->content.asFloat);
26+
27+
#if ARDUINOJSON_USE_DOUBLE
28+
case VariantType::Double:
29+
return visit.visit(eightByteValue->asDouble);
30+
#endif
31+
32+
case VariantType::Array:
33+
return visit.visit(ArrayImpl(&data_->content.asCollection, resources_));
34+
35+
case VariantType::Object:
36+
return visit.visit(ObjectImpl(&data_->content.asCollection, resources_));
37+
38+
case VariantType::TinyString:
39+
return visit.visit(JsonString(data_->content.asTinyString));
40+
41+
case VariantType::LongString:
42+
return visit.visit(JsonString(data_->content.asStringNode->data,
43+
data_->content.asStringNode->length));
44+
45+
case VariantType::RawString:
46+
return visit.visit(RawString(data_->content.asStringNode->data,
47+
data_->content.asStringNode->length));
48+
49+
case VariantType::Int32:
50+
return visit.visit(static_cast<JsonInteger>(data_->content.asInt32));
51+
52+
case VariantType::Uint32:
53+
return visit.visit(static_cast<JsonUInt>(data_->content.asUint32));
54+
55+
#if ARDUINOJSON_USE_LONG_LONG
56+
case VariantType::Int64:
57+
return visit.visit(eightByteValue->asInt64);
58+
59+
case VariantType::Uint64:
60+
return visit.visit(eightByteValue->asUint64);
61+
#endif
62+
63+
case VariantType::Boolean:
64+
return visit.visit(data_->content.asBoolean != 0);
65+
66+
default:
67+
return visit.visit(nullptr);
68+
}
69+
}
70+
1271
template <typename T>
1372
inline void VariantImpl::setRawString(SerializedValue<T> value) {
1473
if (!data_)

0 commit comments

Comments
 (0)