Coverage Report

Created: 2026-01-17 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/arduinojson/src/ArduinoJson/Variant/VariantRefBase.hpp
Line
Count
Source
1
// ArduinoJson - https://arduinojson.org
2
// Copyright © 2014-2025, Benoit BLANCHON
3
// MIT License
4
5
#pragma once
6
7
#include <ArduinoJson/Configuration.hpp>
8
#include <ArduinoJson/Variant/Converter.hpp>
9
#include <ArduinoJson/Variant/JsonVariantConst.hpp>
10
#include <ArduinoJson/Variant/VariantOperators.hpp>
11
12
ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
13
class JsonVariant;
14
ARDUINOJSON_END_PUBLIC_NAMESPACE
15
16
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
17
template <typename>
18
class ElementProxy;
19
20
template <typename, typename>
21
class MemberProxy;
22
23
template <typename TDerived>
24
class VariantRefBase : public VariantTag {
25
  friend class VariantAttorney;
26
27
 public:
28
  // Sets the value to null.
29
  // https://arduinojson.org/v7/api/jsonvariant/clear/
30
  void clear() const {
31
    getOrCreateVariantImpl().clear();
32
  }
33
34
  // Returns true if the value is null or the reference is unbound.
35
  // https://arduinojson.org/v7/api/jsonvariant/isnull/
36
  bool isNull() const {
37
    return getVariantImpl().isNull();
38
  }
39
40
  // Returns true if the reference is unbound.
41
0
  bool isUnbound() const {
42
0
    return !getData();
43
0
  }
44
45
  // Casts the value to the specified type.
46
  // https://arduinojson.org/v7/api/jsonvariant/as/
47
  template <typename T>
48
  T as() const;
49
50
  template <typename T, enable_if_t<!is_same<T, TDerived>::value, int> = 0>
51
  operator T() const {
52
    return as<T>();
53
  }
54
55
  // Sets the value to an empty array.
56
  // https://arduinojson.org/v7/api/jsonvariant/to/
57
  template <typename T, enable_if_t<is_same<T, JsonArray>::value, int> = 0>
58
  JsonArray to() const;
59
60
  // Sets the value to an empty object.
61
  // https://arduinojson.org/v7/api/jsonvariant/to/
62
  template <typename T, enable_if_t<is_same<T, JsonObject>::value, int> = 0>
63
  JsonObject to() const;
64
65
  // Sets the value to null.
66
  // https://arduinojson.org/v7/api/jsonvariant/to/
67
  template <typename T, enable_if_t<is_same<T, JsonVariant>::value, int> = 0>
68
  JsonVariant to() const;
69
70
  // Returns true if the value is of the specified type.
71
  // https://arduinojson.org/v7/api/jsonvariant/is/
72
  template <typename T>
73
  FORCE_INLINE bool is() const;
74
75
  // Copies the specified value.
76
  // https://arduinojson.org/v7/api/jsonvariant/set/
77
  template <typename T>
78
0
  bool set(const T& value) const {
79
0
    using TypeForConverter = remove_cv_t<remove_reference_t<T>>;
80
0
    return doSet<Converter<TypeForConverter>>(value);
81
0
  }
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::detail::MemberProxy<ArduinoJson::V742HB42::JsonObject, ArduinoJson::V742HB42::detail::RamString> >::set<ArduinoJson::V742HB42::JsonVariantConst>(ArduinoJson::V742HB42::JsonVariantConst const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<ArduinoJson::V742HB42::JsonVariantConst>(ArduinoJson::V742HB42::JsonVariantConst const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<decltype(nullptr)>(decltype(nullptr) const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<float>(float const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<double>(double const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<ArduinoJson::V742HB42::JsonArrayConst>(ArduinoJson::V742HB42::JsonArrayConst const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<ArduinoJson::V742HB42::JsonObjectConst>(ArduinoJson::V742HB42::JsonObjectConst const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<ArduinoJson::V742HB42::JsonString>(ArduinoJson::V742HB42::JsonString const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<ArduinoJson::V742HB42::SerializedValue<char const*> >(ArduinoJson::V742HB42::SerializedValue<char const*> const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<long>(long const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<unsigned long>(unsigned long const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::set<bool>(bool const&) const
82
83
  // Copies the specified value.
84
  // https://arduinojson.org/v7/api/jsonvariant/set/
85
  template <typename T>
86
  bool set(T* value) const {
87
    return doSet<Converter<T*>>(value);
88
  }
89
90
  // Returns the size of the array or object.
91
  // https://arduinojson.org/v7/api/jsonvariant/size/
92
  size_t size() const {
93
    return getVariantImpl().size();
94
  }
95
96
  // Returns the depth (nesting level) of the value.
97
  // https://arduinojson.org/v7/api/jsonvariant/nesting/
98
  size_t nesting() const {
99
    return getVariantImpl().nesting();
100
  }
101
102
  // Appends a new (empty) element to the array.
103
  // Returns a reference to the new element.
104
  // https://arduinojson.org/v7/api/jsonvariant/add/
105
  template <typename T, enable_if_t<!is_same<T, JsonVariant>::value, int> = 0>
106
  T add() const {
107
    return add<JsonVariant>().template to<T>();
108
  }
109
110
  // Appends a new (null) element to the array.
111
  // Returns a reference to the new element.
112
  // https://arduinojson.org/v7/api/jsonvariant/add/
113
  template <typename T, enable_if_t<is_same<T, JsonVariant>::value, int> = 0>
114
  T add() const;
115
116
  // Appends a value to the array.
117
  // https://arduinojson.org/v7/api/jsonvariant/add/
118
  template <typename T>
119
  bool add(const T& value) const {
120
    return getOrCreateArray().add(value);
121
  }
122
123
  // Appends a value to the array.
124
  // https://arduinojson.org/v7/api/jsonvariant/add/
125
  template <typename T>
126
  bool add(T* value) const {
127
    return getOrCreateArray().add(value);
128
  }
129
130
  // Removes an element of the array.
131
  // https://arduinojson.org/v7/api/jsonvariant/remove/
132
  void remove(size_t index) const {
133
    getVariantImpl().removeElement(index);
134
  }
135
136
  // Removes a member of the object.
137
  // https://arduinojson.org/v7/api/jsonvariant/remove/
138
  template <typename TChar, enable_if_t<IsString<TChar*>::value, int> = 0>
139
  void remove(TChar* key) const {
140
    getVariantImpl().removeMember(adaptString(key));
141
  }
142
143
  // Removes a member of the object.
144
  // https://arduinojson.org/v7/api/jsonvariant/remove/
145
  template <typename TString, enable_if_t<IsString<TString>::value, int> = 0>
146
  void remove(const TString& key) const {
147
    getVariantImpl().removeMember(adaptString(key));
148
  }
149
150
  // Removes a member of the object or an element of the array.
151
  // https://arduinojson.org/v7/api/jsonvariant/remove/
152
  template <typename TVariant, enable_if_t<IsVariant<TVariant>::value, int> = 0>
153
  void remove(const TVariant& key) const {
154
    if (key.template is<size_t>())
155
      remove(key.template as<size_t>());
156
    else
157
      remove(key.template as<const char*>());
158
  }
159
160
  // Gets or sets an array element.
161
  // https://arduinojson.org/v7/api/jsonvariant/subscript/
162
  ElementProxy<TDerived> operator[](size_t index) const;
163
164
  // DEPRECATED: use obj[key].is<T>() instead
165
  // https://arduinojson.org/v7/api/jsonvariant/containskey/
166
  template <typename TString, enable_if_t<IsString<TString>::value, int> = 0>
167
  ARDUINOJSON_DEPRECATED("use obj[key].is<T>() instead")
168
  bool containsKey(const TString& key) const;
169
170
  // DEPRECATED: use obj["key"].is<T>() instead
171
  // https://arduinojson.org/v7/api/jsonvariant/containskey/
172
  template <typename TChar, enable_if_t<IsString<TChar*>::value, int> = 0>
173
  ARDUINOJSON_DEPRECATED("use obj[\"key\"].is<T>() instead")
174
  bool containsKey(TChar* key) const;
175
176
  // DEPRECATED: use obj[key].is<T>() instead
177
  // https://arduinojson.org/v7/api/jsonvariant/containskey/
178
  template <typename TVariant, enable_if_t<IsVariant<TVariant>::value, int> = 0>
179
  ARDUINOJSON_DEPRECATED("use obj[key].is<T>() instead")
180
  bool containsKey(const TVariant& key) const;
181
182
  // Gets or sets an object member.
183
  // https://arduinojson.org/v7/api/jsonvariant/subscript/
184
  template <typename TString, enable_if_t<IsString<TString>::value, int> = 0>
185
  FORCE_INLINE MemberProxy<TDerived, AdaptedString<TString>> operator[](
186
      const TString& key) const;
187
188
  // Gets or sets an object member.
189
  // https://arduinojson.org/v7/api/jsonvariant/subscript/
190
  template <typename TChar, enable_if_t<IsString<TChar*>::value, int> = 0>
191
  FORCE_INLINE MemberProxy<TDerived, AdaptedString<TChar*>> operator[](
192
      TChar* key) const;
193
194
  // Gets an object member or an array element.
195
  // https://arduinojson.org/v7/api/jsonvariant/subscript/
196
  template <typename TVariant, enable_if_t<IsVariant<TVariant>::value, int> = 0>
197
  JsonVariantConst operator[](const TVariant& key) const {
198
    if (key.template is<size_t>())
199
      return operator[](key.template as<size_t>());
200
    else
201
      return operator[](key.template as<JsonString>());
202
  }
203
204
  // DEPRECATED: use add<JsonVariant>() instead
205
  ARDUINOJSON_DEPRECATED("use add<JsonVariant>() instead")
206
  JsonVariant add() const;
207
208
  // DEPRECATED: use add<JsonArray>() instead
209
  ARDUINOJSON_DEPRECATED("use add<JsonArray>() instead")
210
  JsonArray createNestedArray() const;
211
212
  // DEPRECATED: use var[key].to<JsonArray>() instead
213
  template <typename TChar>
214
  ARDUINOJSON_DEPRECATED("use var[key].to<JsonArray>() instead")
215
  JsonArray createNestedArray(TChar* key) const;
216
217
  // DEPRECATED: use var[key].to<JsonArray>() instead
218
  template <typename TString>
219
  ARDUINOJSON_DEPRECATED("use var[key].to<JsonArray>() instead")
220
  JsonArray createNestedArray(const TString& key) const;
221
222
  // DEPRECATED: use add<JsonObject>() instead
223
  ARDUINOJSON_DEPRECATED("use add<JsonObject>() instead")
224
  JsonObject createNestedObject() const;
225
226
  // DEPRECATED: use var[key].to<JsonObject>() instead
227
  template <typename TChar>
228
  ARDUINOJSON_DEPRECATED("use var[key].to<JsonObject>() instead")
229
  JsonObject createNestedObject(TChar* key) const;
230
231
  // DEPRECATED: use var[key].to<JsonObject>() instead
232
  template <typename TString>
233
  ARDUINOJSON_DEPRECATED("use var[key].to<JsonObject>() instead")
234
  JsonObject createNestedObject(const TString& key) const;
235
236
  // DEPRECATED: always returns zero
237
  ARDUINOJSON_DEPRECATED("always returns zero")
238
  size_t memoryUsage() const {
239
    return 0;
240
  }
241
242
  // DEPRECATED: performs a deep copy
243
  ARDUINOJSON_DEPRECATED("performs a deep copy")
244
  void shallowCopy(JsonVariantConst src) const {
245
    set(src);
246
  }
247
248
 private:
249
  TDerived& derived() {
250
    return static_cast<TDerived&>(*this);
251
  }
252
253
0
  const TDerived& derived() const {
254
0
    return static_cast<const TDerived&>(*this);
255
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::detail::MemberProxy<ArduinoJson::V742HB42::JsonObject, ArduinoJson::V742HB42::detail::RamString> >::derived() const
Unexecuted instantiation: ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::derived() const
256
257
0
  ResourceManager* getResourceManager() const {
258
0
    return VariantAttorney::getResourceManager(derived());
259
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::detail::MemberProxy<ArduinoJson::V742HB42::JsonObject, ArduinoJson::V742HB42::detail::RamString> >::getResourceManager() const
Unexecuted instantiation: ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::getResourceManager() const
260
261
0
  VariantData* getData() const {
262
0
    return VariantAttorney::getData(derived());
263
0
  }
264
265
0
  VariantData* getOrCreateData() const {
266
0
    return VariantAttorney::getOrCreateData(derived());
267
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::detail::MemberProxy<ArduinoJson::V742HB42::JsonObject, ArduinoJson::V742HB42::detail::RamString> >::getOrCreateData() const
Unexecuted instantiation: ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::getOrCreateData() const
268
269
  VariantImpl getVariantImpl() const {
270
    return VariantImpl(getData(), getResourceManager());
271
  }
272
273
0
  VariantImpl getOrCreateVariantImpl() const {
274
0
    return VariantImpl(getOrCreateData(), getResourceManager());
275
0
  }
276
277
  JsonArray getOrCreateArray() const;
278
279
  FORCE_INLINE ArduinoJson::JsonVariant getVariant() const;
280
281
  FORCE_INLINE ArduinoJson::JsonVariantConst getVariantConst() const {
282
    return ArduinoJson::JsonVariantConst(getData(), getResourceManager());
283
  }
284
285
  template <typename T>
286
  FORCE_INLINE enable_if_t<is_same<T, JsonVariantConst>::value, T> getVariant()
287
      const {
288
    return getVariantConst();
289
  }
290
291
  template <typename T>
292
  FORCE_INLINE enable_if_t<is_same<T, JsonVariant>::value, T> getVariant()
293
      const {
294
    return getVariant();
295
  }
296
297
  template <typename TConverter, typename T>
298
0
  bool doSet(const T& value) const {
299
0
    return doSet<TConverter>(
300
0
        value, is_same<typename function_traits<
301
0
                           decltype(&TConverter::toJson)>::return_type,
302
0
                       bool>{});
303
0
  }
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::detail::MemberProxy<ArduinoJson::V742HB42::JsonObject, ArduinoJson::V742HB42::detail::RamString> >::doSet<ArduinoJson::V742HB42::Converter<ArduinoJson::V742HB42::JsonVariantConst, void>, ArduinoJson::V742HB42::JsonVariantConst>(ArduinoJson::V742HB42::JsonVariantConst const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<ArduinoJson::V742HB42::JsonVariantConst, void>, ArduinoJson::V742HB42::JsonVariantConst>(ArduinoJson::V742HB42::JsonVariantConst const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<decltype(nullptr), void>, decltype(nullptr)>(decltype(nullptr) const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<float, void>, float>(float const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<double, void>, double>(double const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<ArduinoJson::V742HB42::JsonArrayConst, void>, ArduinoJson::V742HB42::JsonArrayConst>(ArduinoJson::V742HB42::JsonArrayConst const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<ArduinoJson::V742HB42::JsonObjectConst, void>, ArduinoJson::V742HB42::JsonObjectConst>(ArduinoJson::V742HB42::JsonObjectConst const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<ArduinoJson::V742HB42::JsonString, void>, ArduinoJson::V742HB42::JsonString>(ArduinoJson::V742HB42::JsonString const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<ArduinoJson::V742HB42::SerializedValue<char const*>, void>, ArduinoJson::V742HB42::SerializedValue<char const*> >(ArduinoJson::V742HB42::SerializedValue<char const*> const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<long, void>, long>(long const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<unsigned long, void>, unsigned long>(unsigned long const&) const
Unexecuted instantiation: bool ArduinoJson::V742HB42::detail::VariantRefBase<ArduinoJson::V742HB42::JsonVariant>::doSet<ArduinoJson::V742HB42::Converter<bool, void>, bool>(bool const&) const
304
305
  template <typename TConverter, typename T>
306
  bool doSet(const T& value, false_type) const;
307
308
  template <typename TConverter, typename T>
309
  bool doSet(const T& value, true_type) const;
310
311
  ArduinoJson::JsonVariant getOrCreateVariant() const;
312
};
313
314
ARDUINOJSON_END_PRIVATE_NAMESPACE