Convert "variant functions" to static member functions

This commit is contained in:
Benoit Blanchon
2023-06-26 11:58:46 +02:00
parent af8bdfbc8f
commit d921cd6d02
18 changed files with 196 additions and 207 deletions

View File

@ -23,7 +23,9 @@ inline bool ArrayData::copyFrom(const ArrayData& src,
for (VariantSlot* s = src.head(); s; s = s->next()) {
auto var = addElement(resources);
if (!variantCopyFrom(var, s->data(), resources))
if (!var)
return false;
if (!var->copyFrom(s->data(), resources))
return false;
}
return true;

View File

@ -45,13 +45,15 @@ class ElementProxy : public VariantRefBase<ElementProxy<TUpstream>>,
}
FORCE_INLINE VariantData* getData() const {
return variantGetElement(VariantAttorney::getData(upstream_), index_);
return VariantData::getElement(VariantAttorney::getData(upstream_), index_);
}
FORCE_INLINE VariantData* getOrCreateData() const {
return variantGetOrAddElement(
VariantAttorney::getOrCreateData(upstream_), index_,
VariantAttorney::getResourceManager(upstream_));
auto data = VariantAttorney::getOrCreateData(upstream_);
if (!data)
return nullptr;
return data->getOrAddElement(
index_, VariantAttorney::getResourceManager(upstream_));
}
TUpstream upstream_;

View File

@ -150,7 +150,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// Returns the depth (nesting level) of the array.
// https://arduinojson.org/v6/api/jsonarray/nesting/
FORCE_INLINE size_t nesting() const {
return variantNesting(collectionToVariant(data_));
return detail::VariantData::nesting(collectionToVariant(data_));
}
// Returns the number of elements in the array.
@ -179,7 +179,8 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
template <>
struct Converter<JsonArray> : private detail::VariantAttorney {
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) {
@ -209,8 +210,9 @@ template <typename TDerived>
template <typename T>
inline typename enable_if<is_same<T, JsonArray>::value, JsonArray>::type
VariantRefBase<TDerived>::to() const {
return JsonArray(variantToArray(getOrCreateData(), getResourceManager()),
getResourceManager());
return JsonArray(
VariantData::toArray(getOrCreateData(), getResourceManager()),
getResourceManager());
}
ARDUINOJSON_END_PRIVATE_NAMESPACE

View File

@ -78,7 +78,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
// Returns the depth (nesting level) of the array.
// https://arduinojson.org/v6/api/jsonarrayconst/nesting/
FORCE_INLINE size_t nesting() const {
return variantNesting(collectionToVariant(data_));
return detail::VariantData::nesting(collectionToVariant(data_));
}
// Returns the number of elements in the array.
@ -98,7 +98,8 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
template <>
struct Converter<JsonArrayConst> : private detail::VariantAttorney {
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) {

View File

@ -318,7 +318,7 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
// ⚠️ Doesn't release the memory associated with the removed element.
// https://arduinojson.org/v6/api/jsondocument/remove/
FORCE_INLINE void remove(size_t index) {
variantRemoveElement(getData(), index, getResourceManager());
detail::VariantData::removeElement(getData(), index, getResourceManager());
}
// Removes a member of the root object.
@ -327,8 +327,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
template <typename TChar>
FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value>::type
remove(TChar* key) {
variantRemoveMember(getData(), detail::adaptString(key),
getResourceManager());
detail::VariantData::removeMember(getData(), detail::adaptString(key),
getResourceManager());
}
// Removes a member of the root object.
@ -338,8 +338,8 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
FORCE_INLINE
typename detail::enable_if<detail::IsString<TString>::value>::type
remove(const TString& key) {
variantRemoveMember(getData(), detail::adaptString(key),
getResourceManager());
detail::VariantData::removeMember(getData(), detail::adaptString(key),
getResourceManager());
}
FORCE_INLINE operator JsonVariant() {

View File

@ -62,7 +62,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
// Returns the depth (nesting level) of the object.
// https://arduinojson.org/v6/api/jsonobject/nesting/
FORCE_INLINE size_t nesting() const {
return variantNesting(collectionToVariant(data_));
return detail::VariantData::nesting(collectionToVariant(data_));
}
// Returns the number of members in the object.
@ -210,7 +210,8 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
template <>
struct Converter<JsonObject> : private detail::VariantAttorney {
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) {
@ -240,8 +241,9 @@ template <typename TDerived>
template <typename T>
typename enable_if<is_same<T, JsonObject>::value, JsonObject>::type
VariantRefBase<TDerived>::to() const {
return JsonObject(variantToObject(getOrCreateData(), getResourceManager()),
getResourceManager());
return JsonObject(
VariantData::toObject(getOrCreateData(), getResourceManager()),
getResourceManager());
}
ARDUINOJSON_END_PRIVATE_NAMESPACE

View File

@ -49,7 +49,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
// Returns the depth (nesting level) of the object.
// https://arduinojson.org/v6/api/jsonobjectconst/nesting/
FORCE_INLINE size_t nesting() const {
return variantNesting(collectionToVariant(data_));
return detail::VariantData::nesting(collectionToVariant(data_));
}
// Returns the number of members in the object.
@ -122,7 +122,8 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
template <>
struct Converter<JsonObjectConst> : private detail::VariantAttorney {
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) {

View File

@ -54,16 +54,16 @@ template <typename TDerived>
template <typename TString>
inline typename enable_if<IsString<TString>::value, bool>::type
VariantRefBase<TDerived>::containsKey(const TString& key) const {
return variantGetMember(VariantAttorney::getData(derived()),
adaptString(key)) != 0;
return VariantData::getMember(VariantAttorney::getData(derived()),
adaptString(key)) != 0;
}
template <typename TDerived>
template <typename TChar>
inline typename enable_if<IsString<TChar*>::value, bool>::type
VariantRefBase<TDerived>::containsKey(TChar* key) const {
return variantGetMember(VariantAttorney::getData(derived()),
adaptString(key)) != 0;
return VariantData::getMember(VariantAttorney::getData(derived()),
adaptString(key)) != 0;
}
template <typename TDerived>

View File

@ -46,14 +46,16 @@ class MemberProxy
}
FORCE_INLINE VariantData* getData() const {
return variantGetMember(VariantAttorney::getData(upstream_),
adaptString(key_));
return VariantData::getMember(VariantAttorney::getData(upstream_),
adaptString(key_));
}
FORCE_INLINE VariantData* getOrCreateData() const {
return variantGetOrAddMember(
VariantAttorney::getOrCreateData(upstream_), adaptString(key_),
VariantAttorney::getResourceManager(upstream_));
auto data = VariantAttorney::getOrCreateData(upstream_);
if (!data)
return nullptr;
return data->getOrAddMember(adaptString(key_),
VariantAttorney::getResourceManager(upstream_));
}
private:

View File

@ -49,7 +49,9 @@ inline bool ObjectData::copyFrom(const ObjectData& src,
JsonString key(s->key(),
s->ownsKey() ? JsonString::Copied : JsonString::Linked);
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 true;

View File

@ -12,7 +12,7 @@ template <template <typename> class TSerializer>
size_t measure(ArduinoJson::JsonVariantConst source) {
DummyWriter dp;
TSerializer<DummyWriter> serializer(dp);
return variantAccept(VariantAttorney::getData(source), serializer);
return VariantData::accept(VariantAttorney::getData(source), serializer);
}
ARDUINOJSON_END_PRIVATE_NAMESPACE

View File

@ -11,7 +11,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
template <template <typename> class TSerializer, typename TWriter>
size_t doSerialize(ArduinoJson::JsonVariantConst source, TWriter 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>

View File

@ -42,7 +42,9 @@ struct Converter<
: private detail::VariantAttorney {
static void toJson(T src, JsonVariant dst) {
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) {
@ -78,7 +80,9 @@ struct Converter<T, typename detail::enable_if<detail::is_enum<T>::value>::type>
template <>
struct Converter<bool> : private detail::VariantAttorney {
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) {
@ -97,8 +101,9 @@ struct Converter<
T, typename detail::enable_if<detail::is_floating_point<T>::value>::type>
: private detail::VariantAttorney {
static void toJson(T src, JsonVariant dst) {
variantSetFloat(getData(dst), static_cast<JsonFloat>(src),
getResourceManager(dst));
auto data = getData(dst);
if (data)
data->setFloat(static_cast<JsonFloat>(src), getResourceManager(dst));
}
static T fromJson(JsonVariantConst src) {
@ -115,8 +120,8 @@ struct Converter<
template <>
struct Converter<const char*> : private detail::VariantAttorney {
static void toJson(const char* src, JsonVariant dst) {
variantSetString(getData(dst), detail::adaptString(src),
getResourceManager(dst));
detail::VariantData::setString(getData(dst), detail::adaptString(src),
getResourceManager(dst));
}
static const char* fromJson(JsonVariantConst src) {
@ -133,8 +138,8 @@ struct Converter<const char*> : private detail::VariantAttorney {
template <>
struct Converter<JsonString> : private detail::VariantAttorney {
static void toJson(JsonString src, JsonVariant dst) {
variantSetString(getData(dst), detail::adaptString(src),
getResourceManager(dst));
detail::VariantData::setString(getData(dst), detail::adaptString(src),
getResourceManager(dst));
}
static JsonString fromJson(JsonVariantConst src) {
@ -154,7 +159,7 @@ convertToJson(const T& src, JsonVariant dst) {
using namespace detail;
auto data = VariantAttorney::getData(dst);
auto resources = VariantAttorney::getResourceManager(dst);
variantSetString(data, adaptString(src), resources);
detail::VariantData::setString(data, adaptString(src), resources);
}
// SerializedValue<std::string>
@ -163,14 +168,15 @@ convertToJson(const T& src, JsonVariant dst) {
template <typename T>
struct Converter<SerializedValue<T>> : private detail::VariantAttorney {
static void toJson(SerializedValue<T> src, JsonVariant dst) {
variantSetRawString(getData(dst), src, getResourceManager(dst));
detail::VariantData::setRawString(getData(dst), src,
getResourceManager(dst));
}
};
template <>
struct Converter<decltype(nullptr)> : private detail::VariantAttorney {
static void toJson(decltype(nullptr), JsonVariant dst) {
variantSetNull(getData(dst), getResourceManager(dst));
detail::VariantData::setNull(getData(dst), getResourceManager(dst));
}
static decltype(nullptr) fromJson(JsonVariantConst) {
return nullptr;

View File

@ -42,8 +42,8 @@ class JsonVariant : public detail::VariantRefBase<JsonVariant>,
template <>
struct Converter<JsonVariant> : private detail::VariantAttorney {
static void toJson(JsonVariant src, JsonVariant dst) {
detail::variantCopyFrom(getData(dst), getData(src),
getResourceManager(dst));
detail::VariantData::copy(getData(dst), getData(src),
getResourceManager(dst));
}
static JsonVariant fromJson(JsonVariant src) {
@ -66,7 +66,8 @@ struct Converter<JsonVariant> : private detail::VariantAttorney {
template <>
struct Converter<JsonVariantConst> : private detail::VariantAttorney {
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) {
@ -85,8 +86,9 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
template <typename TDerived>
inline JsonVariant VariantRefBase<TDerived>::add() const {
return JsonVariant(variantAddElement(getOrCreateData(), getResourceManager()),
getResourceManager());
return JsonVariant(
detail::VariantData::addElement(getOrCreateData(), getResourceManager()),
getResourceManager());
}
template <typename TDerived>
@ -103,7 +105,7 @@ template <typename TDerived>
template <typename T>
typename enable_if<is_same<T, JsonVariant>::value, JsonVariant>::type
VariantRefBase<TDerived>::to() const {
variantSetNull(getOrCreateData(), getResourceManager());
detail::VariantData::setNull(getOrCreateData(), getResourceManager());
return *this;
}

View File

@ -37,8 +37,7 @@ class JsonVariantConst : public detail::VariantTag,
// Returns true if the value is null or the reference is unbound.
// https://arduinojson.org/v6/api/jsonvariantconst/isnull/
FORCE_INLINE bool isNull() const {
using namespace detail;
return variantIsNull(data_);
return detail::VariantData::isNull(data_);
}
// Returns true if the reference is unbound.
@ -55,13 +54,13 @@ class JsonVariantConst : public detail::VariantTag,
// Returns the depth (nesting level) of the value.
// https://arduinojson.org/v6/api/jsonvariantconst/nesting/
FORCE_INLINE size_t nesting() const {
return variantNesting(data_);
return detail::VariantData::nesting(data_);
}
// Returns the size of the array or object.
// https://arduinojson.org/v6/api/jsonvariantconst/size/
size_t size() const {
return variantSize(data_);
return detail::VariantData::size(data_);
}
// Casts the value to the specified type.
@ -92,7 +91,7 @@ class JsonVariantConst : public detail::VariantTag,
// Gets array's element at specified index.
// https://arduinojson.org/v6/api/jsonvariantconst/subscript/
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.
@ -101,7 +100,8 @@ class JsonVariantConst : public detail::VariantTag,
FORCE_INLINE typename detail::enable_if<detail::IsString<TString>::value,
JsonVariantConst>::type
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.
@ -110,7 +110,8 @@ class JsonVariantConst : public detail::VariantTag,
FORCE_INLINE typename detail::enable_if<detail::IsString<TChar*>::value,
JsonVariantConst>::type
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.
@ -119,7 +120,8 @@ class JsonVariantConst : public detail::VariantTag,
FORCE_INLINE
typename detail::enable_if<detail::IsString<TString>::value, bool>::type
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.
@ -128,7 +130,8 @@ class JsonVariantConst : public detail::VariantTag,
FORCE_INLINE
typename detail::enable_if<detail::IsString<TChar*>::value, bool>::type
containsKey(TChar* key) const {
return variantGetMember(getData(), detail::adaptString(key)) != 0;
return detail::VariantData::getMember(getData(),
detail::adaptString(key)) != 0;
}
protected:

View File

@ -176,7 +176,7 @@ struct VariantComparer : ComparerBase {
private:
template <typename TComparer>
CompareResult accept(TComparer& comparer) {
CompareResult reversedResult = variantAccept(rhs, comparer);
CompareResult reversedResult = VariantData::accept(rhs, comparer);
switch (reversedResult) {
case COMPARE_RESULT_GREATER:
return COMPARE_RESULT_LESS;
@ -199,12 +199,12 @@ struct Comparer<T, typename enable_if<is_convertible<
template <typename T>
CompareResult compare(ArduinoJson::JsonVariantConst lhs, const T& 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) {
VariantComparer comparer(rhs);
return variantAccept(lhs, comparer);
return VariantData::accept(lhs, comparer);
}
ARDUINOJSON_END_PRIVATE_NAMESPACE

View File

@ -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) {
auto array = isNull() ? &toArray() : asArray();
return detail::ArrayData::addElement(array, resources);
}
static VariantData* addElement(VariantData* var, ResourceManager* resources) {
if (!var)
return nullptr;
return var->addElement(resources);
}
bool asBoolean() const {
switch (type()) {
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 {
auto array = asArray();
if (!array)
@ -208,6 +230,10 @@ class VariantData {
return array->getElement(index);
}
static VariantData* getElement(const VariantData* var, size_t index) {
return var != 0 ? var->getElement(index) : 0;
}
template <typename TAdaptedString>
VariantData* getMember(TAdaptedString key) const {
auto object = asObject();
@ -216,6 +242,13 @@ class VariantData {
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) {
auto array = isNull() ? &toArray() : asArray();
if (!array)
@ -267,6 +300,12 @@ class VariantData {
return type() == VALUE_IS_NULL;
}
static bool isNull(const VariantData* var) {
if (!var)
return true;
return var->isNull();
}
bool isObject() const {
return (flags_ & VALUE_IS_OBJECT) != 0;
}
@ -307,6 +346,12 @@ class VariantData {
return maxChildNesting + 1;
}
static size_t nesting(const VariantData* var) {
if (!var)
return 0;
return var->nesting();
}
void operator=(const VariantData& src) {
content_ = src.content_;
flags_ = uint8_t((flags_ & OWNED_KEY_BIT) | (src.flags_ & ~OWNED_KEY_BIT));
@ -316,11 +361,26 @@ class VariantData {
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>
void removeMember(TAdaptedString key, ResourceManager* 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() {
flags_ = VALUE_IS_NULL;
}
@ -372,6 +432,12 @@ class VariantData {
setNull();
}
static void setNull(VariantData* var, ResourceManager* resources) {
if (!var)
return;
var->setNull(resources);
}
void setRawString(StringNode* s) {
ARDUINOJSON_ASSERT(s);
setType(VALUE_IS_RAW_STRING);
@ -388,6 +454,14 @@ class VariantData {
setNull();
}
template <typename T>
static void setRawString(VariantData* var, SerializedValue<T> value,
ResourceManager* resources) {
if (!var)
return;
var->setRawString(value, resources);
}
template <typename TAdaptedString>
void setString(TAdaptedString value, ResourceManager* resources) {
setNull(resources);
@ -405,6 +479,14 @@ class VariantData {
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) {
ARDUINOJSON_ASSERT(s);
setType(VALUE_IS_LINKED_STRING);
@ -421,6 +503,10 @@ class VariantData {
return isCollection() ? content_.asCollection.size() : 0;
}
static size_t size(const VariantData* var) {
return var != 0 ? var->size() : 0;
}
ArrayData& toArray() {
setType(VALUE_IS_ARRAY);
new (&content_.asArray) ArrayData();
@ -432,6 +518,12 @@ class VariantData {
return toArray();
}
static ArrayData* toArray(VariantData* var, ResourceManager* resources) {
if (!var)
return 0;
return &var->toArray(resources);
}
ObjectData& toObject() {
setType(VALUE_IS_OBJECT);
new (&content_.asObject) ObjectData();
@ -443,6 +535,12 @@ class VariantData {
return toObject();
}
static ObjectData* toObject(VariantData* var, ResourceManager* resources) {
if (!var)
return 0;
return &var->toObject(resources);
}
uint8_t type() const {
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

View File

@ -30,13 +30,13 @@ class VariantRefBase : public VariantTag {
// ⚠️ Doesn't release the memory associated with the previous value.
// https://arduinojson.org/v6/api/jsonvariant/clear/
FORCE_INLINE void clear() const {
variantSetNull(getOrCreateData(), getResourceManager());
VariantData::setNull(getOrCreateData(), getResourceManager());
}
// Returns true if the value is null or the reference is unbound.
// https://arduinojson.org/v6/api/jsonvariant/isnull/
FORCE_INLINE bool isNull() const {
return variantIsNull(getData());
return VariantData::isNull(getData());
}
// Returns true if the reference is unbound.
@ -112,7 +112,7 @@ class VariantRefBase : public VariantTag {
VariantData* data = getOrCreateData();
if (!data)
return;
variantSetNull(data, getResourceManager());
data->setNull(getResourceManager());
const VariantData* targetData = VariantAttorney::getData(target);
if (targetData)
*data = *targetData;
@ -139,7 +139,7 @@ class VariantRefBase : public VariantTag {
// Returns the size of the array or object.
// https://arduinojson.org/v6/api/jsonvariant/size/
FORCE_INLINE size_t size() const {
return variantSize(getData());
return VariantData::size(getData());
}
// 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.
// https://arduinojson.org/v6/api/jsonvariant/nesting/
FORCE_INLINE size_t nesting() const {
return variantNesting(getData());
return VariantData::nesting(getData());
}
// 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.
// https://arduinojson.org/v6/api/jsonvariant/remove/
FORCE_INLINE void remove(size_t index) const {
variantRemoveElement(getData(), index, getResourceManager());
VariantData::removeElement(getData(), index, getResourceManager());
}
// Removes a member of the object.
@ -187,7 +187,8 @@ class VariantRefBase : public VariantTag {
template <typename TChar>
FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(
TChar* key) const {
variantRemoveMember(getData(), adaptString(key), getResourceManager());
VariantData::removeMember(getData(), adaptString(key),
getResourceManager());
}
// Removes a member of the object.
@ -196,7 +197,8 @@ class VariantRefBase : public VariantTag {
template <typename TString>
FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(
const TString& key) const {
variantRemoveMember(getData(), adaptString(key), getResourceManager());
VariantData::removeMember(getData(), adaptString(key),
getResourceManager());
}
// Creates an array and appends it to the array.