From 8721ac88b145cf3001eb272e469f0e9aefab32cc Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 31 Oct 2019 19:27:23 +0100 Subject: [PATCH] Reorganized writer classes --- extras/tests/JsonSerializer/CustomWriter.cpp | 23 +++-- extras/tests/Misc/StringWriter.cpp | 8 +- extras/tests/TextFormatter/writeFloat.cpp | 6 +- extras/tests/TextFormatter/writeString.cpp | 2 +- src/ArduinoJson/Json/JsonSerializer.hpp | 2 +- src/ArduinoJson/Json/TextFormatter.hpp | 4 +- src/ArduinoJson/MsgPack/MsgPackSerializer.hpp | 8 +- .../Serialization/DynamicStringWriter.hpp | 91 ------------------- src/ArduinoJson/Serialization/PrintWriter.hpp | 37 -------- src/ArduinoJson/Serialization/Writer.hpp | 47 ++++++++++ .../Serialization/WriterSelector.hpp | 17 ---- .../Writers/ArduinoStringWriter.hpp | 36 ++++++++ .../{ => Writers}/DummyWriter.hpp | 0 .../Serialization/Writers/PrintWriter.hpp | 28 ++++++ .../{ => Writers}/StaticStringWriter.hpp | 0 .../StdStreamWriter.hpp} | 28 ++---- .../Serialization/Writers/StdStringWriter.hpp | 40 ++++++++ src/ArduinoJson/Serialization/measure.hpp | 2 +- src/ArduinoJson/Serialization/serialize.hpp | 16 +--- src/ArduinoJson/Strings/IsWriteableString.hpp | 37 ++++++++ src/ArduinoJson/Variant/VariantAs.hpp | 2 +- src/ArduinoJson/Variant/VariantAsImpl.hpp | 2 +- 22 files changed, 235 insertions(+), 201 deletions(-) delete mode 100644 src/ArduinoJson/Serialization/DynamicStringWriter.hpp delete mode 100644 src/ArduinoJson/Serialization/PrintWriter.hpp create mode 100644 src/ArduinoJson/Serialization/Writer.hpp delete mode 100644 src/ArduinoJson/Serialization/WriterSelector.hpp create mode 100644 src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp rename src/ArduinoJson/Serialization/{ => Writers}/DummyWriter.hpp (100%) create mode 100644 src/ArduinoJson/Serialization/Writers/PrintWriter.hpp rename src/ArduinoJson/Serialization/{ => Writers}/StaticStringWriter.hpp (100%) rename src/ArduinoJson/Serialization/{StreamWriter.hpp => Writers/StdStreamWriter.hpp} (51%) create mode 100644 src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp create mode 100644 src/ArduinoJson/Strings/IsWriteableString.hpp diff --git a/extras/tests/JsonSerializer/CustomWriter.cpp b/extras/tests/JsonSerializer/CustomWriter.cpp index f78825dc..a05f6a37 100644 --- a/extras/tests/JsonSerializer/CustomWriter.cpp +++ b/extras/tests/JsonSerializer/CustomWriter.cpp @@ -5,18 +5,29 @@ #include #include -struct CustomWriter { - std::string str; +class CustomWriter { + public: + CustomWriter() {} size_t write(uint8_t c) { - str.append(1, static_cast(c)); + _str.append(1, static_cast(c)); return 1; } size_t write(const uint8_t *s, size_t n) { - str.append(reinterpret_cast(s), n); + _str.append(reinterpret_cast(s), n); return n; } + + const std::string &str() const { + return _str; + } + + private: + CustomWriter(const CustomWriter &); // non-copiable + CustomWriter &operator=(const CustomWriter &); + + std::string _str; }; TEST_CASE("CustomWriter") { @@ -29,13 +40,13 @@ TEST_CASE("CustomWriter") { CustomWriter writer; serializeJson(array, writer); - REQUIRE("[4,2]" == writer.str); + REQUIRE("[4,2]" == writer.str()); } SECTION("serializeJsonPretty") { CustomWriter writer; serializeJsonPretty(array, writer); - REQUIRE("[\r\n 4,\r\n 2\r\n]" == writer.str); + REQUIRE("[\r\n 4,\r\n 2\r\n]" == writer.str()); } } diff --git a/extras/tests/Misc/StringWriter.cpp b/extras/tests/Misc/StringWriter.cpp index 2355984c..d9241668 100644 --- a/extras/tests/Misc/StringWriter.cpp +++ b/extras/tests/Misc/StringWriter.cpp @@ -49,15 +49,15 @@ TEST_CASE("StaticStringWriter") { } } -TEST_CASE("DynamicStringWriter") { +TEST_CASE("Writer") { std::string output; - DynamicStringWriter sb(output); + Writer sb(output); common_tests(sb, output); } -TEST_CASE("DynamicStringWriter") { +TEST_CASE("Writer") { custom_string output; - DynamicStringWriter sb(output); + Writer sb(output); REQUIRE(4 == print(sb, "ABCD")); REQUIRE("ABCD" == output); diff --git a/extras/tests/TextFormatter/writeFloat.cpp b/extras/tests/TextFormatter/writeFloat.cpp index 39abe98e..c595745b 100644 --- a/extras/tests/TextFormatter/writeFloat.cpp +++ b/extras/tests/TextFormatter/writeFloat.cpp @@ -9,15 +9,15 @@ #define ARDUINOJSON_ENABLE_NAN 1 #define ARDUINOJSON_ENABLE_INFINITY 1 #include -#include +#include using namespace ARDUINOJSON_NAMESPACE; template void check(TFloat input, const std::string& expected) { std::string output; - DynamicStringWriter sb(output); - TextFormatter > writer(sb); + Writer sb(output); + TextFormatter > writer(sb); writer.writeFloat(input); REQUIRE(writer.bytesWritten() == output.size()); CHECK(expected == output); diff --git a/extras/tests/TextFormatter/writeString.cpp b/extras/tests/TextFormatter/writeString.cpp index 8dbf2848..6497ed0c 100644 --- a/extras/tests/TextFormatter/writeString.cpp +++ b/extras/tests/TextFormatter/writeString.cpp @@ -5,7 +5,7 @@ #include #include -#include +#include using namespace ARDUINOJSON_NAMESPACE; diff --git a/src/ArduinoJson/Json/JsonSerializer.hpp b/src/ArduinoJson/Json/JsonSerializer.hpp index 6b0acca0..d3857806 100644 --- a/src/ArduinoJson/Json/JsonSerializer.hpp +++ b/src/ArduinoJson/Json/JsonSerializer.hpp @@ -14,7 +14,7 @@ namespace ARDUINOJSON_NAMESPACE { template class JsonSerializer { public: - JsonSerializer(TWriter &writer) : _formatter(writer) {} + JsonSerializer(TWriter writer) : _formatter(writer) {} FORCE_INLINE void visitArray(const CollectionData &array) { write('['); diff --git a/src/ArduinoJson/Json/TextFormatter.hpp b/src/ArduinoJson/Json/TextFormatter.hpp index 327cf410..cdef2113 100644 --- a/src/ArduinoJson/Json/TextFormatter.hpp +++ b/src/ArduinoJson/Json/TextFormatter.hpp @@ -17,7 +17,7 @@ namespace ARDUINOJSON_NAMESPACE { template class TextFormatter { public: - explicit TextFormatter(TWriter &writer) : _writer(writer), _length(0) {} + explicit TextFormatter(TWriter writer) : _writer(writer), _length(0) {} // Returns the number of bytes sent to the TWriter implementation. size_t bytesWritten() const { @@ -147,7 +147,7 @@ class TextFormatter { } protected: - TWriter &_writer; + TWriter _writer; size_t _length; private: diff --git a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp index 2f1f6d5b..c0be6b93 100644 --- a/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp @@ -15,7 +15,7 @@ namespace ARDUINOJSON_NAMESPACE { template class MsgPackSerializer { public: - MsgPackSerializer(TWriter& writer) : _writer(&writer), _bytesWritten(0) {} + MsgPackSerializer(TWriter writer) : _writer(writer), _bytesWritten(0) {} template typename enable_if::type visitFloat(T value32) { @@ -150,11 +150,11 @@ class MsgPackSerializer { private: void writeByte(uint8_t c) { - _bytesWritten += _writer->write(c); + _bytesWritten += _writer.write(c); } void writeBytes(const uint8_t* p, size_t n) { - _bytesWritten += _writer->write(p, n); + _bytesWritten += _writer.write(p, n); } template @@ -163,7 +163,7 @@ class MsgPackSerializer { writeBytes(reinterpret_cast(&value), sizeof(value)); } - TWriter* _writer; + TWriter _writer; size_t _bytesWritten; }; diff --git a/src/ArduinoJson/Serialization/DynamicStringWriter.hpp b/src/ArduinoJson/Serialization/DynamicStringWriter.hpp deleted file mode 100644 index dd8e1a15..00000000 --- a/src/ArduinoJson/Serialization/DynamicStringWriter.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2019 -// MIT License - -#pragma once - -#include -#include -#include - -#if ARDUINOJSON_ENABLE_ARDUINO_STRING -#include -#endif - -#if ARDUINOJSON_ENABLE_STD_STRING -#include -#endif - -namespace ARDUINOJSON_NAMESPACE { - -template -struct IsWriteableString : false_type {}; - -// A Print implementation that allows to write in a String -template -class DynamicStringWriter {}; - -#if ARDUINOJSON_ENABLE_ARDUINO_STRING -template <> -struct IsWriteableString : true_type {}; - -template <> -class DynamicStringWriter { - public: - DynamicStringWriter(String &str) : _str(&str) {} - - size_t write(uint8_t c) { - _str->operator+=(static_cast(c)); - return 1; - } - - size_t write(const uint8_t *s, size_t n) { - // CAUTION: Arduino String doesn't have append() - // and old version doesn't have size() either - _str->reserve(_str->length() + n); - while (n > 0) { - _str->operator+=(static_cast(*s++)); - n--; - } - return n; - } - - private: - String *_str; -}; -#endif - -#if ARDUINOJSON_ENABLE_STD_STRING -template -struct IsWriteableString > - : true_type {}; - -template -class DynamicStringWriter > { - typedef std::basic_string string_type; - - public: - DynamicStringWriter(string_type &str) : _str(&str) {} - - size_t write(uint8_t c) { - _str->operator+=(static_cast(c)); - return 1; - } - - size_t write(const uint8_t *s, size_t n) { - _str->append(reinterpret_cast(s), n); - return n; - } - - private: - string_type *_str; -}; -#endif - -template -struct WriterSelector< - TDestination, - typename enable_if::value>::type> { - typedef DynamicStringWriter writer_type; -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/PrintWriter.hpp b/src/ArduinoJson/Serialization/PrintWriter.hpp deleted file mode 100644 index f3c503ee..00000000 --- a/src/ArduinoJson/Serialization/PrintWriter.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2019 -// MIT License - -#pragma once - -#include -#include - -namespace ARDUINOJSON_NAMESPACE { - -class PrintWriter { - public: - explicit PrintWriter(Print& print) : _print(print) {} - - size_t write(uint8_t c) { - return _print.write(c); - } - - size_t write(const uint8_t* s, size_t n) { - return _print.write(s, n); - } - - private: - // cannot be assigned - PrintWriter& operator=(const PrintWriter&); - - Print& _print; -}; - -template -struct WriterSelector< - TDestination, - typename enable_if::value>::type> { - typedef PrintWriter writer_type; -}; -} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/Writer.hpp b/src/ArduinoJson/Serialization/Writer.hpp new file mode 100644 index 00000000..960a6f1d --- /dev/null +++ b/src/ArduinoJson/Serialization/Writer.hpp @@ -0,0 +1,47 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#pragma once + +#include + +namespace ARDUINOJSON_NAMESPACE { + +// The default writer is a simple wrapper for Writers that are not copiable +template +class Writer { + public: + explicit Writer(TDestination& dest) : _dest(&dest) {} + + size_t write(uint8_t c) { + return _dest->write(c); + } + + size_t write(const uint8_t* s, size_t n) { + return _dest->write(s, n); + } + + private: + TDestination* _dest; +}; + +} // namespace ARDUINOJSON_NAMESPACE + +#include + +#if ARDUINOJSON_ENABLE_STD_STRING +#include +#endif + +#if ARDUINOJSON_ENABLE_ARDUINO_STRING +#include +#endif + +#if ARDUINOJSON_ENABLE_STD_STREAM +#include +#endif + +#if ARDUINOJSON_ENABLE_ARDUINO_PRINT +#include +#endif diff --git a/src/ArduinoJson/Serialization/WriterSelector.hpp b/src/ArduinoJson/Serialization/WriterSelector.hpp deleted file mode 100644 index a1d31d4d..00000000 --- a/src/ArduinoJson/Serialization/WriterSelector.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2019 -// MIT License - -#pragma once - -#include - -namespace ARDUINOJSON_NAMESPACE { - -template -struct WriterSelector { - // by default, assume destination implements the Writer concept - typedef TDestination& writer_type; -}; - -} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp b/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp new file mode 100644 index 00000000..47dfb469 --- /dev/null +++ b/src/ArduinoJson/Serialization/Writers/ArduinoStringWriter.hpp @@ -0,0 +1,36 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#pragma once + +#include + +namespace ARDUINOJSON_NAMESPACE { + +template <> +class Writer< ::String, void> { + public: + explicit Writer(::String &str) : _str(&str) {} + + size_t write(uint8_t c) { + _str->operator+=(static_cast(c)); + return 1; + } + + size_t write(const uint8_t *s, size_t n) { + // CAUTION: Arduino String doesn't have append() + // and old version doesn't have size() either + _str->reserve(_str->length() + n); + while (n > 0) { + _str->operator+=(static_cast(*s++)); + n--; + } + return n; + } + + private: + ::String *_str; +}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/DummyWriter.hpp b/src/ArduinoJson/Serialization/Writers/DummyWriter.hpp similarity index 100% rename from src/ArduinoJson/Serialization/DummyWriter.hpp rename to src/ArduinoJson/Serialization/Writers/DummyWriter.hpp diff --git a/src/ArduinoJson/Serialization/Writers/PrintWriter.hpp b/src/ArduinoJson/Serialization/Writers/PrintWriter.hpp new file mode 100644 index 00000000..d25bd397 --- /dev/null +++ b/src/ArduinoJson/Serialization/Writers/PrintWriter.hpp @@ -0,0 +1,28 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#pragma once + +namespace ARDUINOJSON_NAMESPACE { + +template +class Writer< + TDestination, + typename enable_if::value>::type> { + public: + explicit Writer(::Print& print) : _print(&print) {} + + size_t write(uint8_t c) { + return _print->write(c); + } + + size_t write(const uint8_t* s, size_t n) { + return _print->write(s, n); + } + + private: + ::Print* _print; +}; + +} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/StaticStringWriter.hpp b/src/ArduinoJson/Serialization/Writers/StaticStringWriter.hpp similarity index 100% rename from src/ArduinoJson/Serialization/StaticStringWriter.hpp rename to src/ArduinoJson/Serialization/Writers/StaticStringWriter.hpp diff --git a/src/ArduinoJson/Serialization/StreamWriter.hpp b/src/ArduinoJson/Serialization/Writers/StdStreamWriter.hpp similarity index 51% rename from src/ArduinoJson/Serialization/StreamWriter.hpp rename to src/ArduinoJson/Serialization/Writers/StdStreamWriter.hpp index 819f5bee..e75d7da3 100644 --- a/src/ArduinoJson/Serialization/StreamWriter.hpp +++ b/src/ArduinoJson/Serialization/Writers/StdStreamWriter.hpp @@ -4,39 +4,29 @@ #pragma once -#include -#include - #include namespace ARDUINOJSON_NAMESPACE { -class StreamWriter { +template +class Writer< + TDestination, + typename enable_if::value>::type> { public: - explicit StreamWriter(std::ostream& os) : _os(os) {} + explicit Writer(std::ostream& os) : _os(&os) {} size_t write(uint8_t c) { - _os << c; + _os->put(static_cast(c)); return 1; } size_t write(const uint8_t* s, size_t n) { - _os.write(reinterpret_cast(s), - static_cast(n)); + _os->write(reinterpret_cast(s), + static_cast(n)); return n; } private: - // cannot be assigned - StreamWriter& operator=(const StreamWriter&); - - std::ostream& _os; -}; - -template -struct WriterSelector< - TDestination, - typename enable_if::value>::type> { - typedef StreamWriter writer_type; + std::ostream* _os; }; } // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp b/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp new file mode 100644 index 00000000..7843aa60 --- /dev/null +++ b/src/ArduinoJson/Serialization/Writers/StdStringWriter.hpp @@ -0,0 +1,40 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License + +#pragma once + +#include +#include + +#include + +namespace ARDUINOJSON_NAMESPACE { + +template +struct is_std_string : false_type {}; + +template +struct is_std_string > + : true_type {}; + +template +class Writer::value>::type> { + public: + Writer(TDestination &str) : _str(&str) {} + + size_t write(uint8_t c) { + _str->operator+=(static_cast(c)); + return 1; + } + + size_t write(const uint8_t *s, size_t n) { + _str->append(reinterpret_cast(s), n); + return n; + } + + private: + TDestination *_str; +}; +} // namespace ARDUINOJSON_NAMESPACE diff --git a/src/ArduinoJson/Serialization/measure.hpp b/src/ArduinoJson/Serialization/measure.hpp index 378a284f..14d625a5 100644 --- a/src/ArduinoJson/Serialization/measure.hpp +++ b/src/ArduinoJson/Serialization/measure.hpp @@ -4,7 +4,7 @@ #pragma once -#include +#include namespace ARDUINOJSON_NAMESPACE { diff --git a/src/ArduinoJson/Serialization/serialize.hpp b/src/ArduinoJson/Serialization/serialize.hpp index 39006c8b..e9b99eb9 100644 --- a/src/ArduinoJson/Serialization/serialize.hpp +++ b/src/ArduinoJson/Serialization/serialize.hpp @@ -4,23 +4,13 @@ #pragma once -#include -#include -#include - -#if ARDUINOJSON_ENABLE_STD_STREAM -#include -#endif - -#if ARDUINOJSON_ENABLE_ARDUINO_PRINT -#include -#endif +#include namespace ARDUINOJSON_NAMESPACE { template