From dca5ba481fc31f3042cd410b2bc6e9946813a987 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 10 Jul 2025 18:44:59 +0200 Subject: [PATCH] CollectionIterator: add `value()` member function --- src/ArduinoJson/Array/JsonArrayIterator.hpp | 4 ++-- src/ArduinoJson/Collection/CollectionImpl.hpp | 8 ++++++-- .../Collection/CollectionIterator.hpp | 18 +++--------------- src/ArduinoJson/Json/PrettyJsonSerializer.hpp | 5 ++--- src/ArduinoJson/Object/JsonPair.hpp | 10 ++++------ src/ArduinoJson/Object/ObjectImpl.hpp | 4 ++-- 6 files changed, 19 insertions(+), 30 deletions(-) diff --git a/src/ArduinoJson/Array/JsonArrayIterator.hpp b/src/ArduinoJson/Array/JsonArrayIterator.hpp index b6aac521..038a60ba 100644 --- a/src/ArduinoJson/Array/JsonArrayIterator.hpp +++ b/src/ArduinoJson/Array/JsonArrayIterator.hpp @@ -35,7 +35,7 @@ class JsonArrayIterator { : iterator_(iterator), resources_(resources) {} JsonVariant operator*() { - return JsonVariant(iterator_.data(), resources_); + return JsonVariant(iterator_.value(resources_)); } Ptr operator->() { return operator*(); @@ -69,7 +69,7 @@ class JsonArrayConstIterator { : iterator_(iterator), resources_(resources) {} JsonVariantConst operator*() const { - return JsonVariantConst(iterator_.data(), resources_); + return JsonVariantConst(iterator_.value(resources_)); } Ptr operator->() { return operator*(); diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index a335d80d..5d131921 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -19,6 +19,11 @@ inline void CollectionIterator::next(const ResourceManager* resources) { currentId_ = nextId; } +inline VariantImpl CollectionIterator::value(ResourceManager* resources) const { + ARDUINOJSON_ASSERT(slot_ != nullptr); + return VariantImpl(slot_, resources); +} + inline VariantImpl::iterator VariantImpl::createIterator() const { if (!data_ || !data_->isCollection()) return iterator(); @@ -107,8 +112,7 @@ inline size_t VariantImpl::nesting() const { return 0; size_t maxChildNesting = 0; for (auto it = createIterator(); !it.done(); it.next(resources_)) { - VariantImpl variant(it.data(), resources_); - size_t childNesting = variant.nesting(); + auto childNesting = it.value(resources_).nesting(); if (childNesting > maxChildNesting) maxChildNesting = childNesting; } diff --git a/src/ArduinoJson/Collection/CollectionIterator.hpp b/src/ArduinoJson/Collection/CollectionIterator.hpp index d8c1403b..d331f933 100644 --- a/src/ArduinoJson/Collection/CollectionIterator.hpp +++ b/src/ArduinoJson/Collection/CollectionIterator.hpp @@ -13,6 +13,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE struct VariantData; class ResourceManager; +class VariantImpl; class CollectionIterator { friend class VariantImpl; @@ -22,6 +23,8 @@ class CollectionIterator { void next(const ResourceManager* resources); + VariantImpl value(ResourceManager* resources) const; + bool done() const { return slot_ == nullptr; } @@ -34,21 +37,6 @@ class CollectionIterator { return slot_ != other.slot_; } - VariantData* operator->() { - ARDUINOJSON_ASSERT(slot_ != nullptr); - return data(); - } - - VariantData& operator*() { - ARDUINOJSON_ASSERT(slot_ != nullptr); - return *data(); - } - - const VariantData& operator*() const { - ARDUINOJSON_ASSERT(slot_ != nullptr); - return *data(); - } - VariantData* data() { return slot_; } diff --git a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp index f8d01792..f3e5a6a3 100644 --- a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp +++ b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp @@ -26,8 +26,7 @@ class PrettyJsonSerializer : public JsonSerializer { nesting_++; while (!it.done()) { indent(); - VariantImpl(it.data(), base::resources_).accept(*this); - + it.value(base::resources_).accept(*this); it.next(base::resources_); base::write(it.done() ? "\r\n" : ",\r\n"); } @@ -49,7 +48,7 @@ class PrettyJsonSerializer : public JsonSerializer { while (!it.done()) { if (isKey) indent(); - VariantImpl(it.data(), base::resources_).accept(*this); + it.value(base::resources_).accept(*this); it.next(base::resources_); if (isKey) base::write(": "); diff --git a/src/ArduinoJson/Object/JsonPair.hpp b/src/ArduinoJson/Object/JsonPair.hpp index ee310259..f72e2cc7 100644 --- a/src/ArduinoJson/Object/JsonPair.hpp +++ b/src/ArduinoJson/Object/JsonPair.hpp @@ -18,10 +18,9 @@ class JsonPair { JsonPair(detail::VariantImpl::iterator iterator, detail::ResourceManager* resources) { if (!iterator.done()) { - detail::VariantImpl variant(iterator.data(), resources); - key_ = variant.asString(); + key_ = iterator.value(resources).asString(); iterator.next(resources); - value_ = JsonVariant(iterator.data(), resources); + value_ = JsonVariant(iterator.value(resources)); } } @@ -47,10 +46,9 @@ class JsonPairConst { JsonPairConst(detail::VariantImpl::iterator iterator, detail::ResourceManager* resources) { if (!iterator.done()) { - detail::VariantImpl variant(iterator.data(), resources); - key_ = variant.asString(); + key_ = iterator.value(resources).asString(); iterator.next(resources); - value_ = JsonVariantConst(iterator.data(), resources); + value_ = JsonVariantConst(iterator.value(resources)); } } diff --git a/src/ArduinoJson/Object/ObjectImpl.hpp b/src/ArduinoJson/Object/ObjectImpl.hpp index eceea9bc..d4752f15 100644 --- a/src/ArduinoJson/Object/ObjectImpl.hpp +++ b/src/ArduinoJson/Object/ObjectImpl.hpp @@ -34,8 +34,8 @@ inline VariantImpl::iterator VariantImpl::findKey(TAdaptedString key) const { return iterator(); bool isKey = true; for (auto it = createIterator(); !it.done(); it.next(resources_)) { - VariantImpl variant(it.data(), resources_); - if (isKey && stringEquals(key, adaptString(variant.asString()))) + if (isKey && + stringEquals(key, adaptString(it.value(resources_).asString()))) return it; isKey = !isKey; }