From 7d73e63c78ee9eeaff219f51c9ce54886a9e0d3c Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 5 Nov 2014 11:38:36 +0100 Subject: [PATCH] Extracting a common base class for JsonArray and JsonObject... --- include/ArduinoJson/Internals/List.hpp | 2 ++ include/ArduinoJson/JsonArray.hpp | 26 ++++---------------------- include/ArduinoJson/JsonObject.hpp | 3 --- src/Internals/List.cpp | 23 +++++++++++++++++++++++ src/JsonArray.cpp | 6 ------ src/JsonObject.cpp | 6 ------ 6 files changed, 29 insertions(+), 37 deletions(-) create mode 100644 src/Internals/List.cpp diff --git a/include/ArduinoJson/Internals/List.hpp b/include/ArduinoJson/Internals/List.hpp index c09a7656..3e52e5a8 100644 --- a/include/ArduinoJson/Internals/List.hpp +++ b/include/ArduinoJson/Internals/List.hpp @@ -16,6 +16,7 @@ namespace Internals { template class List { public: + typedef T value_type; typedef Node node_type; typedef NodeIterator iterator; typedef NodeConstIterator const_iterator; @@ -23,6 +24,7 @@ class List { List(JsonBuffer *buffer) : _buffer(buffer), _firstNode(NULL) {} bool success() const { return _buffer != NULL; } + int size() const; iterator begin() { return iterator(_firstNode); } iterator end() { return iterator(NULL); } diff --git a/include/ArduinoJson/JsonArray.hpp b/include/ArduinoJson/JsonArray.hpp index 4c72ca83..9358a138 100644 --- a/include/ArduinoJson/JsonArray.hpp +++ b/include/ArduinoJson/JsonArray.hpp @@ -7,9 +7,7 @@ #pragma once #include "Internals/JsonPrintable.hpp" -#include "Internals/Node.hpp" -#include "Internals/NodeConstIterator.hpp" -#include "Internals/NodeIterator.hpp" +#include "Internals/List.hpp" #include "Internals/ReferenceType.hpp" #include "JsonVariant.hpp" @@ -22,19 +20,11 @@ class JsonObject; class JsonBuffer; class JsonArray : public Internals::JsonPrintable, - public Internals::ReferenceType { + public Internals::ReferenceType, + public Internals::List { friend class JsonBuffer; public: - typedef JsonVariant value_type; - typedef Internals::Node node_type; - typedef Internals::NodeIterator iterator; - typedef Internals::NodeConstIterator const_iterator; - - int size() const; - - bool success() { return _buffer != NULL; } - value_type &operator[](int index) const { return at(index); } value_type &at(int index) const; @@ -51,12 +41,6 @@ class JsonArray : public Internals::JsonPrintable, JsonArray &createNestedArray(); JsonObject &createNestedObject(); - iterator begin() { return iterator(_firstNode); } - iterator end() { return iterator(NULL); } - - const_iterator begin() const { return const_iterator(_firstNode); } - const_iterator end() const { return const_iterator(NULL); } - static JsonArray &invalid() { return _invalid; } template @@ -64,13 +48,11 @@ class JsonArray : public Internals::JsonPrintable, private: // constructor is private: instance must be created via a JsonBuffer - JsonArray(JsonBuffer *buffer) : _buffer(buffer), _firstNode(NULL) {} + JsonArray(JsonBuffer *buffer) : List(buffer) {} node_type *createNode(); inline void addNode(node_type *node); - JsonBuffer *_buffer; - node_type *_firstNode; static JsonArray _invalid; }; } diff --git a/include/ArduinoJson/JsonObject.hpp b/include/ArduinoJson/JsonObject.hpp index f46c0be6..1e6ed8d3 100644 --- a/include/ArduinoJson/JsonObject.hpp +++ b/include/ArduinoJson/JsonObject.hpp @@ -8,7 +8,6 @@ #include "Internals/JsonPrintable.hpp" #include "Internals/List.hpp" -#include "Internals/Node.hpp" #include "Internals/ReferenceType.hpp" #include "JsonPair.hpp" @@ -29,8 +28,6 @@ class JsonObject : public Internals::JsonPrintable, typedef const char *key_type; typedef JsonPair value_type; - int size() const; - JsonVariant &at(key_type key); const JsonVariant &at(key_type key) const; JsonVariant &operator[](key_type key); diff --git a/src/Internals/List.cpp b/src/Internals/List.cpp new file mode 100644 index 00000000..e0581876 --- /dev/null +++ b/src/Internals/List.cpp @@ -0,0 +1,23 @@ +// Copyright Benoit Blanchon 2014 +// MIT License +// +// Arduino JSON library +// https://github.com/bblanchon/ArduinoJson + +#include "../../include/ArduinoJson/Internals/List.hpp" + +#include "../../include/ArduinoJson/JsonPair.hpp" +#include "../../include/ArduinoJson/JsonVariant.hpp" + +using namespace ArduinoJson; +using namespace ArduinoJson::Internals; + +template +int List::size() const { + int nodeCount = 0; + for (node_type *node = _firstNode; node; node = node->next) nodeCount++; + return nodeCount; +} + +template class List; +template class List; \ No newline at end of file diff --git a/src/JsonArray.cpp b/src/JsonArray.cpp index 3abecc7a..97d46591 100644 --- a/src/JsonArray.cpp +++ b/src/JsonArray.cpp @@ -16,12 +16,6 @@ using namespace ArduinoJson::Internals; JsonArray JsonArray::_invalid(NULL); -int JsonArray::size() const { - int nodeCount = 0; - for (node_type *node = _firstNode; node; node = node->next) nodeCount++; - return nodeCount; -} - JsonVariant &JsonArray::at(int index) const { node_type *node = _firstNode; while (node && index--) node = node->next; diff --git a/src/JsonObject.cpp b/src/JsonObject.cpp index d897453a..1ac06717 100644 --- a/src/JsonObject.cpp +++ b/src/JsonObject.cpp @@ -19,12 +19,6 @@ using namespace ArduinoJson::Internals; JsonObject JsonObject::_invalid(NULL); -int JsonObject::size() const { - int nodeCount = 0; - for (node_type *node = _firstNode; node; node = node->next) nodeCount++; - return nodeCount; -} - JsonVariant &JsonObject::at(const char *key) { node_type *node = getNodeAt(key); return node ? node->content.value : JsonVariant::invalid();