CollectionIterator: add value() member function

This commit is contained in:
Benoit Blanchon
2025-07-10 18:44:59 +02:00
parent ec53525452
commit dca5ba481f
6 changed files with 19 additions and 30 deletions

View File

@ -35,7 +35,7 @@ class JsonArrayIterator {
: iterator_(iterator), resources_(resources) {} : iterator_(iterator), resources_(resources) {}
JsonVariant operator*() { JsonVariant operator*() {
return JsonVariant(iterator_.data(), resources_); return JsonVariant(iterator_.value(resources_));
} }
Ptr<JsonVariant> operator->() { Ptr<JsonVariant> operator->() {
return operator*(); return operator*();
@ -69,7 +69,7 @@ class JsonArrayConstIterator {
: iterator_(iterator), resources_(resources) {} : iterator_(iterator), resources_(resources) {}
JsonVariantConst operator*() const { JsonVariantConst operator*() const {
return JsonVariantConst(iterator_.data(), resources_); return JsonVariantConst(iterator_.value(resources_));
} }
Ptr<JsonVariantConst> operator->() { Ptr<JsonVariantConst> operator->() {
return operator*(); return operator*();

View File

@ -19,6 +19,11 @@ inline void CollectionIterator::next(const ResourceManager* resources) {
currentId_ = nextId; currentId_ = nextId;
} }
inline VariantImpl CollectionIterator::value(ResourceManager* resources) const {
ARDUINOJSON_ASSERT(slot_ != nullptr);
return VariantImpl(slot_, resources);
}
inline VariantImpl::iterator VariantImpl::createIterator() const { inline VariantImpl::iterator VariantImpl::createIterator() const {
if (!data_ || !data_->isCollection()) if (!data_ || !data_->isCollection())
return iterator(); return iterator();
@ -107,8 +112,7 @@ inline size_t VariantImpl::nesting() const {
return 0; return 0;
size_t maxChildNesting = 0; size_t maxChildNesting = 0;
for (auto it = createIterator(); !it.done(); it.next(resources_)) { for (auto it = createIterator(); !it.done(); it.next(resources_)) {
VariantImpl variant(it.data(), resources_); auto childNesting = it.value(resources_).nesting();
size_t childNesting = variant.nesting();
if (childNesting > maxChildNesting) if (childNesting > maxChildNesting)
maxChildNesting = childNesting; maxChildNesting = childNesting;
} }

View File

@ -13,6 +13,7 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
struct VariantData; struct VariantData;
class ResourceManager; class ResourceManager;
class VariantImpl;
class CollectionIterator { class CollectionIterator {
friend class VariantImpl; friend class VariantImpl;
@ -22,6 +23,8 @@ class CollectionIterator {
void next(const ResourceManager* resources); void next(const ResourceManager* resources);
VariantImpl value(ResourceManager* resources) const;
bool done() const { bool done() const {
return slot_ == nullptr; return slot_ == nullptr;
} }
@ -34,21 +37,6 @@ class CollectionIterator {
return slot_ != other.slot_; 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() { VariantData* data() {
return slot_; return slot_;
} }

View File

@ -26,8 +26,7 @@ class PrettyJsonSerializer : public JsonSerializer<TWriter> {
nesting_++; nesting_++;
while (!it.done()) { while (!it.done()) {
indent(); indent();
VariantImpl(it.data(), base::resources_).accept(*this); it.value(base::resources_).accept(*this);
it.next(base::resources_); it.next(base::resources_);
base::write(it.done() ? "\r\n" : ",\r\n"); base::write(it.done() ? "\r\n" : ",\r\n");
} }
@ -49,7 +48,7 @@ class PrettyJsonSerializer : public JsonSerializer<TWriter> {
while (!it.done()) { while (!it.done()) {
if (isKey) if (isKey)
indent(); indent();
VariantImpl(it.data(), base::resources_).accept(*this); it.value(base::resources_).accept(*this);
it.next(base::resources_); it.next(base::resources_);
if (isKey) if (isKey)
base::write(": "); base::write(": ");

View File

@ -18,10 +18,9 @@ class JsonPair {
JsonPair(detail::VariantImpl::iterator iterator, JsonPair(detail::VariantImpl::iterator iterator,
detail::ResourceManager* resources) { detail::ResourceManager* resources) {
if (!iterator.done()) { if (!iterator.done()) {
detail::VariantImpl variant(iterator.data(), resources); key_ = iterator.value(resources).asString();
key_ = variant.asString();
iterator.next(resources); iterator.next(resources);
value_ = JsonVariant(iterator.data(), resources); value_ = JsonVariant(iterator.value(resources));
} }
} }
@ -47,10 +46,9 @@ class JsonPairConst {
JsonPairConst(detail::VariantImpl::iterator iterator, JsonPairConst(detail::VariantImpl::iterator iterator,
detail::ResourceManager* resources) { detail::ResourceManager* resources) {
if (!iterator.done()) { if (!iterator.done()) {
detail::VariantImpl variant(iterator.data(), resources); key_ = iterator.value(resources).asString();
key_ = variant.asString();
iterator.next(resources); iterator.next(resources);
value_ = JsonVariantConst(iterator.data(), resources); value_ = JsonVariantConst(iterator.value(resources));
} }
} }

View File

@ -34,8 +34,8 @@ inline VariantImpl::iterator VariantImpl::findKey(TAdaptedString key) const {
return iterator(); return iterator();
bool isKey = true; bool isKey = true;
for (auto it = createIterator(); !it.done(); it.next(resources_)) { for (auto it = createIterator(); !it.done(); it.next(resources_)) {
VariantImpl variant(it.data(), resources_); if (isKey &&
if (isKey && stringEquals(key, adaptString(variant.asString()))) stringEquals(key, adaptString(it.value(resources_).asString())))
return it; return it;
isKey = !isKey; isKey = !isKey;
} }