mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-08-02 20:24:42 +02:00
Convert "variant functions" to static member functions
This commit is contained in:
@@ -23,7 +23,9 @@ inline bool ArrayData::copyFrom(const ArrayData& src,
|
|||||||
|
|
||||||
for (VariantSlot* s = src.head(); s; s = s->next()) {
|
for (VariantSlot* s = src.head(); s; s = s->next()) {
|
||||||
auto var = addElement(resources);
|
auto var = addElement(resources);
|
||||||
if (!variantCopyFrom(var, s->data(), resources))
|
if (!var)
|
||||||
|
return false;
|
||||||
|
if (!var->copyFrom(s->data(), resources))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@@ -45,13 +45,15 @@ class ElementProxy : public VariantRefBase<ElementProxy<TUpstream>>,
|
|||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE VariantData* getData() const {
|
FORCE_INLINE VariantData* getData() const {
|
||||||
return variantGetElement(VariantAttorney::getData(upstream_), index_);
|
return VariantData::getElement(VariantAttorney::getData(upstream_), index_);
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE VariantData* getOrCreateData() const {
|
FORCE_INLINE VariantData* getOrCreateData() const {
|
||||||
return variantGetOrAddElement(
|
auto data = VariantAttorney::getOrCreateData(upstream_);
|
||||||
VariantAttorney::getOrCreateData(upstream_), index_,
|
if (!data)
|
||||||
VariantAttorney::getResourceManager(upstream_));
|
return nullptr;
|
||||||
|
return data->getOrAddElement(
|
||||||
|
index_, VariantAttorney::getResourceManager(upstream_));
|
||||||
}
|
}
|
||||||
|
|
||||||
TUpstream upstream_;
|
TUpstream upstream_;
|
||||||
|
@@ -150,7 +150,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
|
|||||||
// Returns the depth (nesting level) of the array.
|
// Returns the depth (nesting level) of the array.
|
||||||
// https://arduinojson.org/v6/api/jsonarray/nesting/
|
// https://arduinojson.org/v6/api/jsonarray/nesting/
|
||||||
FORCE_INLINE size_t nesting() const {
|
FORCE_INLINE size_t nesting() const {
|
||||||
return variantNesting(collectionToVariant(data_));
|
return detail::VariantData::nesting(collectionToVariant(data_));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the number of elements in the array.
|
// Returns the number of elements in the array.
|
||||||
@@ -179,7 +179,8 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
|
|||||||
template <>
|
template <>
|
||||||
struct Converter<JsonArray> : private detail::VariantAttorney {
|
struct Converter<JsonArray> : private detail::VariantAttorney {
|
||||||
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
||||||
variantCopyFrom(getData(dst), getData(src), getResourceManager(dst));
|
detail::VariantData::copy(getData(dst), getData(src),
|
||||||
|
getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
static JsonArray fromJson(JsonVariant src) {
|
static JsonArray fromJson(JsonVariant src) {
|
||||||
@@ -209,7 +210,8 @@ template <typename TDerived>
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
inline typename enable_if<is_same<T, JsonArray>::value, JsonArray>::type
|
inline typename enable_if<is_same<T, JsonArray>::value, JsonArray>::type
|
||||||
VariantRefBase<TDerived>::to() const {
|
VariantRefBase<TDerived>::to() const {
|
||||||
return JsonArray(variantToArray(getOrCreateData(), getResourceManager()),
|
return JsonArray(
|
||||||
|
VariantData::toArray(getOrCreateData(), getResourceManager()),
|
||||||
getResourceManager());
|
getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -78,7 +78,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
|
|||||||
// Returns the depth (nesting level) of the array.
|
// Returns the depth (nesting level) of the array.
|
||||||
// https://arduinojson.org/v6/api/jsonarrayconst/nesting/
|
// https://arduinojson.org/v6/api/jsonarrayconst/nesting/
|
||||||
FORCE_INLINE size_t nesting() const {
|
FORCE_INLINE size_t nesting() const {
|
||||||
return variantNesting(collectionToVariant(data_));
|
return detail::VariantData::nesting(collectionToVariant(data_));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the number of elements in the array.
|
// Returns the number of elements in the array.
|
||||||
@@ -98,7 +98,8 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
|
|||||||
template <>
|
template <>
|
||||||
struct Converter<JsonArrayConst> : private detail::VariantAttorney {
|
struct Converter<JsonArrayConst> : private detail::VariantAttorney {
|
||||||
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
||||||
variantCopyFrom(getData(dst), getData(src), getResourceManager(dst));
|
detail::VariantData::copy(getData(dst), getData(src),
|
||||||
|
getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
static JsonArrayConst fromJson(JsonVariantConst src) {
|
static JsonArrayConst fromJson(JsonVariantConst src) {
|
||||||
|
@@ -318,7 +318,7 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
|
|||||||
// ⚠️ Doesn't release the memory associated with the removed element.
|
// ⚠️ Doesn't release the memory associated with the removed element.
|
||||||
// https://arduinojson.org/v6/api/jsondocument/remove/
|
// https://arduinojson.org/v6/api/jsondocument/remove/
|
||||||
FORCE_INLINE void remove(size_t index) {
|
FORCE_INLINE void remove(size_t index) {
|
||||||
variantRemoveElement(getData(), index, getResourceManager());
|
detail::VariantData::removeElement(getData(), index, getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Removes a member of the root object.
|
// Removes a member of the root object.
|
||||||
@@ -327,7 +327,7 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
|
|||||||
template <typename TChar>
|
template <typename TChar>
|
||||||
FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value>::type
|
FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value>::type
|
||||||
remove(TChar* key) {
|
remove(TChar* key) {
|
||||||
variantRemoveMember(getData(), detail::adaptString(key),
|
detail::VariantData::removeMember(getData(), detail::adaptString(key),
|
||||||
getResourceManager());
|
getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -338,7 +338,7 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
|
|||||||
FORCE_INLINE
|
FORCE_INLINE
|
||||||
typename detail::enable_if<detail::IsString<TString>::value>::type
|
typename detail::enable_if<detail::IsString<TString>::value>::type
|
||||||
remove(const TString& key) {
|
remove(const TString& key) {
|
||||||
variantRemoveMember(getData(), detail::adaptString(key),
|
detail::VariantData::removeMember(getData(), detail::adaptString(key),
|
||||||
getResourceManager());
|
getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -62,7 +62,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
|
|||||||
// Returns the depth (nesting level) of the object.
|
// Returns the depth (nesting level) of the object.
|
||||||
// https://arduinojson.org/v6/api/jsonobject/nesting/
|
// https://arduinojson.org/v6/api/jsonobject/nesting/
|
||||||
FORCE_INLINE size_t nesting() const {
|
FORCE_INLINE size_t nesting() const {
|
||||||
return variantNesting(collectionToVariant(data_));
|
return detail::VariantData::nesting(collectionToVariant(data_));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the number of members in the object.
|
// Returns the number of members in the object.
|
||||||
@@ -210,7 +210,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
|
|||||||
template <>
|
template <>
|
||||||
struct Converter<JsonObject> : private detail::VariantAttorney {
|
struct Converter<JsonObject> : private detail::VariantAttorney {
|
||||||
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
||||||
variantCopyFrom(getData(dst), getData(src), getResourceManager(dst));
|
detail::VariantData::copy(getData(dst), getData(src),
|
||||||
|
getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
static JsonObject fromJson(JsonVariant src) {
|
static JsonObject fromJson(JsonVariant src) {
|
||||||
@@ -240,7 +241,8 @@ template <typename TDerived>
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
typename enable_if<is_same<T, JsonObject>::value, JsonObject>::type
|
typename enable_if<is_same<T, JsonObject>::value, JsonObject>::type
|
||||||
VariantRefBase<TDerived>::to() const {
|
VariantRefBase<TDerived>::to() const {
|
||||||
return JsonObject(variantToObject(getOrCreateData(), getResourceManager()),
|
return JsonObject(
|
||||||
|
VariantData::toObject(getOrCreateData(), getResourceManager()),
|
||||||
getResourceManager());
|
getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -49,7 +49,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
|
|||||||
// Returns the depth (nesting level) of the object.
|
// Returns the depth (nesting level) of the object.
|
||||||
// https://arduinojson.org/v6/api/jsonobjectconst/nesting/
|
// https://arduinojson.org/v6/api/jsonobjectconst/nesting/
|
||||||
FORCE_INLINE size_t nesting() const {
|
FORCE_INLINE size_t nesting() const {
|
||||||
return variantNesting(collectionToVariant(data_));
|
return detail::VariantData::nesting(collectionToVariant(data_));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the number of members in the object.
|
// Returns the number of members in the object.
|
||||||
@@ -122,7 +122,8 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
|
|||||||
template <>
|
template <>
|
||||||
struct Converter<JsonObjectConst> : private detail::VariantAttorney {
|
struct Converter<JsonObjectConst> : private detail::VariantAttorney {
|
||||||
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
||||||
variantCopyFrom(getData(dst), getData(src), getResourceManager(dst));
|
detail::VariantData::copy(getData(dst), getData(src),
|
||||||
|
getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
static JsonObjectConst fromJson(JsonVariantConst src) {
|
static JsonObjectConst fromJson(JsonVariantConst src) {
|
||||||
|
@@ -54,7 +54,7 @@ template <typename TDerived>
|
|||||||
template <typename TString>
|
template <typename TString>
|
||||||
inline typename enable_if<IsString<TString>::value, bool>::type
|
inline typename enable_if<IsString<TString>::value, bool>::type
|
||||||
VariantRefBase<TDerived>::containsKey(const TString& key) const {
|
VariantRefBase<TDerived>::containsKey(const TString& key) const {
|
||||||
return variantGetMember(VariantAttorney::getData(derived()),
|
return VariantData::getMember(VariantAttorney::getData(derived()),
|
||||||
adaptString(key)) != 0;
|
adaptString(key)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ template <typename TDerived>
|
|||||||
template <typename TChar>
|
template <typename TChar>
|
||||||
inline typename enable_if<IsString<TChar*>::value, bool>::type
|
inline typename enable_if<IsString<TChar*>::value, bool>::type
|
||||||
VariantRefBase<TDerived>::containsKey(TChar* key) const {
|
VariantRefBase<TDerived>::containsKey(TChar* key) const {
|
||||||
return variantGetMember(VariantAttorney::getData(derived()),
|
return VariantData::getMember(VariantAttorney::getData(derived()),
|
||||||
adaptString(key)) != 0;
|
adaptString(key)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -46,13 +46,15 @@ class MemberProxy
|
|||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE VariantData* getData() const {
|
FORCE_INLINE VariantData* getData() const {
|
||||||
return variantGetMember(VariantAttorney::getData(upstream_),
|
return VariantData::getMember(VariantAttorney::getData(upstream_),
|
||||||
adaptString(key_));
|
adaptString(key_));
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE VariantData* getOrCreateData() const {
|
FORCE_INLINE VariantData* getOrCreateData() const {
|
||||||
return variantGetOrAddMember(
|
auto data = VariantAttorney::getOrCreateData(upstream_);
|
||||||
VariantAttorney::getOrCreateData(upstream_), adaptString(key_),
|
if (!data)
|
||||||
|
return nullptr;
|
||||||
|
return data->getOrAddMember(adaptString(key_),
|
||||||
VariantAttorney::getResourceManager(upstream_));
|
VariantAttorney::getResourceManager(upstream_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -49,7 +49,9 @@ inline bool ObjectData::copyFrom(const ObjectData& src,
|
|||||||
JsonString key(s->key(),
|
JsonString key(s->key(),
|
||||||
s->ownsKey() ? JsonString::Copied : JsonString::Linked);
|
s->ownsKey() ? JsonString::Copied : JsonString::Linked);
|
||||||
auto var = addMember(adaptString(key), resources);
|
auto var = addMember(adaptString(key), resources);
|
||||||
if (!variantCopyFrom(var, s->data(), resources))
|
if (!var)
|
||||||
|
return false;
|
||||||
|
if (!var->copyFrom(s->data(), resources))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@@ -12,7 +12,7 @@ template <template <typename> class TSerializer>
|
|||||||
size_t measure(ArduinoJson::JsonVariantConst source) {
|
size_t measure(ArduinoJson::JsonVariantConst source) {
|
||||||
DummyWriter dp;
|
DummyWriter dp;
|
||||||
TSerializer<DummyWriter> serializer(dp);
|
TSerializer<DummyWriter> serializer(dp);
|
||||||
return variantAccept(VariantAttorney::getData(source), serializer);
|
return VariantData::accept(VariantAttorney::getData(source), serializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||||
|
@@ -11,7 +11,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
|||||||
template <template <typename> class TSerializer, typename TWriter>
|
template <template <typename> class TSerializer, typename TWriter>
|
||||||
size_t doSerialize(ArduinoJson::JsonVariantConst source, TWriter writer) {
|
size_t doSerialize(ArduinoJson::JsonVariantConst source, TWriter writer) {
|
||||||
TSerializer<TWriter> serializer(writer);
|
TSerializer<TWriter> serializer(writer);
|
||||||
return variantAccept(VariantAttorney::getData(source), serializer);
|
return VariantData::accept(VariantAttorney::getData(source), serializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <template <typename> class TSerializer, typename TDestination>
|
template <template <typename> class TSerializer, typename TDestination>
|
||||||
|
@@ -42,7 +42,9 @@ struct Converter<
|
|||||||
: private detail::VariantAttorney {
|
: private detail::VariantAttorney {
|
||||||
static void toJson(T src, JsonVariant dst) {
|
static void toJson(T src, JsonVariant dst) {
|
||||||
ARDUINOJSON_ASSERT_INTEGER_TYPE_IS_SUPPORTED(T);
|
ARDUINOJSON_ASSERT_INTEGER_TYPE_IS_SUPPORTED(T);
|
||||||
variantSetInteger(getData(dst), src, getResourceManager(dst));
|
auto data = getData(dst);
|
||||||
|
if (data)
|
||||||
|
data->setInteger(src, getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
static T fromJson(JsonVariantConst src) {
|
static T fromJson(JsonVariantConst src) {
|
||||||
@@ -78,7 +80,9 @@ struct Converter<T, typename detail::enable_if<detail::is_enum<T>::value>::type>
|
|||||||
template <>
|
template <>
|
||||||
struct Converter<bool> : private detail::VariantAttorney {
|
struct Converter<bool> : private detail::VariantAttorney {
|
||||||
static void toJson(bool src, JsonVariant dst) {
|
static void toJson(bool src, JsonVariant dst) {
|
||||||
variantSetBoolean(getData(dst), src, getResourceManager(dst));
|
auto data = getData(dst);
|
||||||
|
if (data)
|
||||||
|
data->setBoolean(src, getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool fromJson(JsonVariantConst src) {
|
static bool fromJson(JsonVariantConst src) {
|
||||||
@@ -97,8 +101,9 @@ struct Converter<
|
|||||||
T, typename detail::enable_if<detail::is_floating_point<T>::value>::type>
|
T, typename detail::enable_if<detail::is_floating_point<T>::value>::type>
|
||||||
: private detail::VariantAttorney {
|
: private detail::VariantAttorney {
|
||||||
static void toJson(T src, JsonVariant dst) {
|
static void toJson(T src, JsonVariant dst) {
|
||||||
variantSetFloat(getData(dst), static_cast<JsonFloat>(src),
|
auto data = getData(dst);
|
||||||
getResourceManager(dst));
|
if (data)
|
||||||
|
data->setFloat(static_cast<JsonFloat>(src), getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
static T fromJson(JsonVariantConst src) {
|
static T fromJson(JsonVariantConst src) {
|
||||||
@@ -115,7 +120,7 @@ struct Converter<
|
|||||||
template <>
|
template <>
|
||||||
struct Converter<const char*> : private detail::VariantAttorney {
|
struct Converter<const char*> : private detail::VariantAttorney {
|
||||||
static void toJson(const char* src, JsonVariant dst) {
|
static void toJson(const char* src, JsonVariant dst) {
|
||||||
variantSetString(getData(dst), detail::adaptString(src),
|
detail::VariantData::setString(getData(dst), detail::adaptString(src),
|
||||||
getResourceManager(dst));
|
getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +138,7 @@ struct Converter<const char*> : private detail::VariantAttorney {
|
|||||||
template <>
|
template <>
|
||||||
struct Converter<JsonString> : private detail::VariantAttorney {
|
struct Converter<JsonString> : private detail::VariantAttorney {
|
||||||
static void toJson(JsonString src, JsonVariant dst) {
|
static void toJson(JsonString src, JsonVariant dst) {
|
||||||
variantSetString(getData(dst), detail::adaptString(src),
|
detail::VariantData::setString(getData(dst), detail::adaptString(src),
|
||||||
getResourceManager(dst));
|
getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,7 +159,7 @@ convertToJson(const T& src, JsonVariant dst) {
|
|||||||
using namespace detail;
|
using namespace detail;
|
||||||
auto data = VariantAttorney::getData(dst);
|
auto data = VariantAttorney::getData(dst);
|
||||||
auto resources = VariantAttorney::getResourceManager(dst);
|
auto resources = VariantAttorney::getResourceManager(dst);
|
||||||
variantSetString(data, adaptString(src), resources);
|
detail::VariantData::setString(data, adaptString(src), resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SerializedValue<std::string>
|
// SerializedValue<std::string>
|
||||||
@@ -163,14 +168,15 @@ convertToJson(const T& src, JsonVariant dst) {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
struct Converter<SerializedValue<T>> : private detail::VariantAttorney {
|
struct Converter<SerializedValue<T>> : private detail::VariantAttorney {
|
||||||
static void toJson(SerializedValue<T> src, JsonVariant dst) {
|
static void toJson(SerializedValue<T> src, JsonVariant dst) {
|
||||||
variantSetRawString(getData(dst), src, getResourceManager(dst));
|
detail::VariantData::setRawString(getData(dst), src,
|
||||||
|
getResourceManager(dst));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct Converter<decltype(nullptr)> : private detail::VariantAttorney {
|
struct Converter<decltype(nullptr)> : private detail::VariantAttorney {
|
||||||
static void toJson(decltype(nullptr), JsonVariant dst) {
|
static void toJson(decltype(nullptr), JsonVariant dst) {
|
||||||
variantSetNull(getData(dst), getResourceManager(dst));
|
detail::VariantData::setNull(getData(dst), getResourceManager(dst));
|
||||||
}
|
}
|
||||||
static decltype(nullptr) fromJson(JsonVariantConst) {
|
static decltype(nullptr) fromJson(JsonVariantConst) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@@ -42,7 +42,7 @@ class JsonVariant : public detail::VariantRefBase<JsonVariant>,
|
|||||||
template <>
|
template <>
|
||||||
struct Converter<JsonVariant> : private detail::VariantAttorney {
|
struct Converter<JsonVariant> : private detail::VariantAttorney {
|
||||||
static void toJson(JsonVariant src, JsonVariant dst) {
|
static void toJson(JsonVariant src, JsonVariant dst) {
|
||||||
detail::variantCopyFrom(getData(dst), getData(src),
|
detail::VariantData::copy(getData(dst), getData(src),
|
||||||
getResourceManager(dst));
|
getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +66,8 @@ struct Converter<JsonVariant> : private detail::VariantAttorney {
|
|||||||
template <>
|
template <>
|
||||||
struct Converter<JsonVariantConst> : private detail::VariantAttorney {
|
struct Converter<JsonVariantConst> : private detail::VariantAttorney {
|
||||||
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
static void toJson(JsonVariantConst src, JsonVariant dst) {
|
||||||
variantCopyFrom(getData(dst), getData(src), getResourceManager(dst));
|
detail::VariantData::copy(getData(dst), getData(src),
|
||||||
|
getResourceManager(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
static JsonVariantConst fromJson(JsonVariantConst src) {
|
static JsonVariantConst fromJson(JsonVariantConst src) {
|
||||||
@@ -85,7 +86,8 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
|
|||||||
|
|
||||||
template <typename TDerived>
|
template <typename TDerived>
|
||||||
inline JsonVariant VariantRefBase<TDerived>::add() const {
|
inline JsonVariant VariantRefBase<TDerived>::add() const {
|
||||||
return JsonVariant(variantAddElement(getOrCreateData(), getResourceManager()),
|
return JsonVariant(
|
||||||
|
detail::VariantData::addElement(getOrCreateData(), getResourceManager()),
|
||||||
getResourceManager());
|
getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,7 +105,7 @@ template <typename TDerived>
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
typename enable_if<is_same<T, JsonVariant>::value, JsonVariant>::type
|
typename enable_if<is_same<T, JsonVariant>::value, JsonVariant>::type
|
||||||
VariantRefBase<TDerived>::to() const {
|
VariantRefBase<TDerived>::to() const {
|
||||||
variantSetNull(getOrCreateData(), getResourceManager());
|
detail::VariantData::setNull(getOrCreateData(), getResourceManager());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -37,8 +37,7 @@ class JsonVariantConst : public detail::VariantTag,
|
|||||||
// Returns true if the value is null or the reference is unbound.
|
// Returns true if the value is null or the reference is unbound.
|
||||||
// https://arduinojson.org/v6/api/jsonvariantconst/isnull/
|
// https://arduinojson.org/v6/api/jsonvariantconst/isnull/
|
||||||
FORCE_INLINE bool isNull() const {
|
FORCE_INLINE bool isNull() const {
|
||||||
using namespace detail;
|
return detail::VariantData::isNull(data_);
|
||||||
return variantIsNull(data_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if the reference is unbound.
|
// Returns true if the reference is unbound.
|
||||||
@@ -55,13 +54,13 @@ class JsonVariantConst : public detail::VariantTag,
|
|||||||
// Returns the depth (nesting level) of the value.
|
// Returns the depth (nesting level) of the value.
|
||||||
// https://arduinojson.org/v6/api/jsonvariantconst/nesting/
|
// https://arduinojson.org/v6/api/jsonvariantconst/nesting/
|
||||||
FORCE_INLINE size_t nesting() const {
|
FORCE_INLINE size_t nesting() const {
|
||||||
return variantNesting(data_);
|
return detail::VariantData::nesting(data_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the size of the array or object.
|
// Returns the size of the array or object.
|
||||||
// https://arduinojson.org/v6/api/jsonvariantconst/size/
|
// https://arduinojson.org/v6/api/jsonvariantconst/size/
|
||||||
size_t size() const {
|
size_t size() const {
|
||||||
return variantSize(data_);
|
return detail::VariantData::size(data_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Casts the value to the specified type.
|
// Casts the value to the specified type.
|
||||||
@@ -92,7 +91,7 @@ class JsonVariantConst : public detail::VariantTag,
|
|||||||
// Gets array's element at specified index.
|
// Gets array's element at specified index.
|
||||||
// https://arduinojson.org/v6/api/jsonvariantconst/subscript/
|
// https://arduinojson.org/v6/api/jsonvariantconst/subscript/
|
||||||
FORCE_INLINE JsonVariantConst operator[](size_t index) const {
|
FORCE_INLINE JsonVariantConst operator[](size_t index) const {
|
||||||
return JsonVariantConst(variantGetElement(data_, index));
|
return JsonVariantConst(detail::VariantData::getElement(data_, index));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets object's member with specified key.
|
// Gets object's member with specified key.
|
||||||
@@ -101,7 +100,8 @@ class JsonVariantConst : public detail::VariantTag,
|
|||||||
FORCE_INLINE typename detail::enable_if<detail::IsString<TString>::value,
|
FORCE_INLINE typename detail::enable_if<detail::IsString<TString>::value,
|
||||||
JsonVariantConst>::type
|
JsonVariantConst>::type
|
||||||
operator[](const TString& key) const {
|
operator[](const TString& key) const {
|
||||||
return JsonVariantConst(variantGetMember(data_, detail::adaptString(key)));
|
return JsonVariantConst(
|
||||||
|
detail::VariantData::getMember(data_, detail::adaptString(key)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets object's member with specified key.
|
// Gets object's member with specified key.
|
||||||
@@ -110,7 +110,8 @@ class JsonVariantConst : public detail::VariantTag,
|
|||||||
FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value,
|
FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value,
|
||||||
JsonVariantConst>::type
|
JsonVariantConst>::type
|
||||||
operator[](TChar* key) const {
|
operator[](TChar* key) const {
|
||||||
return JsonVariantConst(variantGetMember(data_, detail::adaptString(key)));
|
return JsonVariantConst(
|
||||||
|
detail::VariantData::getMember(data_, detail::adaptString(key)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if tge object contains the specified key.
|
// Returns true if tge object contains the specified key.
|
||||||
@@ -119,7 +120,8 @@ class JsonVariantConst : public detail::VariantTag,
|
|||||||
FORCE_INLINE
|
FORCE_INLINE
|
||||||
typename detail::enable_if<detail::IsString<TString>::value, bool>::type
|
typename detail::enable_if<detail::IsString<TString>::value, bool>::type
|
||||||
containsKey(const TString& key) const {
|
containsKey(const TString& key) const {
|
||||||
return variantGetMember(getData(), detail::adaptString(key)) != 0;
|
return detail::VariantData::getMember(getData(),
|
||||||
|
detail::adaptString(key)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if tge object contains the specified key.
|
// Returns true if tge object contains the specified key.
|
||||||
@@ -128,7 +130,8 @@ class JsonVariantConst : public detail::VariantTag,
|
|||||||
FORCE_INLINE
|
FORCE_INLINE
|
||||||
typename detail::enable_if<detail::IsString<TChar*>::value, bool>::type
|
typename detail::enable_if<detail::IsString<TChar*>::value, bool>::type
|
||||||
containsKey(TChar* key) const {
|
containsKey(TChar* key) const {
|
||||||
return variantGetMember(getData(), detail::adaptString(key)) != 0;
|
return detail::VariantData::getMember(getData(),
|
||||||
|
detail::adaptString(key)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@@ -176,7 +176,7 @@ struct VariantComparer : ComparerBase {
|
|||||||
private:
|
private:
|
||||||
template <typename TComparer>
|
template <typename TComparer>
|
||||||
CompareResult accept(TComparer& comparer) {
|
CompareResult accept(TComparer& comparer) {
|
||||||
CompareResult reversedResult = variantAccept(rhs, comparer);
|
CompareResult reversedResult = VariantData::accept(rhs, comparer);
|
||||||
switch (reversedResult) {
|
switch (reversedResult) {
|
||||||
case COMPARE_RESULT_GREATER:
|
case COMPARE_RESULT_GREATER:
|
||||||
return COMPARE_RESULT_LESS;
|
return COMPARE_RESULT_LESS;
|
||||||
@@ -199,12 +199,12 @@ struct Comparer<T, typename enable_if<is_convertible<
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
CompareResult compare(ArduinoJson::JsonVariantConst lhs, const T& rhs) {
|
CompareResult compare(ArduinoJson::JsonVariantConst lhs, const T& rhs) {
|
||||||
Comparer<T> comparer(rhs);
|
Comparer<T> comparer(rhs);
|
||||||
return variantAccept(VariantAttorney::getData(lhs), comparer);
|
return VariantData::accept(VariantAttorney::getData(lhs), comparer);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline CompareResult compare(const VariantData* lhs, const VariantData* rhs) {
|
inline CompareResult compare(const VariantData* lhs, const VariantData* rhs) {
|
||||||
VariantComparer comparer(rhs);
|
VariantComparer comparer(rhs);
|
||||||
return variantAccept(lhs, comparer);
|
return VariantData::accept(lhs, comparer);
|
||||||
}
|
}
|
||||||
|
|
||||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||||
|
@@ -63,11 +63,26 @@ class VariantData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename TVisitor>
|
||||||
|
static typename TVisitor::result_type accept(const VariantData* var,
|
||||||
|
TVisitor& visitor) {
|
||||||
|
if (var != 0)
|
||||||
|
return var->accept(visitor);
|
||||||
|
else
|
||||||
|
return visitor.visitNull();
|
||||||
|
}
|
||||||
|
|
||||||
VariantData* addElement(ResourceManager* resources) {
|
VariantData* addElement(ResourceManager* resources) {
|
||||||
auto array = isNull() ? &toArray() : asArray();
|
auto array = isNull() ? &toArray() : asArray();
|
||||||
return detail::ArrayData::addElement(array, resources);
|
return detail::ArrayData::addElement(array, resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VariantData* addElement(VariantData* var, ResourceManager* resources) {
|
||||||
|
if (!var)
|
||||||
|
return nullptr;
|
||||||
|
return var->addElement(resources);
|
||||||
|
}
|
||||||
|
|
||||||
bool asBoolean() const {
|
bool asBoolean() const {
|
||||||
switch (type()) {
|
switch (type()) {
|
||||||
case VALUE_IS_BOOLEAN:
|
case VALUE_IS_BOOLEAN:
|
||||||
@@ -201,6 +216,13 @@ class VariantData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool copy(VariantData* dst, const VariantData* src,
|
||||||
|
ResourceManager* resources) {
|
||||||
|
if (!dst)
|
||||||
|
return false;
|
||||||
|
return dst->copyFrom(src, resources);
|
||||||
|
}
|
||||||
|
|
||||||
VariantData* getElement(size_t index) const {
|
VariantData* getElement(size_t index) const {
|
||||||
auto array = asArray();
|
auto array = asArray();
|
||||||
if (!array)
|
if (!array)
|
||||||
@@ -208,6 +230,10 @@ class VariantData {
|
|||||||
return array->getElement(index);
|
return array->getElement(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VariantData* getElement(const VariantData* var, size_t index) {
|
||||||
|
return var != 0 ? var->getElement(index) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
template <typename TAdaptedString>
|
||||||
VariantData* getMember(TAdaptedString key) const {
|
VariantData* getMember(TAdaptedString key) const {
|
||||||
auto object = asObject();
|
auto object = asObject();
|
||||||
@@ -216,6 +242,13 @@ class VariantData {
|
|||||||
return object->getMember(key);
|
return object->getMember(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename TAdaptedString>
|
||||||
|
static VariantData* getMember(const VariantData* var, TAdaptedString key) {
|
||||||
|
if (!var)
|
||||||
|
return 0;
|
||||||
|
return var->getMember(key);
|
||||||
|
}
|
||||||
|
|
||||||
VariantData* getOrAddElement(size_t index, ResourceManager* resources) {
|
VariantData* getOrAddElement(size_t index, ResourceManager* resources) {
|
||||||
auto array = isNull() ? &toArray() : asArray();
|
auto array = isNull() ? &toArray() : asArray();
|
||||||
if (!array)
|
if (!array)
|
||||||
@@ -267,6 +300,12 @@ class VariantData {
|
|||||||
return type() == VALUE_IS_NULL;
|
return type() == VALUE_IS_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isNull(const VariantData* var) {
|
||||||
|
if (!var)
|
||||||
|
return true;
|
||||||
|
return var->isNull();
|
||||||
|
}
|
||||||
|
|
||||||
bool isObject() const {
|
bool isObject() const {
|
||||||
return (flags_ & VALUE_IS_OBJECT) != 0;
|
return (flags_ & VALUE_IS_OBJECT) != 0;
|
||||||
}
|
}
|
||||||
@@ -307,6 +346,12 @@ class VariantData {
|
|||||||
return maxChildNesting + 1;
|
return maxChildNesting + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t nesting(const VariantData* var) {
|
||||||
|
if (!var)
|
||||||
|
return 0;
|
||||||
|
return var->nesting();
|
||||||
|
}
|
||||||
|
|
||||||
void operator=(const VariantData& src) {
|
void operator=(const VariantData& src) {
|
||||||
content_ = src.content_;
|
content_ = src.content_;
|
||||||
flags_ = uint8_t((flags_ & OWNED_KEY_BIT) | (src.flags_ & ~OWNED_KEY_BIT));
|
flags_ = uint8_t((flags_ & OWNED_KEY_BIT) | (src.flags_ & ~OWNED_KEY_BIT));
|
||||||
@@ -316,11 +361,26 @@ class VariantData {
|
|||||||
ArrayData::removeElement(asArray(), index, resources);
|
ArrayData::removeElement(asArray(), index, resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void removeElement(VariantData* var, size_t index,
|
||||||
|
ResourceManager* resources) {
|
||||||
|
if (!var)
|
||||||
|
return;
|
||||||
|
var->removeElement(index, resources);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
template <typename TAdaptedString>
|
||||||
void removeMember(TAdaptedString key, ResourceManager* resources) {
|
void removeMember(TAdaptedString key, ResourceManager* resources) {
|
||||||
ObjectData::removeMember(asObject(), key, resources);
|
ObjectData::removeMember(asObject(), key, resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename TAdaptedString>
|
||||||
|
static void removeMember(VariantData* var, TAdaptedString key,
|
||||||
|
ResourceManager* resources) {
|
||||||
|
if (!var)
|
||||||
|
return;
|
||||||
|
var->removeMember(key, resources);
|
||||||
|
}
|
||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
flags_ = VALUE_IS_NULL;
|
flags_ = VALUE_IS_NULL;
|
||||||
}
|
}
|
||||||
@@ -372,6 +432,12 @@ class VariantData {
|
|||||||
setNull();
|
setNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setNull(VariantData* var, ResourceManager* resources) {
|
||||||
|
if (!var)
|
||||||
|
return;
|
||||||
|
var->setNull(resources);
|
||||||
|
}
|
||||||
|
|
||||||
void setRawString(StringNode* s) {
|
void setRawString(StringNode* s) {
|
||||||
ARDUINOJSON_ASSERT(s);
|
ARDUINOJSON_ASSERT(s);
|
||||||
setType(VALUE_IS_RAW_STRING);
|
setType(VALUE_IS_RAW_STRING);
|
||||||
@@ -388,6 +454,14 @@ class VariantData {
|
|||||||
setNull();
|
setNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
static void setRawString(VariantData* var, SerializedValue<T> value,
|
||||||
|
ResourceManager* resources) {
|
||||||
|
if (!var)
|
||||||
|
return;
|
||||||
|
var->setRawString(value, resources);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
template <typename TAdaptedString>
|
||||||
void setString(TAdaptedString value, ResourceManager* resources) {
|
void setString(TAdaptedString value, ResourceManager* resources) {
|
||||||
setNull(resources);
|
setNull(resources);
|
||||||
@@ -405,6 +479,14 @@ class VariantData {
|
|||||||
setOwnedString(dup);
|
setOwnedString(dup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename TAdaptedString>
|
||||||
|
static void setString(VariantData* var, TAdaptedString value,
|
||||||
|
ResourceManager* resources) {
|
||||||
|
if (!var)
|
||||||
|
return;
|
||||||
|
var->setString(value, resources);
|
||||||
|
}
|
||||||
|
|
||||||
void setLinkedString(const char* s) {
|
void setLinkedString(const char* s) {
|
||||||
ARDUINOJSON_ASSERT(s);
|
ARDUINOJSON_ASSERT(s);
|
||||||
setType(VALUE_IS_LINKED_STRING);
|
setType(VALUE_IS_LINKED_STRING);
|
||||||
@@ -421,6 +503,10 @@ class VariantData {
|
|||||||
return isCollection() ? content_.asCollection.size() : 0;
|
return isCollection() ? content_.asCollection.size() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t size(const VariantData* var) {
|
||||||
|
return var != 0 ? var->size() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
ArrayData& toArray() {
|
ArrayData& toArray() {
|
||||||
setType(VALUE_IS_ARRAY);
|
setType(VALUE_IS_ARRAY);
|
||||||
new (&content_.asArray) ArrayData();
|
new (&content_.asArray) ArrayData();
|
||||||
@@ -432,6 +518,12 @@ class VariantData {
|
|||||||
return toArray();
|
return toArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ArrayData* toArray(VariantData* var, ResourceManager* resources) {
|
||||||
|
if (!var)
|
||||||
|
return 0;
|
||||||
|
return &var->toArray(resources);
|
||||||
|
}
|
||||||
|
|
||||||
ObjectData& toObject() {
|
ObjectData& toObject() {
|
||||||
setType(VALUE_IS_OBJECT);
|
setType(VALUE_IS_OBJECT);
|
||||||
new (&content_.asObject) ObjectData();
|
new (&content_.asObject) ObjectData();
|
||||||
@@ -443,6 +535,12 @@ class VariantData {
|
|||||||
return toObject();
|
return toObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ObjectData* toObject(VariantData* var, ResourceManager* resources) {
|
||||||
|
if (!var)
|
||||||
|
return 0;
|
||||||
|
return &var->toObject(resources);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t type() const {
|
uint8_t type() const {
|
||||||
return flags_ & VALUE_MASK;
|
return flags_ & VALUE_MASK;
|
||||||
}
|
}
|
||||||
@@ -465,140 +563,4 @@ class VariantData {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename TVisitor>
|
|
||||||
typename TVisitor::result_type variantAccept(const VariantData* var,
|
|
||||||
TVisitor& visitor) {
|
|
||||||
if (var != 0)
|
|
||||||
return var->accept(visitor);
|
|
||||||
else
|
|
||||||
return visitor.visitNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool variantCopyFrom(VariantData* dst, const VariantData* src,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!dst)
|
|
||||||
return false;
|
|
||||||
return dst->copyFrom(src, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline VariantData* variantAddElement(VariantData* var,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return nullptr;
|
|
||||||
return var->addElement(resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline VariantData* variantGetElement(const VariantData* var, size_t index) {
|
|
||||||
return var != 0 ? var->getElement(index) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
|
||||||
VariantData* variantGetMember(const VariantData* var, TAdaptedString key) {
|
|
||||||
if (!var)
|
|
||||||
return 0;
|
|
||||||
return var->getMember(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline VariantData* variantGetOrAddElement(VariantData* var, size_t index,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return nullptr;
|
|
||||||
return var->getOrAddElement(index, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
|
||||||
VariantData* variantGetOrAddMember(VariantData* var, TAdaptedString key,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return nullptr;
|
|
||||||
return var->getOrAddMember(key, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool variantIsNull(const VariantData* var) {
|
|
||||||
if (!var)
|
|
||||||
return true;
|
|
||||||
return var->isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t variantNesting(const VariantData* var) {
|
|
||||||
if (!var)
|
|
||||||
return 0;
|
|
||||||
return var->nesting();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void variantRemoveElement(VariantData* var, size_t index,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return;
|
|
||||||
var->removeElement(index, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
|
||||||
void variantRemoveMember(VariantData* var, TAdaptedString key,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return;
|
|
||||||
var->removeMember(key, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void variantSetBoolean(VariantData* var, bool value,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return;
|
|
||||||
var->setBoolean(value, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void variantSetFloat(VariantData* var, JsonFloat value,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return;
|
|
||||||
var->setFloat(value, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void variantSetInteger(VariantData* var, T value, ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return;
|
|
||||||
var->setInteger(value, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void variantSetNull(VariantData* var, ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return;
|
|
||||||
var->setNull(resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void variantSetRawString(VariantData* var, SerializedValue<T> value,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return;
|
|
||||||
var->setRawString(value, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename TAdaptedString>
|
|
||||||
void variantSetString(VariantData* var, TAdaptedString value,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return;
|
|
||||||
var->setString(value, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t variantSize(const VariantData* var) {
|
|
||||||
return var != 0 ? var->size() : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline ArrayData* variantToArray(VariantData* var, ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return 0;
|
|
||||||
return &var->toArray(resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline ObjectData* variantToObject(VariantData* var,
|
|
||||||
ResourceManager* resources) {
|
|
||||||
if (!var)
|
|
||||||
return 0;
|
|
||||||
return &var->toObject(resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
ARDUINOJSON_END_PRIVATE_NAMESPACE
|
||||||
|
@@ -30,13 +30,13 @@ class VariantRefBase : public VariantTag {
|
|||||||
// ⚠️ Doesn't release the memory associated with the previous value.
|
// ⚠️ Doesn't release the memory associated with the previous value.
|
||||||
// https://arduinojson.org/v6/api/jsonvariant/clear/
|
// https://arduinojson.org/v6/api/jsonvariant/clear/
|
||||||
FORCE_INLINE void clear() const {
|
FORCE_INLINE void clear() const {
|
||||||
variantSetNull(getOrCreateData(), getResourceManager());
|
VariantData::setNull(getOrCreateData(), getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if the value is null or the reference is unbound.
|
// Returns true if the value is null or the reference is unbound.
|
||||||
// https://arduinojson.org/v6/api/jsonvariant/isnull/
|
// https://arduinojson.org/v6/api/jsonvariant/isnull/
|
||||||
FORCE_INLINE bool isNull() const {
|
FORCE_INLINE bool isNull() const {
|
||||||
return variantIsNull(getData());
|
return VariantData::isNull(getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if the reference is unbound.
|
// Returns true if the reference is unbound.
|
||||||
@@ -112,7 +112,7 @@ class VariantRefBase : public VariantTag {
|
|||||||
VariantData* data = getOrCreateData();
|
VariantData* data = getOrCreateData();
|
||||||
if (!data)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
variantSetNull(data, getResourceManager());
|
data->setNull(getResourceManager());
|
||||||
const VariantData* targetData = VariantAttorney::getData(target);
|
const VariantData* targetData = VariantAttorney::getData(target);
|
||||||
if (targetData)
|
if (targetData)
|
||||||
*data = *targetData;
|
*data = *targetData;
|
||||||
@@ -139,7 +139,7 @@ class VariantRefBase : public VariantTag {
|
|||||||
// Returns the size of the array or object.
|
// Returns the size of the array or object.
|
||||||
// https://arduinojson.org/v6/api/jsonvariant/size/
|
// https://arduinojson.org/v6/api/jsonvariant/size/
|
||||||
FORCE_INLINE size_t size() const {
|
FORCE_INLINE size_t size() const {
|
||||||
return variantSize(getData());
|
return VariantData::size(getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the number of bytes occupied by the value.
|
// Returns the number of bytes occupied by the value.
|
||||||
@@ -152,7 +152,7 @@ class VariantRefBase : public VariantTag {
|
|||||||
// Returns the depth (nesting level) of the value.
|
// Returns the depth (nesting level) of the value.
|
||||||
// https://arduinojson.org/v6/api/jsonvariant/nesting/
|
// https://arduinojson.org/v6/api/jsonvariant/nesting/
|
||||||
FORCE_INLINE size_t nesting() const {
|
FORCE_INLINE size_t nesting() const {
|
||||||
return variantNesting(getData());
|
return VariantData::nesting(getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Appends a new (null) element to the array.
|
// Appends a new (null) element to the array.
|
||||||
@@ -178,7 +178,7 @@ class VariantRefBase : public VariantTag {
|
|||||||
// ⚠️ Doesn't release the memory associated with the removed element.
|
// ⚠️ Doesn't release the memory associated with the removed element.
|
||||||
// https://arduinojson.org/v6/api/jsonvariant/remove/
|
// https://arduinojson.org/v6/api/jsonvariant/remove/
|
||||||
FORCE_INLINE void remove(size_t index) const {
|
FORCE_INLINE void remove(size_t index) const {
|
||||||
variantRemoveElement(getData(), index, getResourceManager());
|
VariantData::removeElement(getData(), index, getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Removes a member of the object.
|
// Removes a member of the object.
|
||||||
@@ -187,7 +187,8 @@ class VariantRefBase : public VariantTag {
|
|||||||
template <typename TChar>
|
template <typename TChar>
|
||||||
FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(
|
FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(
|
||||||
TChar* key) const {
|
TChar* key) const {
|
||||||
variantRemoveMember(getData(), adaptString(key), getResourceManager());
|
VariantData::removeMember(getData(), adaptString(key),
|
||||||
|
getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Removes a member of the object.
|
// Removes a member of the object.
|
||||||
@@ -196,7 +197,8 @@ class VariantRefBase : public VariantTag {
|
|||||||
template <typename TString>
|
template <typename TString>
|
||||||
FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
|
FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
|
||||||
const TString& key) const {
|
const TString& key) const {
|
||||||
variantRemoveMember(getData(), adaptString(key), getResourceManager());
|
VariantData::removeMember(getData(), adaptString(key),
|
||||||
|
getResourceManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates an array and appends it to the array.
|
// Creates an array and appends it to the array.
|
||||||
|
Reference in New Issue
Block a user