/src/arduinojson/src/ArduinoJson/Variant/VariantImpl.hpp
Line | Count | Source |
1 | | // ArduinoJson - https://arduinojson.org |
2 | | // Copyright © 2014-2026, Benoit BLANCHON |
3 | | // MIT License |
4 | | |
5 | | #pragma once |
6 | | |
7 | | #include <ArduinoJson/Collection/CollectionIterator.hpp> |
8 | | #include <ArduinoJson/Memory/ResourceManager.hpp> |
9 | | #include <ArduinoJson/Misc/SerializedValue.hpp> |
10 | | #include <ArduinoJson/Numbers/convertNumber.hpp> |
11 | | #include <ArduinoJson/Strings/JsonString.hpp> |
12 | | #include <ArduinoJson/Strings/StringAdapters.hpp> |
13 | | #include <ArduinoJson/Variant/VariantData.hpp> |
14 | | |
15 | | ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE |
16 | | |
17 | | // HACK: large functions are implemented in static function to give opportunity |
18 | | // to the compiler to optimize the `this` pointer away. |
19 | | class VariantImpl { |
20 | | public: |
21 | | using iterator = CollectionIterator; |
22 | | |
23 | 0 | VariantImpl() : data_(nullptr), resources_(nullptr) {} |
24 | | |
25 | | VariantImpl(VariantData* data, ResourceManager* resources) |
26 | 2.10k | : data_(data), resources_(resources) {} |
27 | | |
28 | 2.10k | VariantData* data() const { |
29 | 2.10k | return data_; |
30 | 2.10k | } |
31 | | |
32 | 2.10k | ResourceManager* resources() const { |
33 | 2.10k | return resources_; |
34 | 2.10k | } |
35 | | |
36 | | template <typename TVisitor> |
37 | 0 | typename TVisitor::result_type accept(TVisitor& visit) { |
38 | 0 | return accept(visit, data_, resources_); |
39 | 0 | } Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonVariantConst, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonVariantConst, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonVariantConst, void> >&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ArrayComparer>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ArrayComparer> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ArrayComparer>&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ObjectComparer>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ObjectComparer> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ObjectComparer>&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<double, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<double, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<double, void> >&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonString, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonString, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonString, void> >&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::RawComparer>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::RawComparer> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::RawComparer>&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<long, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<long, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<long, void> >&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<unsigned long, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<unsigned long, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<unsigned long, void> >&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<bool, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<bool, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<bool, void> >&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::NullComparer>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::NullComparer> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::NullComparer>&) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::JsonVariantCopier>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::JsonVariantCopier> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::JsonVariantCopier>&) |
40 | | |
41 | | template <typename TVisitor> |
42 | | static typename TVisitor::result_type accept(TVisitor& visit, |
43 | | VariantData* data, |
44 | 73.1k | ResourceManager* resources) { |
45 | 73.1k | if (!data) |
46 | 0 | return visit.visit(nullptr); |
47 | | |
48 | 73.1k | #if ARDUINOJSON_USE_8_BYTE_POOL |
49 | 73.1k | auto eightByteValue = getEightByte(data, resources); |
50 | 73.1k | #endif |
51 | 73.1k | switch (data->type) { |
52 | 5.49k | case VariantType::Float: |
53 | 5.49k | return visit.visit(data->content.asFloat); |
54 | | |
55 | 0 | #if ARDUINOJSON_USE_DOUBLE |
56 | 1.53k | case VariantType::Double: |
57 | 1.53k | return visit.visit(eightByteValue->asDouble); |
58 | 0 | #endif |
59 | | |
60 | 4.35k | case VariantType::Array: |
61 | 4.35k | return visit.visitArray(data); |
62 | | |
63 | 1.79k | case VariantType::Object: |
64 | 1.79k | return visit.visitObject(data); |
65 | | |
66 | 13.0k | case VariantType::TinyString: |
67 | 13.0k | return visit.visit(JsonString(data->content.asTinyString)); |
68 | | |
69 | 563 | case VariantType::LongString: |
70 | 563 | return visit.visit(JsonString(data->content.asStringNode->data, |
71 | 563 | data->content.asStringNode->length)); |
72 | | |
73 | 203 | case VariantType::RawString: |
74 | 203 | return visit.visit(RawString(data->content.asStringNode->data, |
75 | 203 | data->content.asStringNode->length)); |
76 | | |
77 | 32.6k | case VariantType::Int32: |
78 | 32.6k | return visit.visit(static_cast<JsonInteger>(data->content.asInt32)); |
79 | | |
80 | 7.91k | case VariantType::Uint32: |
81 | 7.91k | return visit.visit(static_cast<JsonUInt>(data->content.asUint32)); |
82 | | |
83 | 0 | #if ARDUINOJSON_USE_LONG_LONG |
84 | 736 | case VariantType::Int64: |
85 | 736 | return visit.visit(eightByteValue->asInt64); |
86 | | |
87 | 1.25k | case VariantType::Uint64: |
88 | 1.25k | return visit.visit(eightByteValue->asUint64); |
89 | 0 | #endif |
90 | | |
91 | 2.80k | case VariantType::Boolean: |
92 | 2.80k | return visit.visit(data->content.asBoolean != 0); |
93 | | |
94 | 855 | default: |
95 | 855 | return visit.visit(nullptr); |
96 | 73.1k | } |
97 | 73.1k | } ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> > >(ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Line | Count | Source | 44 | 17.7k | ResourceManager* resources) { | 45 | 17.7k | if (!data) | 46 | 0 | return visit.visit(nullptr); | 47 | | | 48 | 17.7k | #if ARDUINOJSON_USE_8_BYTE_POOL | 49 | 17.7k | auto eightByteValue = getEightByte(data, resources); | 50 | 17.7k | #endif | 51 | 17.7k | switch (data->type) { | 52 | 4.28k | case VariantType::Float: | 53 | 4.28k | return visit.visit(data->content.asFloat); | 54 | | | 55 | 0 | #if ARDUINOJSON_USE_DOUBLE | 56 | 1.33k | case VariantType::Double: | 57 | 1.33k | return visit.visit(eightByteValue->asDouble); | 58 | 0 | #endif | 59 | | | 60 | 1.31k | case VariantType::Array: | 61 | 1.31k | return visit.visitArray(data); | 62 | | | 63 | 518 | case VariantType::Object: | 64 | 518 | return visit.visitObject(data); | 65 | | | 66 | 872 | case VariantType::TinyString: | 67 | 872 | return visit.visit(JsonString(data->content.asTinyString)); | 68 | | | 69 | 239 | case VariantType::LongString: | 70 | 239 | return visit.visit(JsonString(data->content.asStringNode->data, | 71 | 239 | data->content.asStringNode->length)); | 72 | | | 73 | 0 | case VariantType::RawString: | 74 | 0 | return visit.visit(RawString(data->content.asStringNode->data, | 75 | 0 | data->content.asStringNode->length)); | 76 | | | 77 | 649 | case VariantType::Int32: | 78 | 649 | return visit.visit(static_cast<JsonInteger>(data->content.asInt32)); | 79 | | | 80 | 7.12k | case VariantType::Uint32: | 81 | 7.12k | return visit.visit(static_cast<JsonUInt>(data->content.asUint32)); | 82 | | | 83 | 0 | #if ARDUINOJSON_USE_LONG_LONG | 84 | 468 | case VariantType::Int64: | 85 | 468 | return visit.visit(eightByteValue->asInt64); | 86 | | | 87 | 402 | case VariantType::Uint64: | 88 | 402 | return visit.visit(eightByteValue->asUint64); | 89 | 0 | #endif | 90 | | | 91 | 388 | case VariantType::Boolean: | 92 | 388 | return visit.visit(data->content.asBoolean != 0); | 93 | | | 94 | 194 | default: | 95 | 194 | return visit.visit(nullptr); | 96 | 17.7k | } | 97 | 17.7k | } |
Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonVariantConst, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonVariantConst, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonVariantConst, void> >&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ArrayComparer>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ArrayComparer> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ArrayComparer>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ObjectComparer>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ObjectComparer> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::ObjectComparer>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<double, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<double, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<double, void> >&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonString, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonString, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<ArduinoJson::V742HB42::JsonString, void> >&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::RawComparer>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::RawComparer> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::RawComparer>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<long, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<long, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<long, void> >&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<unsigned long, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<unsigned long, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<unsigned long, void> >&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<bool, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<bool, void> > >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::Comparer<bool, void> >&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::NullComparer>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::NullComparer> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::NullComparer>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter> >(ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter> >(ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::JsonVariantCopier>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::JsonVariantCopier> >(ArduinoJson::V742HB42::detail::VisitorAdapter<ArduinoJson::V742HB42::detail::JsonVariantCopier>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::PrettyJsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::PrettyJsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter> >(ArduinoJson::V742HB42::detail::PrettyJsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::PrettyJsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::PrettyJsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter> >(ArduinoJson::V742HB42::detail::PrettyJsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::MsgPackSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::MsgPackSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter> >(ArduinoJson::V742HB42::detail::MsgPackSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Unexecuted instantiation: ArduinoJson::V742HB42::detail::MsgPackSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::MsgPackSerializer<ArduinoJson::V742HB42::detail::DummyWriter> >(ArduinoJson::V742HB42::detail::MsgPackSerializer<ArduinoJson::V742HB42::detail::DummyWriter>&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) ArduinoJson::V742HB42::detail::MsgPackSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::result_type ArduinoJson::V742HB42::detail::VariantImpl::accept<ArduinoJson::V742HB42::detail::MsgPackSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> > >(ArduinoJson::V742HB42::detail::MsgPackSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >&, ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Line | Count | Source | 44 | 55.3k | ResourceManager* resources) { | 45 | 55.3k | if (!data) | 46 | 0 | return visit.visit(nullptr); | 47 | | | 48 | 55.3k | #if ARDUINOJSON_USE_8_BYTE_POOL | 49 | 55.3k | auto eightByteValue = getEightByte(data, resources); | 50 | 55.3k | #endif | 51 | 55.3k | switch (data->type) { | 52 | 1.21k | case VariantType::Float: | 53 | 1.21k | return visit.visit(data->content.asFloat); | 54 | | | 55 | 0 | #if ARDUINOJSON_USE_DOUBLE | 56 | 194 | case VariantType::Double: | 57 | 194 | return visit.visit(eightByteValue->asDouble); | 58 | 0 | #endif | 59 | | | 60 | 3.03k | case VariantType::Array: | 61 | 3.03k | return visit.visitArray(data); | 62 | | | 63 | 1.27k | case VariantType::Object: | 64 | 1.27k | return visit.visitObject(data); | 65 | | | 66 | 12.1k | case VariantType::TinyString: | 67 | 12.1k | return visit.visit(JsonString(data->content.asTinyString)); | 68 | | | 69 | 324 | case VariantType::LongString: | 70 | 324 | return visit.visit(JsonString(data->content.asStringNode->data, | 71 | 324 | data->content.asStringNode->length)); | 72 | | | 73 | 203 | case VariantType::RawString: | 74 | 203 | return visit.visit(RawString(data->content.asStringNode->data, | 75 | 203 | data->content.asStringNode->length)); | 76 | | | 77 | 31.9k | case VariantType::Int32: | 78 | 31.9k | return visit.visit(static_cast<JsonInteger>(data->content.asInt32)); | 79 | | | 80 | 790 | case VariantType::Uint32: | 81 | 790 | return visit.visit(static_cast<JsonUInt>(data->content.asUint32)); | 82 | | | 83 | 0 | #if ARDUINOJSON_USE_LONG_LONG | 84 | 268 | case VariantType::Int64: | 85 | 268 | return visit.visit(eightByteValue->asInt64); | 86 | | | 87 | 850 | case VariantType::Uint64: | 88 | 850 | return visit.visit(eightByteValue->asUint64); | 89 | 0 | #endif | 90 | | | 91 | 2.41k | case VariantType::Boolean: | 92 | 2.41k | return visit.visit(data->content.asBoolean != 0); | 93 | | | 94 | 661 | default: | 95 | 661 | return visit.visit(nullptr); | 96 | 55.3k | } | 97 | 55.3k | } |
|
98 | | |
99 | 0 | VariantData* addNewElement() { |
100 | 0 | if (!isArray()) |
101 | 0 | return nullptr; |
102 | 0 | return addNewElement(data_, resources_); |
103 | 0 | } |
104 | | |
105 | | static VariantData* addNewElement(VariantData*, ResourceManager*); |
106 | | |
107 | | static void addElement(Slot<VariantData> slot, VariantData*, |
108 | | ResourceManager*); |
109 | | |
110 | | template <typename TAdaptedString> |
111 | | VariantData* addMember(TAdaptedString key) { |
112 | | if (!isObject()) |
113 | | return nullptr; |
114 | | return addMember(key, data_, resources_); |
115 | | } |
116 | | |
117 | | template <typename TAdaptedString> |
118 | | static VariantData* addMember(TAdaptedString key, VariantData*, |
119 | | ResourceManager*); |
120 | | |
121 | 0 | VariantData* addPair(VariantData** value) { |
122 | 0 | if (isNull()) |
123 | 0 | return nullptr; |
124 | 0 | return addPair(value, data_, resources_); |
125 | 0 | } |
126 | | |
127 | | static VariantData* addPair(VariantData** value, VariantData*, |
128 | | ResourceManager*); |
129 | | |
130 | 0 | bool asBoolean() const { |
131 | 0 | return asBoolean(data_, resources_); |
132 | 0 | } |
133 | | |
134 | 0 | static bool asBoolean(VariantData* data, ResourceManager* resources) { |
135 | 0 | if (!data) |
136 | 0 | return false; |
137 | 0 |
|
138 | 0 | #if ARDUINOJSON_USE_8_BYTE_POOL |
139 | 0 | auto eightByteValue = getEightByte(data, resources); |
140 | 0 | #endif |
141 | 0 | switch (data->type) { |
142 | 0 | case VariantType::Boolean: |
143 | 0 | return data->content.asBoolean; |
144 | 0 | case VariantType::Uint32: |
145 | 0 | case VariantType::Int32: |
146 | 0 | return data->content.asUint32 != 0; |
147 | 0 | case VariantType::Float: |
148 | 0 | return data->content.asFloat != 0; |
149 | 0 | #if ARDUINOJSON_USE_DOUBLE |
150 | 0 | case VariantType::Double: |
151 | 0 | return eightByteValue->asDouble != 0; |
152 | 0 | #endif |
153 | 0 | case VariantType::Null: |
154 | 0 | return false; |
155 | 0 | #if ARDUINOJSON_USE_LONG_LONG |
156 | 0 | case VariantType::Uint64: |
157 | 0 | case VariantType::Int64: |
158 | 0 | return eightByteValue->asUint64 != 0; |
159 | 0 | #endif |
160 | 0 | default: |
161 | 0 | return true; |
162 | 0 | } |
163 | 0 | } |
164 | | |
165 | | template <typename T> |
166 | | T asFloat() const { |
167 | | return asFloat<T>(data_, resources_); |
168 | | } |
169 | | |
170 | | template <typename T> |
171 | | static T asFloat(VariantData* data, ResourceManager* resources) { |
172 | | if (!data) |
173 | | return 0.0; |
174 | | |
175 | | static_assert(is_floating_point<T>::value, "T must be a floating point"); |
176 | | #if ARDUINOJSON_USE_8_BYTE_POOL |
177 | | auto eightByteValue = getEightByte(data, resources); |
178 | | #endif |
179 | | const char* str = nullptr; |
180 | | switch (data->type) { |
181 | | case VariantType::Boolean: |
182 | | return static_cast<T>(data->content.asBoolean); |
183 | | case VariantType::Uint32: |
184 | | return static_cast<T>(data->content.asUint32); |
185 | | case VariantType::Int32: |
186 | | return static_cast<T>(data->content.asInt32); |
187 | | #if ARDUINOJSON_USE_LONG_LONG |
188 | | case VariantType::Uint64: |
189 | | return static_cast<T>(eightByteValue->asUint64); |
190 | | case VariantType::Int64: |
191 | | return static_cast<T>(eightByteValue->asInt64); |
192 | | #endif |
193 | | case VariantType::TinyString: |
194 | | str = data->content.asTinyString; |
195 | | break; |
196 | | case VariantType::LongString: |
197 | | str = data->content.asStringNode->data; |
198 | | break; |
199 | | case VariantType::Float: |
200 | | return static_cast<T>(data->content.asFloat); |
201 | | #if ARDUINOJSON_USE_DOUBLE |
202 | | case VariantType::Double: |
203 | | return static_cast<T>(eightByteValue->asDouble); |
204 | | #endif |
205 | | default: |
206 | | return 0.0; |
207 | | } |
208 | | |
209 | | ARDUINOJSON_ASSERT(str != nullptr); |
210 | | return parseNumber<T>(str); |
211 | | } |
212 | | |
213 | | template <typename T> |
214 | | T asIntegral() const { |
215 | | return asIntegral<T>(data_, resources_); |
216 | | } |
217 | | |
218 | | template <typename T> |
219 | | static T asIntegral(VariantData* data, ResourceManager* resources) { |
220 | | if (!data) |
221 | | return 0; |
222 | | |
223 | | static_assert(is_integral<T>::value, "T must be an integral type"); |
224 | | #if ARDUINOJSON_USE_8_BYTE_POOL |
225 | | auto eightByteValue = getEightByte(data, resources); |
226 | | #endif |
227 | | const char* str = nullptr; |
228 | | switch (data->type) { |
229 | | case VariantType::Boolean: |
230 | | return data->content.asBoolean; |
231 | | case VariantType::Uint32: |
232 | | return convertNumber<T>(data->content.asUint32); |
233 | | case VariantType::Int32: |
234 | | return convertNumber<T>(data->content.asInt32); |
235 | | #if ARDUINOJSON_USE_LONG_LONG |
236 | | case VariantType::Uint64: |
237 | | return convertNumber<T>(eightByteValue->asUint64); |
238 | | case VariantType::Int64: |
239 | | return convertNumber<T>(eightByteValue->asInt64); |
240 | | #endif |
241 | | case VariantType::TinyString: |
242 | | str = data->content.asTinyString; |
243 | | break; |
244 | | case VariantType::LongString: |
245 | | str = data->content.asStringNode->data; |
246 | | break; |
247 | | case VariantType::Float: |
248 | | return convertNumber<T>(data->content.asFloat); |
249 | | #if ARDUINOJSON_USE_DOUBLE |
250 | | case VariantType::Double: |
251 | | return convertNumber<T>(eightByteValue->asDouble); |
252 | | #endif |
253 | | default: |
254 | | return 0; |
255 | | } |
256 | | |
257 | | ARDUINOJSON_ASSERT(str != nullptr); |
258 | | return parseNumber<T>(str); |
259 | | } |
260 | | |
261 | | iterator at(size_t index) const; |
262 | | |
263 | 0 | iterator createIterator() const { |
264 | 0 | if (!isCollection()) |
265 | 0 | return iterator(); |
266 | 0 | return createIterator(data_, resources_); |
267 | 0 | } |
268 | | |
269 | | static iterator createIterator(VariantData*, ResourceManager*); |
270 | | |
271 | | #if ARDUINOJSON_USE_8_BYTE_POOL |
272 | | static const EightByteValue* getEightByte(VariantData* data, |
273 | 73.1k | ResourceManager* resources) { |
274 | 73.1k | ARDUINOJSON_ASSERT(data != nullptr); |
275 | 73.1k | ARDUINOJSON_ASSERT(resources != nullptr); |
276 | 73.1k | return data->type & VariantTypeBits::EightByteBit |
277 | 73.1k | ? resources->getEightByte(data->content.asSlotId) |
278 | 73.1k | : 0; |
279 | 73.1k | } |
280 | | #endif |
281 | | |
282 | | VariantData* getOrAddElement(size_t index); |
283 | | |
284 | | VariantData* getElement(size_t index) const; |
285 | | |
286 | | template <typename TAdaptedString> |
287 | 0 | VariantData* getMember(TAdaptedString key) const { |
288 | 0 | if (!isObject()) |
289 | 0 | return nullptr; |
290 | 0 | return getMember(key, data_, resources_); |
291 | 0 | } |
292 | | |
293 | | template <typename TAdaptedString> |
294 | | static VariantData* getMember(TAdaptedString key, VariantData*, |
295 | | ResourceManager*); |
296 | | |
297 | | template <typename TAdaptedString> |
298 | 0 | VariantData* getOrAddMember(TAdaptedString key) { |
299 | 0 | if (!isObject()) |
300 | 0 | return nullptr; |
301 | 0 | return getOrAddMember(key, data_, resources_); |
302 | 0 | } |
303 | | |
304 | | template <typename TAdaptedString> |
305 | | static VariantData* getOrAddMember(TAdaptedString key, VariantData*, |
306 | | ResourceManager*); |
307 | | |
308 | 0 | bool isArray() const { |
309 | 0 | return type() == VariantType::Array; |
310 | 0 | } |
311 | | |
312 | 0 | bool isCollection() const { |
313 | 0 | return type() & VariantTypeBits::CollectionMask; |
314 | 0 | } |
315 | | |
316 | | template <typename T> |
317 | | bool isInteger() const { |
318 | | return isInteger<T>(data_, resources_); |
319 | | } |
320 | | |
321 | | template <typename T> |
322 | | static bool isInteger(VariantData* data, ResourceManager* resources) { |
323 | | if (!data) |
324 | | return false; |
325 | | |
326 | | #if ARDUINOJSON_USE_LONG_LONG |
327 | | auto eightByteValue = getEightByte(data, resources); |
328 | | #else |
329 | | (void)resources; |
330 | | #endif |
331 | | switch (data->type) { |
332 | | case VariantType::Uint32: |
333 | | return canConvertNumber<T>(data->content.asUint32); |
334 | | |
335 | | case VariantType::Int32: |
336 | | return canConvertNumber<T>(data->content.asInt32); |
337 | | |
338 | | #if ARDUINOJSON_USE_LONG_LONG |
339 | | case VariantType::Uint64: |
340 | | return canConvertNumber<T>(eightByteValue->asUint64); |
341 | | |
342 | | case VariantType::Int64: |
343 | | return canConvertNumber<T>(eightByteValue->asInt64); |
344 | | #endif |
345 | | |
346 | | default: |
347 | | return false; |
348 | | } |
349 | | } |
350 | | |
351 | 0 | bool isNull() const { |
352 | 0 | return type() == VariantType::Null; |
353 | 0 | } |
354 | | |
355 | 0 | bool isObject() const { |
356 | 0 | return type() == VariantType::Object; |
357 | 0 | } |
358 | | |
359 | | size_t nesting() const; |
360 | | |
361 | | void removeElement(size_t index); |
362 | | |
363 | 0 | void removeElement(CollectionIterator it) { |
364 | 0 | removeOne(it); |
365 | 0 | } |
366 | | |
367 | | template <typename TAdaptedString> |
368 | | void removeMember(TAdaptedString key) { |
369 | | removePair(findKey(key)); |
370 | | } |
371 | | |
372 | 0 | void removeMember(CollectionIterator it) { |
373 | 0 | removePair(it); |
374 | 0 | } |
375 | | |
376 | 0 | bool setBoolean(bool value) { |
377 | 0 | if (!data_) |
378 | 0 | return false; |
379 | 0 | clear(data_, resources_); |
380 | 0 | data_->setBoolean(value); |
381 | 0 | return true; |
382 | 0 | } |
383 | | |
384 | | template <typename T> |
385 | 0 | bool setFloat(T value) { |
386 | 0 | if (!data_) |
387 | 0 | return false; |
388 | 0 | clear(data_, resources_); |
389 | 0 | return setFloat(value, data_, resources_); |
390 | 0 | } Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantImpl::setFloat<float>(float) Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantImpl::setFloat<double>(double) |
391 | | |
392 | | template <typename T> |
393 | | static enable_if_t<sizeof(T) == 4, bool> setFloat(T value, VariantData* data, |
394 | 47.9k | ResourceManager*) { |
395 | 47.9k | ARDUINOJSON_ASSERT(data != nullptr); |
396 | 47.9k | ARDUINOJSON_ASSERT(data->type == VariantType::Null); |
397 | 47.9k | data->type = VariantType::Float; |
398 | 47.9k | data->content.asFloat = value; |
399 | 47.9k | return true; |
400 | 47.9k | } |
401 | | |
402 | | template <typename T> |
403 | | static enable_if_t<sizeof(T) == 8, bool> setFloat( |
404 | 10.0k | T value, VariantData* data, ResourceManager* resources) { |
405 | 10.0k | ARDUINOJSON_ASSERT(data != nullptr); |
406 | 10.0k | ARDUINOJSON_ASSERT(data->type == VariantType::Null); |
407 | 10.0k | ARDUINOJSON_ASSERT(resources != nullptr); |
408 | | |
409 | 10.0k | float valueAsFloat = static_cast<float>(value); |
410 | | |
411 | 10.0k | #if ARDUINOJSON_USE_DOUBLE |
412 | 10.0k | if (value == valueAsFloat) { |
413 | 1.27k | data->type = VariantType::Float; |
414 | 1.27k | data->content.asFloat = valueAsFloat; |
415 | 8.78k | } else { |
416 | 8.78k | auto slot = resources->allocEightByte(); |
417 | 8.78k | if (!slot) |
418 | 0 | return false; |
419 | 8.78k | data->type = VariantType::Double; |
420 | 8.78k | data->content.asSlotId = slot.id(); |
421 | 8.78k | slot->asDouble = value; |
422 | 8.78k | } |
423 | | #else |
424 | | data->type = VariantType::Float; |
425 | | data->content.asFloat = valueAsFloat; |
426 | | #endif |
427 | 10.0k | return true; |
428 | 10.0k | } |
429 | | |
430 | | template <typename T> |
431 | 0 | bool setInteger(T value) { |
432 | 0 | if (!data_) |
433 | 0 | return false; |
434 | 0 | clear(data_, resources_); |
435 | 0 | return setInteger(value, data_, resources_); |
436 | 0 | } Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantImpl::setInteger<long>(long) Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantImpl::setInteger<unsigned long>(unsigned long) |
437 | | |
438 | | template <typename T> |
439 | | static enable_if_t<is_signed<T>::value, bool> setInteger( |
440 | 69.0k | T value, VariantData* data, ResourceManager* resources) { |
441 | 69.0k | ARDUINOJSON_ASSERT(data != nullptr); |
442 | 69.0k | ARDUINOJSON_ASSERT(data->type == VariantType::Null); |
443 | 69.0k | ARDUINOJSON_ASSERT(resources != nullptr); |
444 | | |
445 | 69.0k | if (canConvertNumber<int32_t>(value)) { |
446 | 67.4k | data->type = VariantType::Int32; |
447 | 67.4k | data->content.asInt32 = static_cast<int32_t>(value); |
448 | 67.4k | } |
449 | 1.62k | #if ARDUINOJSON_USE_LONG_LONG |
450 | 1.62k | else { |
451 | 1.62k | auto slot = resources->allocEightByte(); |
452 | 1.62k | if (!slot) |
453 | 0 | return false; |
454 | 1.62k | data->type = VariantType::Int64; |
455 | 1.62k | data->content.asSlotId = slot.id(); |
456 | 1.62k | slot->asInt64 = value; |
457 | 1.62k | } |
458 | | #else |
459 | | (void)resources; |
460 | | #endif |
461 | 69.0k | return true; |
462 | 69.0k | } _ZN11ArduinoJson8V742HB426detail11VariantImpl10setIntegerIlEENS1_9enable_ifIXsr9is_signedIT_EE5valueEbE4typeES5_PNS1_11VariantDataEPNS1_15ResourceManagerE Line | Count | Source | 440 | 3.14k | T value, VariantData* data, ResourceManager* resources) { | 441 | 3.14k | ARDUINOJSON_ASSERT(data != nullptr); | 442 | 3.14k | ARDUINOJSON_ASSERT(data->type == VariantType::Null); | 443 | 3.14k | ARDUINOJSON_ASSERT(resources != nullptr); | 444 | | | 445 | 3.14k | if (canConvertNumber<int32_t>(value)) { | 446 | 1.52k | data->type = VariantType::Int32; | 447 | 1.52k | data->content.asInt32 = static_cast<int32_t>(value); | 448 | 1.52k | } | 449 | 1.62k | #if ARDUINOJSON_USE_LONG_LONG | 450 | 1.62k | else { | 451 | 1.62k | auto slot = resources->allocEightByte(); | 452 | 1.62k | if (!slot) | 453 | 0 | return false; | 454 | 1.62k | data->type = VariantType::Int64; | 455 | 1.62k | data->content.asSlotId = slot.id(); | 456 | 1.62k | slot->asInt64 = value; | 457 | 1.62k | } | 458 | | #else | 459 | | (void)resources; | 460 | | #endif | 461 | 3.14k | return true; | 462 | 3.14k | } |
_ZN11ArduinoJson8V742HB426detail11VariantImpl10setIntegerIaEENS1_9enable_ifIXsr9is_signedIT_EE5valueEbE4typeES5_PNS1_11VariantDataEPNS1_15ResourceManagerE Line | Count | Source | 440 | 65.9k | T value, VariantData* data, ResourceManager* resources) { | 441 | 65.9k | ARDUINOJSON_ASSERT(data != nullptr); | 442 | 65.9k | ARDUINOJSON_ASSERT(data->type == VariantType::Null); | 443 | 65.9k | ARDUINOJSON_ASSERT(resources != nullptr); | 444 | | | 445 | 65.9k | if (canConvertNumber<int32_t>(value)) { | 446 | 65.9k | data->type = VariantType::Int32; | 447 | 65.9k | data->content.asInt32 = static_cast<int32_t>(value); | 448 | 65.9k | } | 449 | 0 | #if ARDUINOJSON_USE_LONG_LONG | 450 | 0 | else { | 451 | 0 | auto slot = resources->allocEightByte(); | 452 | 0 | if (!slot) | 453 | 0 | return false; | 454 | 0 | data->type = VariantType::Int64; | 455 | 0 | data->content.asSlotId = slot.id(); | 456 | 0 | slot->asInt64 = value; | 457 | 0 | } | 458 | | #else | 459 | | (void)resources; | 460 | | #endif | 461 | 65.9k | return true; | 462 | 65.9k | } |
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail11VariantImpl10setIntegerIlEENS1_9enable_ifIXsr9is_signedIT_EE5valueEbE4typeES5_PNS1_11VariantDataEPNS1_15ResourceManagerE |
463 | | |
464 | | template <typename T> |
465 | | static enable_if_t<is_unsigned<T>::value, bool> setInteger( |
466 | 12.9k | T value, VariantData* data, ResourceManager* resources) { |
467 | 12.9k | ARDUINOJSON_ASSERT(data != nullptr); |
468 | 12.9k | ARDUINOJSON_ASSERT(data->type == VariantType::Null); |
469 | 12.9k | ARDUINOJSON_ASSERT(resources != nullptr); |
470 | | |
471 | 12.9k | if (canConvertNumber<uint32_t>(value)) { |
472 | 11.4k | data->type = VariantType::Uint32; |
473 | 11.4k | data->content.asUint32 = static_cast<uint32_t>(value); |
474 | 11.4k | } |
475 | 1.41k | #if ARDUINOJSON_USE_LONG_LONG |
476 | 1.41k | else { |
477 | 1.41k | auto slot = resources->allocEightByte(); |
478 | 1.41k | if (!slot) |
479 | 0 | return false; |
480 | 1.41k | data->type = VariantType::Uint64; |
481 | 1.41k | data->content.asSlotId = slot.id(); |
482 | 1.41k | slot->asUint64 = value; |
483 | 1.41k | } |
484 | | #else |
485 | | (void)resources; |
486 | | #endif |
487 | 12.9k | return true; |
488 | 12.9k | } _ZN11ArduinoJson8V742HB426detail11VariantImpl10setIntegerImEENS1_9enable_ifIXsr11is_unsignedIT_EE5valueEbE4typeES5_PNS1_11VariantDataEPNS1_15ResourceManagerE Line | Count | Source | 466 | 12.9k | T value, VariantData* data, ResourceManager* resources) { | 467 | 12.9k | ARDUINOJSON_ASSERT(data != nullptr); | 468 | 12.9k | ARDUINOJSON_ASSERT(data->type == VariantType::Null); | 469 | 12.9k | ARDUINOJSON_ASSERT(resources != nullptr); | 470 | | | 471 | 12.9k | if (canConvertNumber<uint32_t>(value)) { | 472 | 11.4k | data->type = VariantType::Uint32; | 473 | 11.4k | data->content.asUint32 = static_cast<uint32_t>(value); | 474 | 11.4k | } | 475 | 1.41k | #if ARDUINOJSON_USE_LONG_LONG | 476 | 1.41k | else { | 477 | 1.41k | auto slot = resources->allocEightByte(); | 478 | 1.41k | if (!slot) | 479 | 0 | return false; | 480 | 1.41k | data->type = VariantType::Uint64; | 481 | 1.41k | data->content.asSlotId = slot.id(); | 482 | 1.41k | slot->asUint64 = value; | 483 | 1.41k | } | 484 | | #else | 485 | | (void)resources; | 486 | | #endif | 487 | 12.9k | return true; | 488 | 12.9k | } |
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail11VariantImpl10setIntegerImEENS1_9enable_ifIXsr11is_unsignedIT_EE5valueEbE4typeES5_PNS1_11VariantDataEPNS1_15ResourceManagerE |
489 | | |
490 | | template <typename TAdaptedString> |
491 | 0 | bool setRawString(TAdaptedString value) { |
492 | 0 | if (!data_) |
493 | 0 | return false; |
494 | 0 | clear(data_, resources_); |
495 | 0 | auto dup = resources_->saveString(adaptString(value.data(), value.size())); |
496 | 0 | if (!dup) |
497 | 0 | return false; |
498 | 0 | data_->setRawString(dup); |
499 | 0 | return true; |
500 | 0 | } |
501 | | |
502 | | template <typename TAdaptedString> |
503 | 0 | bool setString(TAdaptedString value) { |
504 | 0 | if (!data_) |
505 | 0 | return false; |
506 | 0 | clear(data_, resources_); |
507 | 0 | return setString(value, data_, resources_); |
508 | 0 | } |
509 | | |
510 | | template <typename TAdaptedString> |
511 | | static bool setString(TAdaptedString value, VariantData* data, |
512 | 0 | ResourceManager* resources) { |
513 | 0 | ARDUINOJSON_ASSERT(data != nullptr); |
514 | 0 | ARDUINOJSON_ASSERT(data->type == VariantType::Null); |
515 | 0 | ARDUINOJSON_ASSERT(resources != nullptr); |
516 | 0 |
|
517 | 0 | if (value.isNull()) |
518 | 0 | return true; // TODO: should this be moved up to the member function? |
519 | 0 |
|
520 | 0 | if (isTinyString(value, value.size())) { |
521 | 0 | data->setTinyString(value); |
522 | 0 | return true; |
523 | 0 | } |
524 | 0 |
|
525 | 0 | auto dup = resources->saveString(value); |
526 | 0 | if (dup) { |
527 | 0 | data->setLongString(dup); |
528 | 0 | return true; |
529 | 0 | } |
530 | 0 |
|
531 | 0 | return false; |
532 | 0 | } |
533 | | |
534 | 0 | size_t size() const { |
535 | 0 | if (!isCollection()) |
536 | 0 | return 0; |
537 | 0 |
|
538 | 0 | return size(data_, resources_); |
539 | 0 | } |
540 | | |
541 | 4.31k | static size_t size(VariantData* data, ResourceManager* resources) { |
542 | 4.31k | ARDUINOJSON_ASSERT(data != nullptr); |
543 | 4.31k | ARDUINOJSON_ASSERT(data->isCollection()); |
544 | 4.31k | ARDUINOJSON_ASSERT(resources != nullptr); |
545 | | |
546 | 4.31k | size_t n = 0; |
547 | 58.7k | for (auto it = createIterator(data, resources); !it.done(); |
548 | 54.4k | it.move(resources)) |
549 | 54.4k | n++; |
550 | | |
551 | 4.31k | if (data->type == VariantType::Object) { |
552 | 1.27k | ARDUINOJSON_ASSERT((n % 2) == 0); |
553 | 1.27k | n /= 2; |
554 | 1.27k | } |
555 | | |
556 | 4.31k | return n; |
557 | 4.31k | } |
558 | | |
559 | 0 | bool toArray() { |
560 | 0 | if (!data_) |
561 | 0 | return false; |
562 | 0 | clear(data_, resources_); |
563 | 0 | data_->toArray(); |
564 | 0 | return true; |
565 | 0 | } |
566 | | |
567 | 0 | bool toObject() { |
568 | 0 | if (!data_) |
569 | 0 | return false; |
570 | 0 | clear(data_, resources_); |
571 | 0 | data_->toObject(); |
572 | 0 | return true; |
573 | 0 | } |
574 | | |
575 | 0 | VariantType type() const { |
576 | 0 | return data_ ? data_->type : VariantType::Null; |
577 | 0 | } |
578 | | |
579 | | // Release the resources used by this variant and set it to null. |
580 | 0 | bool clear() { |
581 | 0 | if (!data_) |
582 | 0 | return false; |
583 | 0 | clear(data_, resources_); |
584 | 0 | return true; |
585 | 0 | } |
586 | | |
587 | 6.36k | static void clear(VariantData* data, ResourceManager* resources) { |
588 | 6.36k | ARDUINOJSON_ASSERT(data != nullptr); |
589 | 6.36k | ARDUINOJSON_ASSERT(resources != nullptr); |
590 | | |
591 | 6.36k | if (data->type & VariantTypeBits::OwnedStringBit) |
592 | 857 | resources->dereferenceString(data->content.asStringNode->data); |
593 | | |
594 | 6.36k | #if ARDUINOJSON_USE_8_BYTE_POOL |
595 | 6.36k | if (data->type & VariantTypeBits::EightByteBit) |
596 | 2.48k | resources->freeEightByte(data->content.asSlotId); |
597 | 6.36k | #endif |
598 | | |
599 | 6.36k | if (data->type & VariantTypeBits::CollectionMask) |
600 | 774 | empty(data, resources); |
601 | | |
602 | 6.36k | data->type = VariantType::Null; |
603 | 6.36k | } ArduinoJson::V742HB42::detail::VariantImpl::clear(ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) Line | Count | Source | 587 | 6.36k | static void clear(VariantData* data, ResourceManager* resources) { | 588 | 6.36k | ARDUINOJSON_ASSERT(data != nullptr); | 589 | 6.36k | ARDUINOJSON_ASSERT(resources != nullptr); | 590 | | | 591 | 6.36k | if (data->type & VariantTypeBits::OwnedStringBit) | 592 | 857 | resources->dereferenceString(data->content.asStringNode->data); | 593 | | | 594 | 6.36k | #if ARDUINOJSON_USE_8_BYTE_POOL | 595 | 6.36k | if (data->type & VariantTypeBits::EightByteBit) | 596 | 2.48k | resources->freeEightByte(data->content.asSlotId); | 597 | 6.36k | #endif | 598 | | | 599 | 6.36k | if (data->type & VariantTypeBits::CollectionMask) | 600 | 774 | empty(data, resources); | 601 | | | 602 | 6.36k | data->type = VariantType::Null; | 603 | 6.36k | } |
Unexecuted instantiation: ArduinoJson::V742HB42::detail::VariantImpl::clear(ArduinoJson::V742HB42::detail::VariantData*, ArduinoJson::V742HB42::detail::ResourceManager*) |
604 | | |
605 | 0 | void empty() { |
606 | 0 | if (!isCollection()) |
607 | 0 | return; |
608 | 0 | empty(data_, resources_); |
609 | 0 | } |
610 | | |
611 | | static void empty(VariantData*, ResourceManager*); |
612 | | |
613 | 4.80k | static void freeVariant(Slot<VariantData> slot, ResourceManager* resources) { |
614 | 4.80k | clear(slot.ptr(), resources); |
615 | 4.80k | resources->freeVariant(slot); |
616 | 4.80k | } |
617 | | |
618 | | private: |
619 | | VariantData* data_; |
620 | | ResourceManager* resources_; |
621 | | |
622 | | template <typename TAdaptedString> |
623 | | iterator findKey(TAdaptedString key) const { |
624 | | if (!isObject()) |
625 | | return iterator(); |
626 | | return findKey(key, data_, resources_); |
627 | | } |
628 | | |
629 | | template <typename TAdaptedString> |
630 | | static iterator findKey(TAdaptedString key, VariantData*, ResourceManager*); |
631 | | |
632 | | static void appendPair(Slot<VariantData> key, Slot<VariantData> value, |
633 | | VariantData*, ResourceManager*); |
634 | | |
635 | | void removeOne(iterator it); |
636 | | void removePair(iterator it); |
637 | | |
638 | | Slot<VariantData> getPreviousSlot(VariantData*) const; |
639 | | }; |
640 | | |
641 | | ARDUINOJSON_END_PRIVATE_NAMESPACE |