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) {}
JsonVariant operator*() {
return JsonVariant(iterator_.data(), resources_);
return JsonVariant(iterator_.value(resources_));
}
Ptr<JsonVariant> 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<JsonVariantConst> operator->() {
return operator*();

View File

@ -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;
}

View File

@ -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_;
}

View File

@ -26,8 +26,7 @@ class PrettyJsonSerializer : public JsonSerializer<TWriter> {
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<TWriter> {
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(": ");

View File

@ -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));
}
}

View File

@ -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;
}