diff --git a/include/ArduinoJson/JsonArray.hpp b/include/ArduinoJson/JsonArray.hpp index 111ec23a..1d6fb52d 100644 --- a/include/ArduinoJson/JsonArray.hpp +++ b/include/ArduinoJson/JsonArray.hpp @@ -19,7 +19,8 @@ namespace ArduinoJson { class JsonObject; class JsonBuffer; -class JsonArray : public JsonPrintable, public Internals::ReferenceType { +class JsonArray : public JsonPrintable, + public Internals::ReferenceType { friend class JsonBuffer; public: @@ -55,7 +56,8 @@ class JsonArray : public JsonPrintable, public Internals::ReferenceType { static JsonArray &invalid() { return _invalid; } - virtual void writeTo(Internals::JsonWriter &writer) const; + template + void writeTo(T &writer) const; private: // constructor is private: instance must be created via a JsonBuffer diff --git a/include/ArduinoJson/JsonObject.hpp b/include/ArduinoJson/JsonObject.hpp index 346ad3a4..b91ba7c5 100644 --- a/include/ArduinoJson/JsonObject.hpp +++ b/include/ArduinoJson/JsonObject.hpp @@ -20,7 +20,8 @@ namespace ArduinoJson { class JsonArray; class JsonBuffer; -class JsonObject : public JsonPrintable, public Internals::ReferenceType { +class JsonObject : public JsonPrintable, + public Internals::ReferenceType { friend class JsonBuffer; public: @@ -55,7 +56,8 @@ class JsonObject : public JsonPrintable, public Internals::ReferenceType { static JsonObject &invalid() { return _invalid; } - virtual void writeTo(Internals::JsonWriter &writer) const; + template + void writeTo(T &writer) const; private: // constructor is private, instance must be created via JsonBuffer diff --git a/include/ArduinoJson/JsonPrintable.hpp b/include/ArduinoJson/JsonPrintable.hpp index 39656922..817670bb 100644 --- a/include/ArduinoJson/JsonPrintable.hpp +++ b/include/ArduinoJson/JsonPrintable.hpp @@ -7,24 +7,44 @@ #pragma once #include "Arduino/Printable.hpp" +#include "Internals/StringBuilder.hpp" +#include "Internals/IndentedPrint.hpp" namespace ArduinoJson { namespace Internals { class IndentedPrint; -class JsonWriter; } +template class JsonPrintable : public Printable { public: - size_t printTo(char *buffer, size_t bufferSize) const; - virtual size_t printTo(Print &print) const; + size_t printTo(Print &print) const { + CompactJsonWriter writer(&p); + downcast().writeTo(writer); + return writer.bytesWritten(); + } + size_t printTo(char *buffer, size_t bufferSize) const { + Internals::StringBuilder sb(buffer, bufferSize); + return printTo(sb); + } - size_t prettyPrintTo(char *buffer, size_t bufferSize) const; - size_t prettyPrintTo(Internals::IndentedPrint &print) const; - size_t prettyPrintTo(Print &print) const; + size_t prettyPrintTo(Internals::IndentedPrint &print) const { + PrettyJsonWriter writer(&p); + downcast().writeTo(writer); + return writer.bytesWritten(); + } - protected: - virtual void writeTo(Internals::JsonWriter &) const = 0; + size_t prettyPrintTo(char *buffer, size_t bufferSize) const { + Internals::StringBuilder sb(buffer, bufferSize); + return prettyPrintTo(sb); + } + size_t prettyPrintTo(Print &print) const { + Internals::IndentedPrint indentedPrint = Internals::IndentedPrint(print); + return prettyPrintTo(indentedPrint); + } + + private: + const T &downcast() { return *static_cast(this); } }; } diff --git a/include/ArduinoJson/JsonValue.hpp b/include/ArduinoJson/JsonValue.hpp index 7d469061..3101c68a 100644 --- a/include/ArduinoJson/JsonValue.hpp +++ b/include/ArduinoJson/JsonValue.hpp @@ -68,7 +68,8 @@ class JsonValue { bool success() { return _type != Internals::JSON_INVALID; } - void writeTo(Internals::JsonWriter &writer) const; + template + void writeTo(T &writer) const; private: JsonValue(Internals::JsonValueType type) : _type(type) {} diff --git a/src/JsonArray.cpp b/src/JsonArray.cpp index 88d1fd49..d50fe833 100644 --- a/src/JsonArray.cpp +++ b/src/JsonArray.cpp @@ -10,7 +10,8 @@ #include "ArduinoJson/JsonBuffer.hpp" #include "ArduinoJson/JsonObject.hpp" -#include "ArduinoJson/Internals/JsonWriter.hpp" +#include "ArduinoJson/Internals/CompactJsonWriter.hpp" +#include "ArduinoJson/Internals/PrettyJsonWriter.hpp" using namespace ArduinoJson; using namespace ArduinoJson::Internals; @@ -68,7 +69,8 @@ JsonObject &JsonArray::createNestedObject() { return object; } -void JsonArray::writeTo(JsonWriter &writer) const { +template +void JsonArray::writeTo(T &writer) const { JsonArrayNode *child = _firstNode; if (child) { @@ -88,3 +90,6 @@ void JsonArray::writeTo(JsonWriter &writer) const { writer.writeEmptyArray(); } } + +template void JsonArray::writeTo(CompactJsonWriter &) const; +template void JsonArray::writeTo(PrettyJsonWriter &) const; \ No newline at end of file diff --git a/src/JsonObject.cpp b/src/JsonObject.cpp index b526352f..7240cc11 100644 --- a/src/JsonObject.cpp +++ b/src/JsonObject.cpp @@ -12,7 +12,8 @@ #include "ArduinoJson/JsonBuffer.hpp" #include "ArduinoJson/JsonArray.hpp" #include "ArduinoJson/JsonValue.hpp" -#include "ArduinoJson/Internals/JsonWriter.hpp" +#include "ArduinoJson/Internals/CompactJsonWriter.hpp" +#include "ArduinoJson/Internals/PrettyJsonWriter.hpp" #include "ArduinoJson/Internals/StringBuilder.hpp" using namespace ArduinoJson; @@ -91,7 +92,8 @@ void JsonObject::removeNode(JsonObjectNode *nodeToRemove) { } } -void JsonObject::writeTo(JsonWriter &writer) const { +template +void JsonObject::writeTo(T &writer) const { JsonObjectNode *node = _firstNode; if (node) { @@ -113,3 +115,6 @@ void JsonObject::writeTo(JsonWriter &writer) const { writer.writeEmptyObject(); } } + +template void JsonObject::writeTo(CompactJsonWriter &writer) const; +template void JsonObject::writeTo(PrettyJsonWriter &writer) const; diff --git a/src/JsonPrintable.cpp b/src/JsonPrintable.cpp index 0948faf1..88d2afca 100644 --- a/src/JsonPrintable.cpp +++ b/src/JsonPrintable.cpp @@ -13,30 +13,3 @@ using namespace ArduinoJson; using namespace ArduinoJson::Internals; - -size_t JsonPrintable::printTo(char *buffer, size_t bufferSize) const { - StringBuilder sb(buffer, bufferSize); - return printTo(sb); -} - -size_t JsonPrintable::printTo(Print &p) const { - CompactJsonWriter writer(&p); - writeTo(writer); - return writer.bytesWritten(); -} - -size_t JsonPrintable::prettyPrintTo(char *buffer, size_t bufferSize) const { - StringBuilder sb(buffer, bufferSize); - return prettyPrintTo(sb); -} - -size_t JsonPrintable::prettyPrintTo(IndentedPrint &p) const { - PrettyJsonWriter writer(&p); - writeTo(writer); - return writer.bytesWritten(); -} - -size_t JsonPrintable::prettyPrintTo(Print &print) const { - IndentedPrint indentedPrint = IndentedPrint(print); - return prettyPrintTo(indentedPrint); -}