From 56b269bea848cdc9aa5dbf6742fade580eda6609 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Sun, 15 Jun 2025 12:32:37 +0200 Subject: [PATCH] JsonArrayConst: replace `ArrayData*` member with `VariantData*` --- src/ArduinoJson/Array/JsonArray.hpp | 2 +- src/ArduinoJson/Array/JsonArrayConst.hpp | 17 +++++++++-------- src/ArduinoJson/Variant/ConverterImpl.hpp | 4 +--- src/ArduinoJson/Variant/JsonVariantVisitor.hpp | 3 ++- src/ArduinoJson/Variant/VariantData.hpp | 4 ++++ 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/ArduinoJson/Array/JsonArray.hpp b/src/ArduinoJson/Array/JsonArray.hpp index 436793ad..bb5a04f9 100644 --- a/src/ArduinoJson/Array/JsonArray.hpp +++ b/src/ArduinoJson/Array/JsonArray.hpp @@ -37,7 +37,7 @@ class JsonArray : public detail::VariantOperators { // 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. diff --git a/src/ArduinoJson/Array/JsonArrayConst.hpp b/src/ArduinoJson/Array/JsonArrayConst.hpp index b4c138a8..c33d8979 100644 --- a/src/ArduinoJson/Array/JsonArrayConst.hpp +++ b/src/ArduinoJson/Array/JsonArrayConst.hpp @@ -24,9 +24,10 @@ class JsonArrayConst : public detail::VariantOperators { // 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() : 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 { detail::enable_if_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 { // 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 { private: const detail::VariantData* getData() const { - return collectionToVariant(data_); + return data_; } - const detail::ArrayData* data_; + const detail::VariantData* data_; const detail::ResourceManager* resources_; }; diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index 627fb6b0..20c8f770 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -329,9 +329,7 @@ struct Converter : 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) { diff --git a/src/ArduinoJson/Variant/JsonVariantVisitor.hpp b/src/ArduinoJson/Variant/JsonVariantVisitor.hpp index 28f99ed5..65185568 100644 --- a/src/ArduinoJson/Variant/JsonVariantVisitor.hpp +++ b/src/ArduinoJson/Variant/JsonVariantVisitor.hpp @@ -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) { diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 71f8ad6f..7c82ed90 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -182,6 +182,10 @@ class VariantData { return const_cast(this)->asArray(); } + static const ArrayData* asArray(const VariantData* var) { + return var ? var->asArray() : 0; + } + CollectionData* asCollection() { return isCollection() ? &content_.asCollection : 0; }