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. // Returns a read-only reference to the array.
// https://arduinojson.org/v7/api/jsonarrayconst/ // https://arduinojson.org/v7/api/jsonarrayconst/
operator JsonArrayConst() const { operator JsonArrayConst() const {
return JsonArrayConst(data_, resources_); return JsonArrayConst(getData(), resources_);
} }
// Appends a new (empty) element to the array. // 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. // Returns an iterator to the first element of the array.
// https://arduinojson.org/v7/api/jsonarrayconst/begin/ // https://arduinojson.org/v7/api/jsonarrayconst/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 to the element following the last element of the array. // 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) {} JsonArrayConst() : data_(0), resources_(0) {}
// INTERNAL USE ONLY // INTERNAL USE ONLY
JsonArrayConst(const detail::ArrayData* data, JsonArrayConst(const detail::VariantData* data,
const detail::ResourceManager* resources) const detail::ResourceManager* resources)
: data_(data), resources_(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> detail::enable_if_t<detail::is_integral<T>::value, int> = 0>
JsonVariantConst operator[](T index) const { JsonVariantConst operator[](T index) const {
return JsonVariantConst( return JsonVariantConst(
detail::ArrayData::getElement(data_, size_t(index), resources_), detail::VariantData::getElement(data_, size_t(index), resources_),
resources_); resources_);
} }
@ -71,13 +72,13 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
// Returns true if the reference is unbound. // Returns true if the reference is unbound.
// https://arduinojson.org/v7/api/jsonarrayconst/isnull/ // https://arduinojson.org/v7/api/jsonarrayconst/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/jsonarrayconst/isnull/ // https://arduinojson.org/v7/api/jsonarrayconst/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.
@ -100,10 +101,10 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
private: private:
const detail::VariantData* getData() const { const detail::VariantData* getData() const {
return collectionToVariant(data_); return data_;
} }
const detail::ArrayData* data_; const detail::VariantData* data_;
const detail::ResourceManager* resources_; const detail::ResourceManager* resources_;
}; };

View File

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

View File

@ -30,7 +30,8 @@ class VisitorAdapter {
: visitor_(&visitor), resources_(resources) {} : visitor_(&visitor), resources_(resources) {}
result_type visit(const ArrayData& value) { 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) { result_type visit(const ObjectData& value) {

View File

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