From 5fbfe3cdb948a32706ad88635563a41a54819f83 Mon Sep 17 00:00:00 2001 From: Christopher Dunn Date: Thu, 22 Jan 2015 14:31:32 -0600 Subject: [PATCH] StreamWriter --- include/json/writer.h | 29 +++++++++++++++++++ src/lib_json/json_writer.cpp | 54 ++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/include/json/writer.h b/include/json/writer.h index cacb10e..4198498 100644 --- a/include/json/writer.h +++ b/include/json/writer.h @@ -23,6 +23,35 @@ namespace Json { class Value; +class JSON_API StreamWriter { +protected: + std::ostream& sout_; // not owned; will not delete +public: + StreamWriter(std::ostream* sout); + virtual ~StreamWriter(); + /// Write Value into document as configured in sub-class. + /// \return zero on success + /// \throw std::exception possibly, depending on configuration + virtual int write(Value const& root) const = 0; +}; + +class JSON_API StreamWriterBuilder { +public: + virtual ~StreamWriterBuilder(); + /// Do not delete stream (i.e. not owned), but keep a reference. + virtual StreamWriter* newStreamWriter(std::ostream* stream) const; +}; + +class JSON_API StreamWriterBuilderFactory { +public: + virtual ~StreamWriterBuilderFactory(); + virtual StreamWriterBuilder* newStreamWriterBuilder(); +}; + +/// \brief Write into stringstream, then return string, for convenience. +std::string writeString(Value const& root, StreamWriterBuilder const& builder); + + /** \brief Abstract class for writers. */ class JSON_API Writer { diff --git a/src/lib_json/json_writer.cpp b/src/lib_json/json_writer.cpp index f1e3b58..3f53f94 100644 --- a/src/lib_json/json_writer.cpp +++ b/src/lib_json/json_writer.cpp @@ -7,13 +7,14 @@ #include #include "json_tool.h" #endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include #include #include +#include #include #include -#include -#include -#include #if defined(_MSC_VER) && _MSC_VER < 1500 // VC++ 8.0 and below #include @@ -670,4 +671,51 @@ std::ostream& operator<<(std::ostream& sout, const Value& root) { return sout; } +StreamWriter::StreamWriter(std::ostream* sout) + : sout_(*sout) +{ +} +StreamWriter::~StreamWriter() +{ +} +struct MyStreamWriter : public StreamWriter { +public: + MyStreamWriter(std::ostream* sout); + virtual ~MyStreamWriter(); + virtual int write(Value const& root) const = 0; +}; +MyStreamWriter::MyStreamWriter(std::ostream* sout) + : StreamWriter(sout) +{ +} +MyStreamWriter::~MyStreamWriter() +{ +} +int MyStreamWriter::write(Value const& root) const +{ + sout_ << root; + return 0; +} +StreamWriterBuilder::~StreamWriterBuilder() +{ +} +StreamWriter* StreamWriterBuilder::newStreamWriter(std::ostream* stream) const +{ + // return new StyledStreamWriter(stream); + return nullptr; +} +StreamWriterBuilderFactory::~StreamWriterBuilderFactory() +{ +} +StreamWriterBuilder* StreamWriterBuilderFactory::newStreamWriterBuilder() +{ + return new StreamWriterBuilder; +} +std::string writeString(Value const& root, StreamWriterBuilder const& builder) { + std::ostringstream sout; + std::unique_ptr const sw(builder.newStreamWriter(&sout)); + sw->write(root); + return sout.str(); +} + } // namespace Json