From dae0182914b616885b650ec9b09109dfdd3fa8ba Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 3 Jul 2023 09:40:38 +0200 Subject: [PATCH] Convert `CollectionIterator` to GoF style --- src/ArduinoJson/Array/ArrayImpl.hpp | 16 +++++++-------- src/ArduinoJson/Array/JsonArray.hpp | 2 +- src/ArduinoJson/Array/JsonArrayConst.hpp | 2 +- src/ArduinoJson/Array/JsonArrayIterator.hpp | 7 ++++--- src/ArduinoJson/Collection/CollectionData.hpp | 12 ++++------- src/ArduinoJson/Collection/CollectionImpl.hpp | 5 ++--- src/ArduinoJson/Json/JsonSerializer.hpp | 16 +++++++-------- src/ArduinoJson/Json/PrettyJsonSerializer.hpp | 20 +++++++++---------- src/ArduinoJson/MsgPack/MsgPackSerializer.hpp | 4 ++-- src/ArduinoJson/Object/JsonObject.hpp | 2 +- src/ArduinoJson/Object/JsonObjectConst.hpp | 2 +- src/ArduinoJson/Object/JsonObjectIterator.hpp | 4 ++-- src/ArduinoJson/Object/JsonPair.hpp | 4 ++-- src/ArduinoJson/Object/ObjectImpl.hpp | 10 +++++----- 14 files changed, 51 insertions(+), 55 deletions(-) diff --git a/src/ArduinoJson/Array/ArrayImpl.hpp b/src/ArduinoJson/Array/ArrayImpl.hpp index bc615e04..6c3d6b24 100644 --- a/src/ArduinoJson/Array/ArrayImpl.hpp +++ b/src/ArduinoJson/Array/ArrayImpl.hpp @@ -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) { diff --git a/src/ArduinoJson/Array/JsonArray.hpp b/src/ArduinoJson/Array/JsonArray.hpp index dbc4b039..766c1531 100644 --- a/src/ArduinoJson/Array/JsonArray.hpp +++ b/src/ArduinoJson/Array/JsonArray.hpp @@ -68,7 +68,7 @@ class JsonArray : public detail::VariantOperators { 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. diff --git a/src/ArduinoJson/Array/JsonArrayConst.hpp b/src/ArduinoJson/Array/JsonArrayConst.hpp index c8e78e7a..6c039d0f 100644 --- a/src/ArduinoJson/Array/JsonArrayConst.hpp +++ b/src/ArduinoJson/Array/JsonArrayConst.hpp @@ -26,7 +26,7 @@ class JsonArrayConst : public detail::VariantOperators { 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. diff --git a/src/ArduinoJson/Array/JsonArrayIterator.hpp b/src/ArduinoJson/Array/JsonArrayIterator.hpp index 81622b47..9f6635d0 100644 --- a/src/ArduinoJson/Array/JsonArrayIterator.hpp +++ b/src/ArduinoJson/Array/JsonArrayIterator.hpp @@ -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; } diff --git a/src/ArduinoJson/Collection/CollectionData.hpp b/src/ArduinoJson/Collection/CollectionData.hpp index 6aa71a06..cb61bfce 100644 --- a/src/ArduinoJson/Collection/CollectionData.hpp +++ b/src/ArduinoJson/Collection/CollectionData.hpp @@ -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; diff --git a/src/ArduinoJson/Collection/CollectionImpl.hpp b/src/ArduinoJson/Collection/CollectionImpl.hpp index 5c462ac7..16c3f7e0 100644 --- a/src/ArduinoJson/Collection/CollectionImpl.hpp +++ b/src/ArduinoJson/Collection/CollectionImpl.hpp @@ -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); diff --git a/src/ArduinoJson/Json/JsonSerializer.hpp b/src/ArduinoJson/Json/JsonSerializer.hpp index d1dc121b..78f1c356 100644 --- a/src/ArduinoJson/Json/JsonSerializer.hpp +++ b/src/ArduinoJson/Json/JsonSerializer.hpp @@ -21,13 +21,13 @@ class JsonSerializer : public Visitor { 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 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(','); diff --git a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp index 52e9581d..2c5f22c3 100644 --- a/src/ArduinoJson/Json/PrettyJsonSerializer.hpp +++ b/src/ArduinoJson/Json/PrettyJsonSerializer.hpp @@ -19,16 +19,16 @@ class PrettyJsonSerializer : public JsonSerializer { 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 { } 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(); diff --git a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp index 374d3172..c0e4d724 100644 --- a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp @@ -55,7 +55,7 @@ class MsgPackSerializer : public Visitor { 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 { 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); } diff --git a/src/ArduinoJson/Object/JsonObject.hpp b/src/ArduinoJson/Object/JsonObject.hpp index 3b334583..5ff121d7 100644 --- a/src/ArduinoJson/Object/JsonObject.hpp +++ b/src/ArduinoJson/Object/JsonObject.hpp @@ -76,7 +76,7 @@ class JsonObject : public detail::VariantOperators { 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. diff --git a/src/ArduinoJson/Object/JsonObjectConst.hpp b/src/ArduinoJson/Object/JsonObjectConst.hpp index 451bedcb..9b55b892 100644 --- a/src/ArduinoJson/Object/JsonObjectConst.hpp +++ b/src/ArduinoJson/Object/JsonObjectConst.hpp @@ -65,7 +65,7 @@ class JsonObjectConst : public detail::VariantOperators { 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. diff --git a/src/ArduinoJson/Object/JsonObjectIterator.hpp b/src/ArduinoJson/Object/JsonObjectIterator.hpp index 57566f02..75ecbf7f 100644 --- a/src/ArduinoJson/Object/JsonObjectIterator.hpp +++ b/src/ArduinoJson/Object/JsonObjectIterator.hpp @@ -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; } diff --git a/src/ArduinoJson/Object/JsonPair.hpp b/src/ArduinoJson/Object/JsonPair.hpp index f2dd83ba..06e9fa71 100644 --- a/src/ArduinoJson/Object/JsonPair.hpp +++ b/src/ArduinoJson/Object/JsonPair.hpp @@ -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); diff --git a/src/ArduinoJson/Object/ObjectImpl.hpp b/src/ArduinoJson/Object/ObjectImpl.hpp index 88cf88cf..bc20494d 100644 --- a/src/ArduinoJson/Object/ObjectImpl.hpp +++ b/src/ArduinoJson/Object/ObjectImpl.hpp @@ -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 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 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