From 582216e0049de0e02e5e42b077276f9e63b019d7 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Fri, 24 Oct 2014 18:53:03 +0200 Subject: [PATCH] Merged JsonArrayIterator and JsonObjectIterator into a one template class --- include/ArduinoJson/ForwardDeclarations.hpp | 7 +++- include/ArduinoJson/JsonArray.hpp | 6 +-- ...JsonArrayIterator.hpp => JsonIterator.hpp} | 28 ++++++------- include/ArduinoJson/JsonObject.hpp | 12 ++++-- include/ArduinoJson/JsonObjectIterator.hpp | 39 ------------------- include/ArduinoJson/JsonObjectKeyValue.hpp | 3 +- include/ArduinoJson/JsonValue.hpp | 6 ++- src/JsonObject.cpp | 4 +- test/JsonArray_Iterator_Tests.cpp | 4 +- test/JsonObject_Iterator_Tests.cpp | 4 +- test/JsonValueTests.cpp | 1 + 11 files changed, 45 insertions(+), 69 deletions(-) rename include/ArduinoJson/{JsonArrayIterator.hpp => JsonIterator.hpp} (55%) delete mode 100644 include/ArduinoJson/JsonObjectIterator.hpp diff --git a/include/ArduinoJson/ForwardDeclarations.hpp b/include/ArduinoJson/ForwardDeclarations.hpp index 8b22daba..33526794 100644 --- a/include/ArduinoJson/ForwardDeclarations.hpp +++ b/include/ArduinoJson/ForwardDeclarations.hpp @@ -8,13 +8,16 @@ namespace ArduinoJson { class JsonArray; -class JsonArrayIterator; -class JsonArrayConstIterator; class JsonBuffer; class JsonObject; class JsonObjectIterator; class JsonObjectKeyValue; class JsonValue; +template +class JsonIterator; +template +class JsonConstIterator; + namespace Internals { class IndentedPrint; class JsonNode; diff --git a/include/ArduinoJson/JsonArray.hpp b/include/ArduinoJson/JsonArray.hpp index 1587ac7b..31217bf4 100644 --- a/include/ArduinoJson/JsonArray.hpp +++ b/include/ArduinoJson/JsonArray.hpp @@ -7,13 +7,13 @@ #pragma once #include "JsonContainer.hpp" -#include "JsonArrayIterator.hpp" +#include "JsonIterator.hpp" namespace ArduinoJson { class JsonArray : public JsonContainer { public: - typedef JsonArrayIterator iterator; - typedef JsonArrayConstIterator const_iterator; + typedef JsonIterator iterator; + typedef JsonConstIterator const_iterator; JsonArray() {} diff --git a/include/ArduinoJson/JsonArrayIterator.hpp b/include/ArduinoJson/JsonIterator.hpp similarity index 55% rename from include/ArduinoJson/JsonArrayIterator.hpp rename to include/ArduinoJson/JsonIterator.hpp index 7bb595cd..d2280538 100644 --- a/include/ArduinoJson/JsonArrayIterator.hpp +++ b/include/ArduinoJson/JsonIterator.hpp @@ -11,50 +11,52 @@ namespace ArduinoJson { -class JsonArrayIterator { +template +class JsonIterator { friend class JsonArray; public: - explicit JsonArrayIterator(Internals::JsonNode *node) : _value(node) {} + explicit JsonIterator(Internals::JsonNode *node) : _value(node) {} - JsonValue operator*() const { return _value; } - JsonValue *operator->() { return &_value; } + T operator*() const { return _value; } + T *operator->() { return &_value; } - bool operator==(const JsonArrayIterator &other) const { + bool operator==(const JsonIterator &other) const { return _value._node == other._value._node; } - bool operator!=(const JsonArrayIterator &other) const { + bool operator!=(const JsonIterator &other) const { return _value._node != other._value._node; } - JsonArrayIterator &operator++() { + JsonIterator &operator++() { _value._node = _value._node->next; return *this; } private: - JsonValue _value; + T _value; }; -class JsonArrayConstIterator { +template +class JsonConstIterator { friend class JsonArray; public: - explicit JsonArrayConstIterator(Internals::JsonNode *node) : _value(node) {} + explicit JsonConstIterator(Internals::JsonNode *node) : _value(node) {} const JsonValue operator*() const { return _value; } const JsonValue *operator->() { return &_value; } - bool operator==(const JsonArrayConstIterator &other) const { + bool operator==(const JsonConstIterator &other) const { return _value._node == other._value._node; } - bool operator!=(const JsonArrayConstIterator &other) const { + bool operator!=(const JsonConstIterator &other) const { return _value._node != other._value._node; } - JsonArrayConstIterator &operator++() { + JsonConstIterator &operator++() { _value._node = _value._node->next; return *this; } diff --git a/include/ArduinoJson/JsonObject.hpp b/include/ArduinoJson/JsonObject.hpp index e52629ff..129c2086 100644 --- a/include/ArduinoJson/JsonObject.hpp +++ b/include/ArduinoJson/JsonObject.hpp @@ -7,11 +7,15 @@ #pragma once #include "JsonContainer.hpp" -#include "JsonObjectIterator.hpp" +#include "JsonIterator.hpp" +#include "JsonObjectKeyValue.hpp" namespace ArduinoJson { class JsonObject : public JsonContainer { public: + typedef JsonIterator iterator; + typedef JsonConstIterator const_iterator; + JsonObject() {} explicit JsonObject(Internals::JsonNode *node) : JsonContainer(node) {} @@ -24,9 +28,11 @@ class JsonObject : public JsonContainer { bool success() { return _node && _node->isObject(); } - JsonObjectIterator begin() { return JsonObjectIterator(firstChild()); } + iterator begin() { return iterator(firstChild()); } + iterator end() { return iterator(0); } - JsonObjectIterator end() { return JsonObjectIterator(0); } + const_iterator begin() const { return const_iterator(firstChild()); } + const_iterator end() const { return const_iterator(0); } private: Internals::JsonNode *getOrCreateNodeAt(const char *key); diff --git a/include/ArduinoJson/JsonObjectIterator.hpp b/include/ArduinoJson/JsonObjectIterator.hpp deleted file mode 100644 index 0dbebb1a..00000000 --- a/include/ArduinoJson/JsonObjectIterator.hpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright Benoit Blanchon 2014 -// MIT License -// -// Arduino JSON library -// https://github.com/bblanchon/ArduinoJson - -#pragma once - -#include "ForwardDeclarations.hpp" -#include "JsonObjectKeyValue.hpp" - -namespace ArduinoJson { - -class JsonObjectIterator { - friend class JsonObject; - - public: - JsonObjectKeyValue operator*() const { return _keyValue; } - JsonObjectKeyValue *operator->() { return &_keyValue; } - - bool operator==(const JsonObjectIterator &other) const { - return _keyValue._node == other._keyValue._node; - } - - bool operator!=(const JsonObjectIterator &other) const { - return _keyValue._node != other._keyValue._node; - } - - JsonObjectIterator &operator++() { - _keyValue._node = _keyValue._node->next; - return *this; - } - - private: - explicit JsonObjectIterator(Internals::JsonNode *node) : _keyValue(node) {} - - JsonObjectKeyValue _keyValue; -}; -} diff --git a/include/ArduinoJson/JsonObjectKeyValue.hpp b/include/ArduinoJson/JsonObjectKeyValue.hpp index d748e637..b0bd0226 100644 --- a/include/ArduinoJson/JsonObjectKeyValue.hpp +++ b/include/ArduinoJson/JsonObjectKeyValue.hpp @@ -12,7 +12,8 @@ namespace ArduinoJson { class JsonObjectKeyValue { friend class JsonObject; - friend class JsonObjectIterator; + template + friend class JsonIterator; public: const char *key() const { return _node->getAsObjectKey(); } diff --git a/include/ArduinoJson/JsonValue.hpp b/include/ArduinoJson/JsonValue.hpp index f5acf1fe..ae19cc17 100644 --- a/include/ArduinoJson/JsonValue.hpp +++ b/include/ArduinoJson/JsonValue.hpp @@ -13,8 +13,10 @@ namespace ArduinoJson { class JsonValue : public Internals::JsonNodeWrapper { friend class JsonArray; - friend class JsonArrayIterator; - friend class JsonArrayConstIterator; + template + friend class JsonIterator; + template + friend class JsonConstIterator; friend class JsonBuffer; friend class JsonObject; friend class JsonObjectKeyValue; diff --git a/src/JsonObject.cpp b/src/JsonObject.cpp index 4d8a7efd..3831efc4 100644 --- a/src/JsonObject.cpp +++ b/src/JsonObject.cpp @@ -22,7 +22,7 @@ JsonValue JsonObject::operator[](char const *key) { } void JsonObject::remove(char const *key) { - for (JsonObjectIterator it = begin(); it != end(); ++it) { + for (iterator it = begin(); it != end(); ++it) { if (!strcmp(it->key(), key)) { removeChild(it->_node); } @@ -46,7 +46,7 @@ JsonObject JsonObject::createNestedObject(char const *key) { } JsonNode *JsonObject::getOrCreateNodeAt(const char *key) { - for (JsonObjectIterator it = begin(); it != end(); ++it) { + for (iterator it = begin(); it != end(); ++it) { if (!strcmp(it->key(), key)) return it->value()._node; } diff --git a/test/JsonArray_Iterator_Tests.cpp b/test/JsonArray_Iterator_Tests.cpp index c39f7ebe..fa0857fa 100644 --- a/test/JsonArray_Iterator_Tests.cpp +++ b/test/JsonArray_Iterator_Tests.cpp @@ -17,8 +17,8 @@ TEST(JsonArray_Iterator_Test, SimpleTest) { array.add(12); array.add(34); - JsonArrayIterator it = array.begin(); - JsonArrayIterator end = array.end(); + JsonArray::iterator it = array.begin(); + JsonArray::iterator end = array.end(); EXPECT_NE(end, it); EXPECT_EQ(12, it->as()); diff --git a/test/JsonObject_Iterator_Tests.cpp b/test/JsonObject_Iterator_Tests.cpp index 904b7f19..4df10990 100644 --- a/test/JsonObject_Iterator_Tests.cpp +++ b/test/JsonObject_Iterator_Tests.cpp @@ -17,8 +17,8 @@ TEST(JsonObject_Iterator_Test, SimpleTest) { object["ab"] = 12; object["cd"] = 34; - JsonObjectIterator it = object.begin(); - JsonObjectIterator end = object.end(); + JsonObject::iterator it = object.begin(); + JsonObject::iterator end = object.end(); EXPECT_NE(end, it); EXPECT_STREQ("ab", it->key()); diff --git a/test/JsonValueTests.cpp b/test/JsonValueTests.cpp index f05ceaf9..2e890ed6 100644 --- a/test/JsonValueTests.cpp +++ b/test/JsonValueTests.cpp @@ -7,6 +7,7 @@ #include #include #include +#include "Printers.hpp" using namespace ArduinoJson;