JsonArray: replace ArrayData* member with VariantData*

This commit is contained in:
Benoit Blanchon
2025-06-15 12:23:02 +02:00
parent fe6de3a82b
commit b1a58f3c0c
3 changed files with 26 additions and 21 deletions

View File

@ -23,7 +23,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
JsonArray() : data_(0), resources_(0) {} JsonArray() : data_(0), resources_(0) {}
// INTERNAL USE ONLY // INTERNAL USE ONLY
JsonArray(detail::ArrayData* data, detail::ResourceManager* resources) JsonArray(detail::VariantData* data, detail::ResourceManager* resources)
: data_(data), resources_(resources) {} : data_(data), resources_(resources) {}
// Returns a JsonVariant pointing to the array. // Returns a JsonVariant pointing to the array.
@ -55,7 +55,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
template <typename T, detail::enable_if_t< template <typename T, detail::enable_if_t<
detail::is_same<T, JsonVariant>::value, int> = 0> detail::is_same<T, JsonVariant>::value, int> = 0>
JsonVariant add() const { JsonVariant add() const {
return JsonVariant(detail::ArrayData::addElement(data_, resources_), return JsonVariant(detail::VariantData::addElement(data_, resources_),
resources_); resources_);
} }
@ -63,7 +63,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// https://arduinojson.org/v7/api/jsonarray/add/ // https://arduinojson.org/v7/api/jsonarray/add/
template <typename T> template <typename T>
bool add(const T& value) const { bool add(const T& value) const {
return detail::ArrayData::addValue(data_, value, resources_); return detail::VariantData::addValue(data_, value, resources_);
} }
// Appends a value to the array. // Appends a value to the array.
@ -71,15 +71,16 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
template <typename T, template <typename T,
detail::enable_if_t<!detail::is_const<T>::value, int> = 0> detail::enable_if_t<!detail::is_const<T>::value, int> = 0>
bool add(T* value) const { bool add(T* value) const {
return detail::ArrayData::addValue(data_, value, resources_); return detail::VariantData::addValue(data_, value, resources_);
} }
// Returns an iterator to the first element of the array. // Returns an iterator to the first element of the array.
// https://arduinojson.org/v7/api/jsonarray/begin/ // https://arduinojson.org/v7/api/jsonarray/begin/
iterator begin() const { iterator begin() const {
if (!data_) auto array = detail::VariantData::asArray(data_);
if (!array)
return iterator(); return iterator();
return iterator(data_->createIterator(resources_), resources_); return iterator(array->createIterator(resources_), resources_);
} }
// Returns an iterator following the last element of the array. // Returns an iterator following the last element of the array.
@ -106,13 +107,14 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// Removes the element at the specified iterator. // Removes the element at the specified iterator.
// https://arduinojson.org/v7/api/jsonarray/remove/ // https://arduinojson.org/v7/api/jsonarray/remove/
void remove(iterator it) const { void remove(iterator it) const {
detail::ArrayData::remove(data_, it.iterator_, resources_); detail::ArrayData::remove(detail::VariantData::asArray(data_), it.iterator_,
resources_);
} }
// Removes the element at the specified index. // Removes the element at the specified index.
// https://arduinojson.org/v7/api/jsonarray/remove/ // https://arduinojson.org/v7/api/jsonarray/remove/
void remove(size_t index) const { void remove(size_t index) const {
detail::ArrayData::removeElement(data_, index, resources_); detail::VariantData::removeElement(data_, index, resources_);
} }
// Removes the element at the specified index. // Removes the element at the specified index.
@ -127,7 +129,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// Removes all the elements of the array. // Removes all the elements of the array.
// https://arduinojson.org/v7/api/jsonarray/clear/ // https://arduinojson.org/v7/api/jsonarray/clear/
void clear() const { void clear() const {
detail::ArrayData::clear(data_, resources_); detail::ArrayData::clear(detail::VariantData::asArray(data_), resources_);
} }
// Gets or sets the element at the specified index. // Gets or sets the element at the specified index.
@ -150,25 +152,25 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
} }
operator JsonVariantConst() const { operator JsonVariantConst() const {
return JsonVariantConst(collectionToVariant(data_), resources_); return JsonVariantConst(data_, resources_);
} }
// Returns true if the reference is unbound. // Returns true if the reference is unbound.
// https://arduinojson.org/v7/api/jsonarray/isnull/ // https://arduinojson.org/v7/api/jsonarray/isnull/
bool isNull() const { bool isNull() const {
return data_ == 0; return !data_ || !data_->isArray();
} }
// Returns true if the reference is bound. // Returns true if the reference is bound.
// https://arduinojson.org/v7/api/jsonarray/isnull/ // https://arduinojson.org/v7/api/jsonarray/isnull/
operator bool() const { operator bool() const {
return data_ != 0; return !isNull();
} }
// Returns the depth (nesting level) of the array. // Returns the depth (nesting level) of the array.
// https://arduinojson.org/v7/api/jsonarray/nesting/ // https://arduinojson.org/v7/api/jsonarray/nesting/
size_t nesting() const { size_t nesting() const {
return detail::VariantData::nesting(collectionToVariant(data_), resources_); return detail::VariantData::nesting(data_, resources_);
} }
// Returns the number of elements in the array. // Returns the number of elements in the array.
@ -205,14 +207,14 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
} }
detail::VariantData* getData() const { detail::VariantData* getData() const {
return collectionToVariant(data_); return data_;
} }
detail::VariantData* getOrCreateData() const { detail::VariantData* getOrCreateData() const {
return collectionToVariant(data_); return data_;
} }
detail::ArrayData* data_; detail::VariantData* data_;
detail::ResourceManager* resources_; detail::ResourceManager* resources_;
}; };

View File

@ -348,9 +348,7 @@ struct Converter<JsonArray> : private detail::VariantAttorney {
} }
static JsonArray fromJson(JsonVariant src) { static JsonArray fromJson(JsonVariant src) {
auto data = getData(src); return JsonArray(getData(src), getResourceManager(src));
auto resources = getResourceManager(src);
return JsonArray(data != 0 ? data->asArray() : 0, resources);
} }
static bool checkJson(JsonVariant src) { static bool checkJson(JsonVariant src) {

View File

@ -182,6 +182,10 @@ class VariantData {
return const_cast<VariantData*>(this)->asArray(); return const_cast<VariantData*>(this)->asArray();
} }
static ArrayData* asArray(VariantData* var) {
return var ? var->asArray() : 0;
}
static const ArrayData* asArray(const VariantData* var) { static const ArrayData* asArray(const VariantData* var) {
return var ? var->asArray() : 0; return var ? var->asArray() : 0;
} }
@ -576,11 +580,12 @@ class VariantData {
return content_.asArray; return content_.asArray;
} }
static ArrayData* toArray(VariantData* var, ResourceManager* resources) { static VariantData* toArray(VariantData* var, ResourceManager* resources) {
if (!var) if (!var)
return 0; return 0;
var->clear(resources); var->clear(resources);
return &var->toArray(); var->toArray();
return var;
} }
ObjectData& toObject() { ObjectData& toObject() {