Convert CollectionIterator to GoF style

This commit is contained in:
Benoit Blanchon
2023-07-03 09:40:38 +02:00
parent 0f511b873d
commit dae0182914
14 changed files with 51 additions and 55 deletions

View File

@ -10,9 +10,9 @@
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
inline ArrayData::iterator ArrayData::at(size_t index) const {
auto it = begin();
while (it && index) {
++it;
auto it = createIterator();
while (!it.done() && index) {
it.next();
--index;
}
return it;
@ -30,7 +30,7 @@ inline bool ArrayData::copyFrom(const ArrayData& src,
ResourceManager* resources) {
clear(resources);
for (auto it = src.begin(); it; ++it) {
for (auto it = src.createIterator(); !it.done(); it.next()) {
auto var = addElement(resources);
if (!var)
return false;
@ -42,12 +42,12 @@ inline bool ArrayData::copyFrom(const ArrayData& src,
inline VariantData* ArrayData::getOrAddElement(size_t index,
ResourceManager* resources) {
auto it = begin();
while (it && index > 0) {
++it;
auto it = createIterator();
while (!it.done() && index > 0) {
it.next();
index--;
}
if (!it)
if (it.done())
index++;
VariantData* element = it.data();
while (index > 0) {

View File

@ -68,7 +68,7 @@ class JsonArray : public detail::VariantOperators<JsonArray> {
FORCE_INLINE iterator begin() const {
if (!data_)
return iterator();
return iterator(data_->begin(), resources_);
return iterator(data_->createIterator(), resources_);
}
// Returns an iterator following the last element of the array.

View File

@ -26,7 +26,7 @@ class JsonArrayConst : public detail::VariantOperators<JsonArrayConst> {
FORCE_INLINE iterator begin() const {
if (!data_)
return iterator();
return iterator(data_->begin(), resources_);
return iterator(data_->createIterator(), resources_);
}
// Returns an iterator to the element following the last element of the array.

View File

@ -51,7 +51,7 @@ class JsonArrayIterator {
}
JsonArrayIterator& operator++() {
++iterator_;
iterator_.next();
return *this;
}
@ -65,7 +65,8 @@ class JsonArrayConstIterator {
public:
JsonArrayConstIterator() {}
explicit JsonArrayConstIterator(detail::ArrayData::iterator iterator, const detail::ResourceManager* resources)
explicit JsonArrayConstIterator(detail::ArrayData::iterator iterator,
const detail::ResourceManager* resources)
: iterator_(iterator), resources_(resources) {}
JsonVariantConst operator*() const {
@ -84,7 +85,7 @@ class JsonArrayConstIterator {
}
JsonArrayConstIterator& operator++() {
++iterator_;
iterator_.next();
return *this;
}

View File

@ -20,10 +20,10 @@ class CollectionIterator {
public:
CollectionIterator() : slot_(nullptr) {}
CollectionIterator& operator++();
void next();
operator bool() const {
return slot_ != nullptr;
bool done() const {
return slot_ == nullptr;
}
bool operator==(const CollectionIterator& other) const {
@ -80,14 +80,10 @@ class CollectionData {
using iterator = CollectionIterator;
iterator begin() const {
iterator createIterator() const {
return iterator(head_);
}
iterator end() const {
return iterator(nullptr);
}
size_t memoryUsage() const;
size_t size() const;
size_t nesting() const;

View File

@ -22,10 +22,9 @@ inline bool CollectionIterator::ownsKey() const {
return slot_->ownsKey();
}
inline CollectionIterator& CollectionIterator::operator++() {
inline void CollectionIterator::next() {
ARDUINOJSON_ASSERT(slot_ != nullptr);
slot_ = slot_->next();
return *this;
}
inline void CollectionData::addSlot(VariantSlot* slot) {
@ -59,7 +58,7 @@ inline VariantSlot* CollectionData::getPreviousSlot(VariantSlot* target) const {
}
inline void CollectionData::remove(iterator it, ResourceManager* resources) {
if (!it)
if (it.done())
return;
auto curr = it.slot_;
auto prev = getPreviousSlot(curr);

View File

@ -21,13 +21,13 @@ class JsonSerializer : public Visitor<size_t> {
FORCE_INLINE size_t visitArray(const ArrayData& array) {
write('[');
auto it = array.begin();
auto it = array.createIterator();
while (it) {
while (!it.done()) {
it->accept(*this);
++it;
if (!it)
it.next();
if (it.done())
break;
write(',');
@ -40,15 +40,15 @@ class JsonSerializer : public Visitor<size_t> {
size_t visitObject(const ObjectData& object) {
write('{');
auto it = object.begin();
auto it = object.createIterator();
while (it) {
while (!it.done()) {
formatter_.writeString(it.key());
write(':');
it->accept(*this);
++it;
if (!it)
it.next();
if (it.done())
break;
write(',');

View File

@ -19,16 +19,16 @@ class PrettyJsonSerializer : public JsonSerializer<TWriter> {
PrettyJsonSerializer(TWriter writer) : base(writer), nesting_(0) {}
size_t visitArray(const ArrayData& array) {
auto it = array.begin();
if (it) {
auto it = array.createIterator();
if (!it.done()) {
base::write("[\r\n");
nesting_++;
while (it) {
while (!it.done()) {
indent();
it->accept(*this);
++it;
base::write(it ? ",\r\n" : "\r\n");
it.next();
base::write(it.done() ? "\r\n" : ",\r\n");
}
nesting_--;
indent();
@ -40,18 +40,18 @@ class PrettyJsonSerializer : public JsonSerializer<TWriter> {
}
size_t visitObject(const ObjectData& object) {
auto it = object.begin();
if (it) {
auto it = object.createIterator();
if (!it.done()) {
base::write("{\r\n");
nesting_++;
while (it) {
while (!it.done()) {
indent();
base::visitString(it.key());
base::write(": ");
it->accept(*this);
++it;
base::write(it ? ",\r\n" : "\r\n");
it.next();
base::write(it.done() ? "\r\n" : ",\r\n");
}
nesting_--;
indent();

View File

@ -55,7 +55,7 @@ class MsgPackSerializer : public Visitor<size_t> {
writeByte(0xDD);
writeInteger(uint32_t(n));
}
for (auto it = array.begin(); it; ++it) {
for (auto it = array.createIterator(); !it.done(); it.next()) {
it->accept(*this);
}
return bytesWritten();
@ -72,7 +72,7 @@ class MsgPackSerializer : public Visitor<size_t> {
writeByte(0xDF);
writeInteger(uint32_t(n));
}
for (auto it = object.begin(); it; ++it) {
for (auto it = object.createIterator(); !it.done(); it.next()) {
visitString(it.key());
it->accept(*this);
}

View File

@ -76,7 +76,7 @@ class JsonObject : public detail::VariantOperators<JsonObject> {
FORCE_INLINE iterator begin() const {
if (!data_)
return iterator();
return iterator(data_->begin(), resources_);
return iterator(data_->createIterator(), resources_);
}
// Returns an iterator following the last key-value pair of the object.

View File

@ -65,7 +65,7 @@ class JsonObjectConst : public detail::VariantOperators<JsonObjectConst> {
FORCE_INLINE iterator begin() const {
if (!data_)
return iterator();
return iterator(data_->begin(), resources_);
return iterator(data_->createIterator(), resources_);
}
// Returns an iterator following the last key-value pair of the object.

View File

@ -35,7 +35,7 @@ class JsonObjectIterator {
}
JsonObjectIterator& operator++() {
++iterator_;
iterator_.next();
return *this;
}
@ -70,7 +70,7 @@ class JsonObjectConstIterator {
}
JsonObjectConstIterator& operator++() {
++iterator_;
iterator_.next();
return *this;
}

View File

@ -21,7 +21,7 @@ class JsonPair {
// Returns the key.
JsonString key() const {
if (iterator_)
if (!iterator_.done())
return JsonString(iterator_.key(), iterator_.ownsKey()
? JsonString::Copied
: JsonString::Linked);
@ -49,7 +49,7 @@ class JsonPairConst {
// Returns the key.
JsonString key() const {
if (iterator_)
if (!iterator_.done())
return JsonString(iterator_.key(), iterator_.ownsKey()
? JsonString::Copied
: JsonString::Linked);

View File

@ -44,7 +44,7 @@ inline bool ObjectData::copyFrom(const ObjectData& src,
ResourceManager* resources) {
clear(resources);
for (auto it = src.begin(); it; ++it) {
for (auto it = src.createIterator(); !it.done(); it.next()) {
ARDUINOJSON_ASSERT(it.key() != 0);
JsonString key(it.key(),
it.ownsKey() ? JsonString::Copied : JsonString::Linked);
@ -66,7 +66,7 @@ template <typename TAdaptedString>
VariantData* ObjectData::getOrAddMember(TAdaptedString key,
ResourceManager* resources) {
auto it = findKey(key);
if (it)
if (!it.done())
return it.data();
return addMember(key, resources);
}
@ -74,12 +74,12 @@ VariantData* ObjectData::getOrAddMember(TAdaptedString key,
template <typename TAdaptedString>
inline ObjectData::iterator ObjectData::findKey(TAdaptedString key) const {
if (key.isNull())
return end();
for (auto it = begin(); it; ++it) {
return iterator();
for (auto it = createIterator(); !it.done(); it.next()) {
if (stringEquals(key, adaptString(it.key())))
return it;
}
return end();
return iterator();
}
template <typename TAdaptedString>