Coverage Report

Created: 2026-09-01 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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