Minh Nguyen / ArduinoJson
Committer:
khaiminhvn
Date:
Fri Mar 19 19:30:50 2021 +0000
Revision:
0:18ba3960b5dd
removed extras

Who changed what in which revision?

UserRevisionLine numberNew contents of line
khaiminhvn 0:18ba3960b5dd 1 // ArduinoJson - arduinojson.org
khaiminhvn 0:18ba3960b5dd 2 // Copyright Benoit Blanchon 2014-2021
khaiminhvn 0:18ba3960b5dd 3 // MIT License
khaiminhvn 0:18ba3960b5dd 4
khaiminhvn 0:18ba3960b5dd 5 #pragma once
khaiminhvn 0:18ba3960b5dd 6
khaiminhvn 0:18ba3960b5dd 7 #include <stddef.h>
khaiminhvn 0:18ba3960b5dd 8 #include <stdint.h> // for uint8_t
khaiminhvn 0:18ba3960b5dd 9
khaiminhvn 0:18ba3960b5dd 10 #include <ArduinoJson/Memory/MemoryPool.hpp>
khaiminhvn 0:18ba3960b5dd 11 #include <ArduinoJson/Misc/Visitable.hpp>
khaiminhvn 0:18ba3960b5dd 12 #include <ArduinoJson/Polyfills/type_traits.hpp>
khaiminhvn 0:18ba3960b5dd 13 #include <ArduinoJson/Strings/StringAdapters.hpp>
khaiminhvn 0:18ba3960b5dd 14 #include <ArduinoJson/Variant/VariantAs.hpp>
khaiminhvn 0:18ba3960b5dd 15 #include <ArduinoJson/Variant/VariantFunctions.hpp>
khaiminhvn 0:18ba3960b5dd 16 #include <ArduinoJson/Variant/VariantOperators.hpp>
khaiminhvn 0:18ba3960b5dd 17 #include <ArduinoJson/Variant/VariantRef.hpp>
khaiminhvn 0:18ba3960b5dd 18 #include <ArduinoJson/Variant/VariantShortcuts.hpp>
khaiminhvn 0:18ba3960b5dd 19 #include <ArduinoJson/Variant/VariantTag.hpp>
khaiminhvn 0:18ba3960b5dd 20
khaiminhvn 0:18ba3960b5dd 21 namespace ARDUINOJSON_NAMESPACE {
khaiminhvn 0:18ba3960b5dd 22
khaiminhvn 0:18ba3960b5dd 23 // Forward declarations.
khaiminhvn 0:18ba3960b5dd 24 class ArrayRef;
khaiminhvn 0:18ba3960b5dd 25 class ObjectRef;
khaiminhvn 0:18ba3960b5dd 26
khaiminhvn 0:18ba3960b5dd 27 // Contains the methods shared by VariantRef and VariantConstRef
khaiminhvn 0:18ba3960b5dd 28 template <typename TData>
khaiminhvn 0:18ba3960b5dd 29 class VariantRefBase : public VariantTag {
khaiminhvn 0:18ba3960b5dd 30 public:
khaiminhvn 0:18ba3960b5dd 31 // Tells wether the variant has the specified type.
khaiminhvn 0:18ba3960b5dd 32 // Returns true if the variant has type type T, false otherwise.
khaiminhvn 0:18ba3960b5dd 33 //
khaiminhvn 0:18ba3960b5dd 34 // bool is<char>() const;
khaiminhvn 0:18ba3960b5dd 35 // bool is<signed char>() const;
khaiminhvn 0:18ba3960b5dd 36 // bool is<signed short>() const;
khaiminhvn 0:18ba3960b5dd 37 // bool is<signed int>() const;
khaiminhvn 0:18ba3960b5dd 38 // bool is<signed long>() const;
khaiminhvn 0:18ba3960b5dd 39 // bool is<unsigned char>() const;
khaiminhvn 0:18ba3960b5dd 40 // bool is<unsigned short>() const;
khaiminhvn 0:18ba3960b5dd 41 // bool is<unsigned int>() const;
khaiminhvn 0:18ba3960b5dd 42 // bool is<unsigned long>() const;
khaiminhvn 0:18ba3960b5dd 43 template <typename T>
khaiminhvn 0:18ba3960b5dd 44 FORCE_INLINE
khaiminhvn 0:18ba3960b5dd 45 typename enable_if<is_integral<T>::value && !is_same<bool, T>::value,
khaiminhvn 0:18ba3960b5dd 46 bool>::type
khaiminhvn 0:18ba3960b5dd 47 is() const {
khaiminhvn 0:18ba3960b5dd 48 return variantIsInteger<T>(_data);
khaiminhvn 0:18ba3960b5dd 49 }
khaiminhvn 0:18ba3960b5dd 50 //
khaiminhvn 0:18ba3960b5dd 51 // bool is<double>() const;
khaiminhvn 0:18ba3960b5dd 52 // bool is<float>() const;
khaiminhvn 0:18ba3960b5dd 53 template <typename T>
khaiminhvn 0:18ba3960b5dd 54 FORCE_INLINE typename enable_if<is_floating_point<T>::value, bool>::type is()
khaiminhvn 0:18ba3960b5dd 55 const {
khaiminhvn 0:18ba3960b5dd 56 return variantIsFloat(_data);
khaiminhvn 0:18ba3960b5dd 57 }
khaiminhvn 0:18ba3960b5dd 58 //
khaiminhvn 0:18ba3960b5dd 59 // bool is<bool>() const
khaiminhvn 0:18ba3960b5dd 60 template <typename T>
khaiminhvn 0:18ba3960b5dd 61 FORCE_INLINE typename enable_if<is_same<T, bool>::value, bool>::type is()
khaiminhvn 0:18ba3960b5dd 62 const {
khaiminhvn 0:18ba3960b5dd 63 return variantIsBoolean(_data);
khaiminhvn 0:18ba3960b5dd 64 }
khaiminhvn 0:18ba3960b5dd 65 //
khaiminhvn 0:18ba3960b5dd 66 // bool is<const char*>() const;
khaiminhvn 0:18ba3960b5dd 67 // bool is<char*>() const;
khaiminhvn 0:18ba3960b5dd 68 // bool is<std::string>() const;
khaiminhvn 0:18ba3960b5dd 69 // bool is<String>() const;
khaiminhvn 0:18ba3960b5dd 70 template <typename T>
khaiminhvn 0:18ba3960b5dd 71 FORCE_INLINE typename enable_if<is_same<T, const char *>::value ||
khaiminhvn 0:18ba3960b5dd 72 is_same<T, char *>::value ||
khaiminhvn 0:18ba3960b5dd 73 IsWriteableString<T>::value,
khaiminhvn 0:18ba3960b5dd 74 bool>::type
khaiminhvn 0:18ba3960b5dd 75 is() const {
khaiminhvn 0:18ba3960b5dd 76 return variantIsString(_data);
khaiminhvn 0:18ba3960b5dd 77 }
khaiminhvn 0:18ba3960b5dd 78 //
khaiminhvn 0:18ba3960b5dd 79 // bool is<ArrayRef> const;
khaiminhvn 0:18ba3960b5dd 80 // bool is<const ArrayRef> const;
khaiminhvn 0:18ba3960b5dd 81 template <typename T>
khaiminhvn 0:18ba3960b5dd 82 FORCE_INLINE typename enable_if<
khaiminhvn 0:18ba3960b5dd 83 is_same<typename remove_const<T>::type, ArrayRef>::value, bool>::type
khaiminhvn 0:18ba3960b5dd 84 is() const {
khaiminhvn 0:18ba3960b5dd 85 return variantIsArray(_data);
khaiminhvn 0:18ba3960b5dd 86 }
khaiminhvn 0:18ba3960b5dd 87 //
khaiminhvn 0:18ba3960b5dd 88 // bool is<ObjectRef> const;
khaiminhvn 0:18ba3960b5dd 89 // bool is<const ObjectRef> const;
khaiminhvn 0:18ba3960b5dd 90 template <typename T>
khaiminhvn 0:18ba3960b5dd 91 FORCE_INLINE typename enable_if<
khaiminhvn 0:18ba3960b5dd 92 is_same<typename remove_const<T>::type, ObjectRef>::value, bool>::type
khaiminhvn 0:18ba3960b5dd 93 is() const {
khaiminhvn 0:18ba3960b5dd 94 return variantIsObject(_data);
khaiminhvn 0:18ba3960b5dd 95 }
khaiminhvn 0:18ba3960b5dd 96 #if ARDUINOJSON_HAS_NULLPTR
khaiminhvn 0:18ba3960b5dd 97 //
khaiminhvn 0:18ba3960b5dd 98 // bool is<nullptr_t> const;
khaiminhvn 0:18ba3960b5dd 99 template <typename T>
khaiminhvn 0:18ba3960b5dd 100 FORCE_INLINE
khaiminhvn 0:18ba3960b5dd 101 typename enable_if<is_same<T, decltype(nullptr)>::value, bool>::type
khaiminhvn 0:18ba3960b5dd 102 is() const {
khaiminhvn 0:18ba3960b5dd 103 return variantIsNull(_data);
khaiminhvn 0:18ba3960b5dd 104 }
khaiminhvn 0:18ba3960b5dd 105 #endif
khaiminhvn 0:18ba3960b5dd 106 // bool is<enum>() const;
khaiminhvn 0:18ba3960b5dd 107 template <typename T>
khaiminhvn 0:18ba3960b5dd 108 FORCE_INLINE typename enable_if<is_enum<T>::value, bool>::type is() const {
khaiminhvn 0:18ba3960b5dd 109 return variantIsInteger<int>(_data);
khaiminhvn 0:18ba3960b5dd 110 }
khaiminhvn 0:18ba3960b5dd 111
khaiminhvn 0:18ba3960b5dd 112 FORCE_INLINE bool isNull() const {
khaiminhvn 0:18ba3960b5dd 113 return variantIsNull(_data);
khaiminhvn 0:18ba3960b5dd 114 }
khaiminhvn 0:18ba3960b5dd 115
khaiminhvn 0:18ba3960b5dd 116 FORCE_INLINE bool isUndefined() const {
khaiminhvn 0:18ba3960b5dd 117 return !_data;
khaiminhvn 0:18ba3960b5dd 118 }
khaiminhvn 0:18ba3960b5dd 119
khaiminhvn 0:18ba3960b5dd 120 FORCE_INLINE size_t memoryUsage() const {
khaiminhvn 0:18ba3960b5dd 121 return _data ? _data->memoryUsage() : 0;
khaiminhvn 0:18ba3960b5dd 122 }
khaiminhvn 0:18ba3960b5dd 123
khaiminhvn 0:18ba3960b5dd 124 FORCE_INLINE size_t nesting() const {
khaiminhvn 0:18ba3960b5dd 125 return _data ? _data->nesting() : 0;
khaiminhvn 0:18ba3960b5dd 126 }
khaiminhvn 0:18ba3960b5dd 127
khaiminhvn 0:18ba3960b5dd 128 size_t size() const {
khaiminhvn 0:18ba3960b5dd 129 return variantSize(_data);
khaiminhvn 0:18ba3960b5dd 130 }
khaiminhvn 0:18ba3960b5dd 131
khaiminhvn 0:18ba3960b5dd 132 protected:
khaiminhvn 0:18ba3960b5dd 133 VariantRefBase(TData *data) : _data(data) {}
khaiminhvn 0:18ba3960b5dd 134 TData *_data;
khaiminhvn 0:18ba3960b5dd 135 };
khaiminhvn 0:18ba3960b5dd 136
khaiminhvn 0:18ba3960b5dd 137 // A variant that can be a any value serializable to a JSON value.
khaiminhvn 0:18ba3960b5dd 138 //
khaiminhvn 0:18ba3960b5dd 139 // It can be set to:
khaiminhvn 0:18ba3960b5dd 140 // - a boolean
khaiminhvn 0:18ba3960b5dd 141 // - a char, short, int or a long (signed or unsigned)
khaiminhvn 0:18ba3960b5dd 142 // - a string (const char*)
khaiminhvn 0:18ba3960b5dd 143 // - a reference to a ArrayRef or ObjectRef
khaiminhvn 0:18ba3960b5dd 144 class VariantRef : public VariantRefBase<VariantData>,
khaiminhvn 0:18ba3960b5dd 145 public VariantOperators<VariantRef>,
khaiminhvn 0:18ba3960b5dd 146 public VariantShortcuts<VariantRef>,
khaiminhvn 0:18ba3960b5dd 147 public Visitable {
khaiminhvn 0:18ba3960b5dd 148 typedef VariantRefBase<VariantData> base_type;
khaiminhvn 0:18ba3960b5dd 149 friend class VariantConstRef;
khaiminhvn 0:18ba3960b5dd 150
khaiminhvn 0:18ba3960b5dd 151 public:
khaiminhvn 0:18ba3960b5dd 152 // Intenal use only
khaiminhvn 0:18ba3960b5dd 153 FORCE_INLINE VariantRef(MemoryPool *pool, VariantData *data)
khaiminhvn 0:18ba3960b5dd 154 : base_type(data), _pool(pool) {}
khaiminhvn 0:18ba3960b5dd 155
khaiminhvn 0:18ba3960b5dd 156 // Creates an uninitialized VariantRef
khaiminhvn 0:18ba3960b5dd 157 FORCE_INLINE VariantRef() : base_type(0), _pool(0) {}
khaiminhvn 0:18ba3960b5dd 158
khaiminhvn 0:18ba3960b5dd 159 FORCE_INLINE void clear() const {
khaiminhvn 0:18ba3960b5dd 160 return variantSetNull(_data);
khaiminhvn 0:18ba3960b5dd 161 }
khaiminhvn 0:18ba3960b5dd 162
khaiminhvn 0:18ba3960b5dd 163 // set(bool value)
khaiminhvn 0:18ba3960b5dd 164 template <typename T>
khaiminhvn 0:18ba3960b5dd 165 FORCE_INLINE bool set(
khaiminhvn 0:18ba3960b5dd 166 T value, typename enable_if<is_same<T, bool>::value>::type * = 0) const {
khaiminhvn 0:18ba3960b5dd 167 return variantSetBoolean(_data, value);
khaiminhvn 0:18ba3960b5dd 168 }
khaiminhvn 0:18ba3960b5dd 169
khaiminhvn 0:18ba3960b5dd 170 // set(double value);
khaiminhvn 0:18ba3960b5dd 171 // set(float value);
khaiminhvn 0:18ba3960b5dd 172 template <typename T>
khaiminhvn 0:18ba3960b5dd 173 FORCE_INLINE bool set(
khaiminhvn 0:18ba3960b5dd 174 T value,
khaiminhvn 0:18ba3960b5dd 175 typename enable_if<is_floating_point<T>::value>::type * = 0) const {
khaiminhvn 0:18ba3960b5dd 176 return variantSetFloat(_data, static_cast<Float>(value));
khaiminhvn 0:18ba3960b5dd 177 }
khaiminhvn 0:18ba3960b5dd 178
khaiminhvn 0:18ba3960b5dd 179 // set(char)
khaiminhvn 0:18ba3960b5dd 180 // set(signed short)
khaiminhvn 0:18ba3960b5dd 181 // set(signed int)
khaiminhvn 0:18ba3960b5dd 182 // set(signed long)
khaiminhvn 0:18ba3960b5dd 183 // set(signed char)
khaiminhvn 0:18ba3960b5dd 184 // set(unsigned short)
khaiminhvn 0:18ba3960b5dd 185 // set(unsigned int)
khaiminhvn 0:18ba3960b5dd 186 // set(unsigned long)
khaiminhvn 0:18ba3960b5dd 187 template <typename T>
khaiminhvn 0:18ba3960b5dd 188 FORCE_INLINE bool set(
khaiminhvn 0:18ba3960b5dd 189 T value, typename enable_if<is_integral<T>::value &&
khaiminhvn 0:18ba3960b5dd 190 !is_same<bool, T>::value>::type * = 0) const {
khaiminhvn 0:18ba3960b5dd 191 return variantSetInteger<T>(_data, value);
khaiminhvn 0:18ba3960b5dd 192 }
khaiminhvn 0:18ba3960b5dd 193
khaiminhvn 0:18ba3960b5dd 194 // set(SerializedValue<const char *>)
khaiminhvn 0:18ba3960b5dd 195 FORCE_INLINE bool set(SerializedValue<const char *> value) const {
khaiminhvn 0:18ba3960b5dd 196 return variantSetLinkedRaw(_data, value);
khaiminhvn 0:18ba3960b5dd 197 }
khaiminhvn 0:18ba3960b5dd 198
khaiminhvn 0:18ba3960b5dd 199 // set(SerializedValue<std::string>)
khaiminhvn 0:18ba3960b5dd 200 // set(SerializedValue<String>)
khaiminhvn 0:18ba3960b5dd 201 // set(SerializedValue<const __FlashStringHelper*>)
khaiminhvn 0:18ba3960b5dd 202 template <typename T>
khaiminhvn 0:18ba3960b5dd 203 FORCE_INLINE bool set(
khaiminhvn 0:18ba3960b5dd 204 SerializedValue<T> value,
khaiminhvn 0:18ba3960b5dd 205 typename enable_if<!is_same<const char *, T>::value>::type * = 0) const {
khaiminhvn 0:18ba3960b5dd 206 return variantSetOwnedRaw(_data, value, _pool);
khaiminhvn 0:18ba3960b5dd 207 }
khaiminhvn 0:18ba3960b5dd 208
khaiminhvn 0:18ba3960b5dd 209 // set(const std::string&)
khaiminhvn 0:18ba3960b5dd 210 // set(const String&)
khaiminhvn 0:18ba3960b5dd 211 template <typename T>
khaiminhvn 0:18ba3960b5dd 212 FORCE_INLINE bool set(
khaiminhvn 0:18ba3960b5dd 213 const T &value,
khaiminhvn 0:18ba3960b5dd 214 typename enable_if<IsString<T>::value>::type * = 0) const {
khaiminhvn 0:18ba3960b5dd 215 return variantSetString(_data, adaptString(value), _pool);
khaiminhvn 0:18ba3960b5dd 216 }
khaiminhvn 0:18ba3960b5dd 217 // set(char*)
khaiminhvn 0:18ba3960b5dd 218 // set(const __FlashStringHelper*)
khaiminhvn 0:18ba3960b5dd 219 // set(const char*)
khaiminhvn 0:18ba3960b5dd 220 template <typename T>
khaiminhvn 0:18ba3960b5dd 221 FORCE_INLINE bool set(
khaiminhvn 0:18ba3960b5dd 222 T *value, typename enable_if<IsString<T *>::value>::type * = 0) const {
khaiminhvn 0:18ba3960b5dd 223 return variantSetString(_data, adaptString(value), _pool);
khaiminhvn 0:18ba3960b5dd 224 }
khaiminhvn 0:18ba3960b5dd 225
khaiminhvn 0:18ba3960b5dd 226 // set(VariantRef)
khaiminhvn 0:18ba3960b5dd 227 // set(VariantConstRef)
khaiminhvn 0:18ba3960b5dd 228 // set(ArrayRef)
khaiminhvn 0:18ba3960b5dd 229 // set(ArrayConstRef)
khaiminhvn 0:18ba3960b5dd 230 // set(ObjectRef)
khaiminhvn 0:18ba3960b5dd 231 // set(ObjecConstRef)
khaiminhvn 0:18ba3960b5dd 232 // set(const JsonDocument&)
khaiminhvn 0:18ba3960b5dd 233 template <typename TVariant>
khaiminhvn 0:18ba3960b5dd 234 typename enable_if<IsVisitable<TVariant>::value, bool>::type set(
khaiminhvn 0:18ba3960b5dd 235 const TVariant &value) const;
khaiminhvn 0:18ba3960b5dd 236
khaiminhvn 0:18ba3960b5dd 237 // set(enum value)
khaiminhvn 0:18ba3960b5dd 238 template <typename T>
khaiminhvn 0:18ba3960b5dd 239 FORCE_INLINE bool set(
khaiminhvn 0:18ba3960b5dd 240 T value, typename enable_if<is_enum<T>::value>::type * = 0) const {
khaiminhvn 0:18ba3960b5dd 241 return variantSetInteger(_data, static_cast<Integer>(value));
khaiminhvn 0:18ba3960b5dd 242 }
khaiminhvn 0:18ba3960b5dd 243
khaiminhvn 0:18ba3960b5dd 244 #if ARDUINOJSON_HAS_NULLPTR
khaiminhvn 0:18ba3960b5dd 245 // set(nullptr_t)
khaiminhvn 0:18ba3960b5dd 246 FORCE_INLINE bool set(decltype(nullptr)) const {
khaiminhvn 0:18ba3960b5dd 247 variantSetNull(_data);
khaiminhvn 0:18ba3960b5dd 248 return true;
khaiminhvn 0:18ba3960b5dd 249 }
khaiminhvn 0:18ba3960b5dd 250 #endif
khaiminhvn 0:18ba3960b5dd 251
khaiminhvn 0:18ba3960b5dd 252 template <typename T>
khaiminhvn 0:18ba3960b5dd 253 FORCE_INLINE typename VariantAs<T>::type as() const {
khaiminhvn 0:18ba3960b5dd 254 return variantAs<typename VariantAs<T>::type>(_data, _pool);
khaiminhvn 0:18ba3960b5dd 255 }
khaiminhvn 0:18ba3960b5dd 256
khaiminhvn 0:18ba3960b5dd 257 template <typename T>
khaiminhvn 0:18ba3960b5dd 258 FORCE_INLINE operator T() const {
khaiminhvn 0:18ba3960b5dd 259 return variantAs<T>(_data, _pool);
khaiminhvn 0:18ba3960b5dd 260 }
khaiminhvn 0:18ba3960b5dd 261
khaiminhvn 0:18ba3960b5dd 262 template <typename TVisitor>
khaiminhvn 0:18ba3960b5dd 263 typename TVisitor::result_type accept(TVisitor &visitor) const {
khaiminhvn 0:18ba3960b5dd 264 return variantAccept(_data, visitor);
khaiminhvn 0:18ba3960b5dd 265 }
khaiminhvn 0:18ba3960b5dd 266
khaiminhvn 0:18ba3960b5dd 267 // Change the type of the variant
khaiminhvn 0:18ba3960b5dd 268 //
khaiminhvn 0:18ba3960b5dd 269 // ArrayRef to<ArrayRef>()
khaiminhvn 0:18ba3960b5dd 270 template <typename T>
khaiminhvn 0:18ba3960b5dd 271 typename enable_if<is_same<T, ArrayRef>::value, ArrayRef>::type to() const;
khaiminhvn 0:18ba3960b5dd 272 //
khaiminhvn 0:18ba3960b5dd 273 // ObjectRef to<ObjectRef>()
khaiminhvn 0:18ba3960b5dd 274 template <typename T>
khaiminhvn 0:18ba3960b5dd 275 typename enable_if<is_same<T, ObjectRef>::value, ObjectRef>::type to() const;
khaiminhvn 0:18ba3960b5dd 276 //
khaiminhvn 0:18ba3960b5dd 277 // ObjectRef to<VariantRef>()
khaiminhvn 0:18ba3960b5dd 278 template <typename T>
khaiminhvn 0:18ba3960b5dd 279 typename enable_if<is_same<T, VariantRef>::value, VariantRef>::type to()
khaiminhvn 0:18ba3960b5dd 280 const;
khaiminhvn 0:18ba3960b5dd 281
khaiminhvn 0:18ba3960b5dd 282 VariantRef addElement() const;
khaiminhvn 0:18ba3960b5dd 283
khaiminhvn 0:18ba3960b5dd 284 FORCE_INLINE VariantRef getElement(size_t) const;
khaiminhvn 0:18ba3960b5dd 285
khaiminhvn 0:18ba3960b5dd 286 FORCE_INLINE VariantRef getOrAddElement(size_t) const;
khaiminhvn 0:18ba3960b5dd 287
khaiminhvn 0:18ba3960b5dd 288 // getMember(const char*) const
khaiminhvn 0:18ba3960b5dd 289 // getMember(const __FlashStringHelper*) const
khaiminhvn 0:18ba3960b5dd 290 template <typename TChar>
khaiminhvn 0:18ba3960b5dd 291 FORCE_INLINE VariantRef getMember(TChar *) const;
khaiminhvn 0:18ba3960b5dd 292
khaiminhvn 0:18ba3960b5dd 293 // getMember(const std::string&) const
khaiminhvn 0:18ba3960b5dd 294 // getMember(const String&) const
khaiminhvn 0:18ba3960b5dd 295 template <typename TString>
khaiminhvn 0:18ba3960b5dd 296 FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type
khaiminhvn 0:18ba3960b5dd 297 getMember(const TString &) const;
khaiminhvn 0:18ba3960b5dd 298
khaiminhvn 0:18ba3960b5dd 299 // getOrAddMember(char*) const
khaiminhvn 0:18ba3960b5dd 300 // getOrAddMember(const char*) const
khaiminhvn 0:18ba3960b5dd 301 // getOrAddMember(const __FlashStringHelper*) const
khaiminhvn 0:18ba3960b5dd 302 template <typename TChar>
khaiminhvn 0:18ba3960b5dd 303 FORCE_INLINE VariantRef getOrAddMember(TChar *) const;
khaiminhvn 0:18ba3960b5dd 304
khaiminhvn 0:18ba3960b5dd 305 // getOrAddMember(const std::string&) const
khaiminhvn 0:18ba3960b5dd 306 // getOrAddMember(const String&) const
khaiminhvn 0:18ba3960b5dd 307 template <typename TString>
khaiminhvn 0:18ba3960b5dd 308 FORCE_INLINE VariantRef getOrAddMember(const TString &) const;
khaiminhvn 0:18ba3960b5dd 309
khaiminhvn 0:18ba3960b5dd 310 FORCE_INLINE void remove(size_t index) const {
khaiminhvn 0:18ba3960b5dd 311 if (_data)
khaiminhvn 0:18ba3960b5dd 312 _data->remove(index);
khaiminhvn 0:18ba3960b5dd 313 }
khaiminhvn 0:18ba3960b5dd 314 // remove(char*) const
khaiminhvn 0:18ba3960b5dd 315 // remove(const char*) const
khaiminhvn 0:18ba3960b5dd 316 // remove(const __FlashStringHelper*) const
khaiminhvn 0:18ba3960b5dd 317 template <typename TChar>
khaiminhvn 0:18ba3960b5dd 318 FORCE_INLINE typename enable_if<IsString<TChar *>::value>::type remove(
khaiminhvn 0:18ba3960b5dd 319 TChar *key) const {
khaiminhvn 0:18ba3960b5dd 320 if (_data)
khaiminhvn 0:18ba3960b5dd 321 _data->remove(adaptString(key));
khaiminhvn 0:18ba3960b5dd 322 }
khaiminhvn 0:18ba3960b5dd 323 // remove(const std::string&) const
khaiminhvn 0:18ba3960b5dd 324 // remove(const String&) const
khaiminhvn 0:18ba3960b5dd 325 template <typename TString>
khaiminhvn 0:18ba3960b5dd 326 FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
khaiminhvn 0:18ba3960b5dd 327 const TString &key) const {
khaiminhvn 0:18ba3960b5dd 328 if (_data)
khaiminhvn 0:18ba3960b5dd 329 _data->remove(adaptString(key));
khaiminhvn 0:18ba3960b5dd 330 }
khaiminhvn 0:18ba3960b5dd 331
khaiminhvn 0:18ba3960b5dd 332 private:
khaiminhvn 0:18ba3960b5dd 333 MemoryPool *_pool;
khaiminhvn 0:18ba3960b5dd 334 }; // namespace ARDUINOJSON_NAMESPACE
khaiminhvn 0:18ba3960b5dd 335
khaiminhvn 0:18ba3960b5dd 336 class VariantConstRef : public VariantRefBase<const VariantData>,
khaiminhvn 0:18ba3960b5dd 337 public VariantOperators<VariantConstRef>,
khaiminhvn 0:18ba3960b5dd 338 public VariantShortcuts<VariantConstRef>,
khaiminhvn 0:18ba3960b5dd 339 public Visitable {
khaiminhvn 0:18ba3960b5dd 340 typedef VariantRefBase<const VariantData> base_type;
khaiminhvn 0:18ba3960b5dd 341 friend class VariantRef;
khaiminhvn 0:18ba3960b5dd 342
khaiminhvn 0:18ba3960b5dd 343 public:
khaiminhvn 0:18ba3960b5dd 344 VariantConstRef() : base_type(0) {}
khaiminhvn 0:18ba3960b5dd 345 VariantConstRef(const VariantData *data) : base_type(data) {}
khaiminhvn 0:18ba3960b5dd 346 VariantConstRef(VariantRef var) : base_type(var._data) {}
khaiminhvn 0:18ba3960b5dd 347
khaiminhvn 0:18ba3960b5dd 348 template <typename TVisitor>
khaiminhvn 0:18ba3960b5dd 349 typename TVisitor::result_type accept(TVisitor &visitor) const {
khaiminhvn 0:18ba3960b5dd 350 return variantAccept(_data, visitor);
khaiminhvn 0:18ba3960b5dd 351 }
khaiminhvn 0:18ba3960b5dd 352
khaiminhvn 0:18ba3960b5dd 353 template <typename T>
khaiminhvn 0:18ba3960b5dd 354 FORCE_INLINE typename VariantConstAs<T>::type as() const {
khaiminhvn 0:18ba3960b5dd 355 return variantAs<typename VariantConstAs<T>::type>(_data);
khaiminhvn 0:18ba3960b5dd 356 }
khaiminhvn 0:18ba3960b5dd 357
khaiminhvn 0:18ba3960b5dd 358 template <typename T>
khaiminhvn 0:18ba3960b5dd 359 FORCE_INLINE operator T() const {
khaiminhvn 0:18ba3960b5dd 360 return variantAs<T>(_data);
khaiminhvn 0:18ba3960b5dd 361 }
khaiminhvn 0:18ba3960b5dd 362
khaiminhvn 0:18ba3960b5dd 363 FORCE_INLINE VariantConstRef getElement(size_t) const;
khaiminhvn 0:18ba3960b5dd 364
khaiminhvn 0:18ba3960b5dd 365 FORCE_INLINE VariantConstRef operator[](size_t index) const {
khaiminhvn 0:18ba3960b5dd 366 return getElement(index);
khaiminhvn 0:18ba3960b5dd 367 }
khaiminhvn 0:18ba3960b5dd 368
khaiminhvn 0:18ba3960b5dd 369 // getMember(const std::string&) const
khaiminhvn 0:18ba3960b5dd 370 // getMember(const String&) const
khaiminhvn 0:18ba3960b5dd 371 template <typename TString>
khaiminhvn 0:18ba3960b5dd 372 FORCE_INLINE VariantConstRef getMember(const TString &key) const {
khaiminhvn 0:18ba3960b5dd 373 return VariantConstRef(
khaiminhvn 0:18ba3960b5dd 374 objectGetMember(variantAsObject(_data), adaptString(key)));
khaiminhvn 0:18ba3960b5dd 375 }
khaiminhvn 0:18ba3960b5dd 376
khaiminhvn 0:18ba3960b5dd 377 // getMember(char*) const
khaiminhvn 0:18ba3960b5dd 378 // getMember(const char*) const
khaiminhvn 0:18ba3960b5dd 379 // getMember(const __FlashStringHelper*) const
khaiminhvn 0:18ba3960b5dd 380 template <typename TChar>
khaiminhvn 0:18ba3960b5dd 381 FORCE_INLINE VariantConstRef getMember(TChar *key) const {
khaiminhvn 0:18ba3960b5dd 382 const CollectionData *obj = variantAsObject(_data);
khaiminhvn 0:18ba3960b5dd 383 return VariantConstRef(obj ? obj->getMember(adaptString(key)) : 0);
khaiminhvn 0:18ba3960b5dd 384 }
khaiminhvn 0:18ba3960b5dd 385
khaiminhvn 0:18ba3960b5dd 386 // operator[](const std::string&) const
khaiminhvn 0:18ba3960b5dd 387 // operator[](const String&) const
khaiminhvn 0:18ba3960b5dd 388 template <typename TString>
khaiminhvn 0:18ba3960b5dd 389 FORCE_INLINE
khaiminhvn 0:18ba3960b5dd 390 typename enable_if<IsString<TString>::value, VariantConstRef>::type
khaiminhvn 0:18ba3960b5dd 391 operator[](const TString &key) const {
khaiminhvn 0:18ba3960b5dd 392 return getMember(key);
khaiminhvn 0:18ba3960b5dd 393 }
khaiminhvn 0:18ba3960b5dd 394
khaiminhvn 0:18ba3960b5dd 395 // operator[](char*) const
khaiminhvn 0:18ba3960b5dd 396 // operator[](const char*) const
khaiminhvn 0:18ba3960b5dd 397 // operator[](const __FlashStringHelper*) const
khaiminhvn 0:18ba3960b5dd 398 template <typename TChar>
khaiminhvn 0:18ba3960b5dd 399 FORCE_INLINE
khaiminhvn 0:18ba3960b5dd 400 typename enable_if<IsString<TChar *>::value, VariantConstRef>::type
khaiminhvn 0:18ba3960b5dd 401 operator[](TChar *key) const {
khaiminhvn 0:18ba3960b5dd 402 return getMember(key);
khaiminhvn 0:18ba3960b5dd 403 }
khaiminhvn 0:18ba3960b5dd 404 };
khaiminhvn 0:18ba3960b5dd 405 } // namespace ARDUINOJSON_NAMESPACE