diff --git a/include/ArduinoJson/Internals/JsonNode.hpp b/include/ArduinoJson/Internals/JsonNode.hpp index 147ed122..64503648 100644 --- a/include/ArduinoJson/Internals/JsonNode.hpp +++ b/include/ArduinoJson/Internals/JsonNode.hpp @@ -3,16 +3,13 @@ namespace ArduinoJson { class JsonBuffer; - + namespace Internals { class JsonWriter; - class JsonNodeIterator; class JsonNode { - friend class JsonNodeIterator; - enum JsonNodeType { JSON_UNDEFINED, @@ -63,6 +60,8 @@ namespace ArduinoJson } + JsonNode* next; + void writeTo(JsonWriter&); // TODO: <- move in JsonNodeSerializer void setAsArray(JsonBuffer* buffer) @@ -175,7 +174,6 @@ namespace ArduinoJson private: JsonNodeType type; - JsonNode* next; JsonNodeContent content; inline void writeArrayTo(JsonWriter&);// TODO: <- move in JsonNodeSerializer diff --git a/include/ArduinoJson/Internals/JsonNodeIterator.hpp b/include/ArduinoJson/Internals/JsonNodeIterator.hpp index c42a95c3..7ca540d4 100644 --- a/include/ArduinoJson/Internals/JsonNodeIterator.hpp +++ b/include/ArduinoJson/Internals/JsonNodeIterator.hpp @@ -6,6 +6,7 @@ namespace ArduinoJson { namespace Internals { + // TODO: replace by JsonArrayIterator and JsonObjectIterator class JsonNodeIterator { public: diff --git a/include/ArduinoJson/JsonArray.hpp b/include/ArduinoJson/JsonArray.hpp index 67689221..a092ae47 100644 --- a/include/ArduinoJson/JsonArray.hpp +++ b/include/ArduinoJson/JsonArray.hpp @@ -1,6 +1,7 @@ #pragma once #include "JsonContainer.hpp" +#include "JsonArrayIterator.hpp" namespace ArduinoJson { @@ -32,5 +33,12 @@ namespace ArduinoJson { return _node && _node->isArray(); } + + JsonArrayIterator begin(); + + JsonArrayIterator end() + { + return JsonArrayIterator(0); + } }; } diff --git a/include/ArduinoJson/JsonArrayIterator.hpp b/include/ArduinoJson/JsonArrayIterator.hpp new file mode 100644 index 00000000..4d4399a0 --- /dev/null +++ b/include/ArduinoJson/JsonArrayIterator.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include "ArduinoJson/JsonValue.hpp" + +namespace ArduinoJson +{ + class JsonArray; + + class JsonArrayIterator + { + friend class JsonArray; + + public: + explicit JsonArrayIterator(Internals::JsonNode* node) + : _node(node) + { + } + + void operator++() + { + _node = _node->next; + } + + JsonValue operator*() const + { + return JsonValue(_node); + } + + bool operator==(const JsonArrayIterator& other) const + { + return _node == other._node; + } + + bool operator!=(const JsonArrayIterator& other) const + { + return _node != other._node; + } + + private: + Internals::JsonNode* _node; + }; +} \ No newline at end of file diff --git a/src/JsonArray.cpp b/src/JsonArray.cpp index bdefb9b9..67004162 100644 --- a/src/JsonArray.cpp +++ b/src/JsonArray.cpp @@ -86,4 +86,12 @@ JsonObject JsonArray::createNestedObject() } return JsonObject(node); +} + +JsonArrayIterator JsonArray::begin() +{ + if (!_node) + return end(); + + return JsonArrayIterator(_node->getContainerChild()); } \ No newline at end of file diff --git a/test/JsonArray_Iterator_Tests.cpp b/test/JsonArray_Iterator_Tests.cpp new file mode 100644 index 00000000..79e23cb3 --- /dev/null +++ b/test/JsonArray_Iterator_Tests.cpp @@ -0,0 +1,25 @@ +#include +#include +#include + +using namespace ArduinoJson; + +TEST(JsonArray_Iterator_Test, SimpleTest) +{ + StaticJsonBuffer<42> jsonBuffer; + + JsonArray array = jsonBuffer.createArray(); + array.add(12); + array.add(34); + + JsonArrayIterator it = array.begin(); + JsonArrayIterator end = array.end(); + + EXPECT_NE(end, it); + EXPECT_EQ(12, static_cast(*it)); + ++it; + EXPECT_NE(end, it); + EXPECT_EQ(34, static_cast(*it)); + ++it; + EXPECT_EQ(array.end(), it); +} \ No newline at end of file