/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 |