JsonArrayConst: replace ArrayData* member with VariantData*

This commit is contained in:
Benoit Blanchon
2025-06-15 12:32:37 +02:00
parent 1e0bbd518c
commit 4457cb7cc5
5 changed files with 17 additions and 13 deletions

View File

@ -37,7 +37,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
// Returns a read-only reference to the array.
// https://arduinojson.org/v7/api/jsonarrayconst/
operator JsonArrayConst() const {
return JsonArrayConst(data_, resources_);
return JsonArrayConst(getData(), resources_);
}
// Appends a new (empty) element to the array.

View File

@ -24,9 +24,10 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
// Returns an iterator to the first element of the array.
// https://arduinojson.org/v7/api/jsonarrayconst/begin/
iterator begin() const {
if (!data_)
auto array = detail::VariantData::asArray(data_);
if (!array)
return iterator();
return iterator(data_->createIterator(resources_), resources_);
return iterator(array->createIterator(resources_), resources_);
}
// Returns an iterator to the element following the last element of the array.
@ -39,7 +40,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
JsonArrayConst() : data_(0), resources_(0) {}
// INTERNAL USE ONLY
JsonArrayConst(const detail::ArrayData* data,
JsonArrayConst(const detail::VariantData* data,
const detail::ResourceManager* resources)
: data_(data), resources_(resources) {}
@ -49,7 +50,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
detail::enable_if_t<detail::is_integral<T>::value, int> = 0>
JsonVariantConst operator[](T index) const {
return JsonVariantConst(
detail::ArrayData::getElement(data_, size_t(index), resources_),
detail::VariantData::getElement(data_, size_t(index), resources_),
resources_);
}
@ -71,13 +72,13 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
// Returns true if the reference is unbound.
// https://arduinojson.org/v7/api/jsonarrayconst/isnull/
bool isNull() const {
return data_ == 0;
return !data_ || !data_->isArray();
}
// Returns true if the reference is bound.
// https://arduinojson.org/v7/api/jsonarrayconst/isnull/
operator bool() const {
return data_ != 0;
return !isNull();
}
// Returns the depth (nesting level) of the array.
@ -100,10 +101,10 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
private:
const detail::VariantData* getData() const {
return collectionToVariant(data_);
return data_;
}
const detail::ArrayData* data_;
const detail::VariantData* data_;
const detail::ResourceManager* resources_;
};

View File

@ -329,9 +329,7 @@ struct Converter<JsonArrayConst> : private detail::VariantAttorney {
}
static JsonArrayConst fromJson(JsonVariantConst src) {
auto data = getData(src);
auto array = data ? data->asArray() : nullptr;
return JsonArrayConst(array, getResourceManager(src));
return JsonArrayConst(getData(src), getResourceManager(src));
}
static bool checkJson(JsonVariantConst src) {

View File

@ -30,7 +30,8 @@ class VisitorAdapter {
: visitor_(&visitor), resources_(resources) {}
result_type visit(const ArrayData& value) {
return visitor_->visit(JsonArrayConst(&value, resources_));
return visitor_->visit(
JsonArrayConst(collectionToVariant(&value), resources_));
}
result_type visit(const ObjectData& value) {

View File

@ -182,6 +182,10 @@ class VariantData {
return const_cast<VariantData*>(this)->asArray();
}
static const ArrayData* asArray(const VariantData* var) {
return var ? var->asArray() : 0;
}
CollectionData* asCollection() {
return isCollection() ? &content_.asCollection : 0;
}