Skip to content

Commit 489707f

Browse files
committed
StreamWriter::Builder
1 parent 5fbfe3c commit 489707f

File tree

2 files changed

+63
-12
lines changed

2 files changed

+63
-12
lines changed

include/json/writer.h

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,53 @@
2222
namespace Json {
2323

2424
class Value;
25+
class StreamWriterBuilder;
26+
27+
/**
28+
29+
Usage:
30+
31+
using namespace Json;
32+
Value value;
33+
StreamWriterBuilderFactory f;
34+
StreamWriter::Builder builder(&f);
35+
builder.setCommentStyle(StreamWriter::CommentStyle::None);
36+
std::shared_ptr<StreamWriter> writer(builder.newStreamWriter(&std::cout));
37+
writer.write(value);
38+
*/
39+
class JSON_API StreamWriterBuilderFactory {
40+
public:
41+
virtual ~StreamWriterBuilderFactory();
42+
virtual StreamWriterBuilder* newStreamWriterBuilder() const;
43+
};
2544

2645
class JSON_API StreamWriter {
2746
protected:
2847
std::ostream& sout_; // not owned; will not delete
2948
public:
49+
enum class CommentStyle {None, Some, All};
50+
3051
StreamWriter(std::ostream* sout);
3152
virtual ~StreamWriter();
3253
/// Write Value into document as configured in sub-class.
3354
/// \return zero on success
3455
/// \throw std::exception possibly, depending on configuration
3556
virtual int write(Value const& root) const = 0;
36-
};
3757

38-
class JSON_API StreamWriterBuilder {
39-
public:
40-
virtual ~StreamWriterBuilder();
41-
/// Do not delete stream (i.e. not owned), but keep a reference.
42-
virtual StreamWriter* newStreamWriter(std::ostream* stream) const;
43-
};
58+
/// Because this Builder is non-virtual, we can safely add
59+
/// methods without a major version bump.
60+
/// \see http://stackoverflow.com/questions/14875052/pure-virtual-functions-and-binary-compatibility
61+
class Builder {
62+
StreamWriterBuilder* own_;
63+
public:
64+
Builder(StreamWriterBuilderFactory const*);
65+
~Builder(); // delete underlying StreamWriterBuilder
4466

45-
class JSON_API StreamWriterBuilderFactory {
46-
public:
47-
virtual ~StreamWriterBuilderFactory();
48-
virtual StreamWriterBuilder* newStreamWriterBuilder();
67+
void setCommentStyle(CommentStyle cs); /// default: All
68+
69+
/// Do not take ownership of sout, but maintain a reference.
70+
StreamWriter* newStreamWriter(std::ostream* sout);
71+
};
4972
};
5073

5174
/// \brief Write into stringstream, then return string, for convenience.

src/lib_json/json_writer.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -696,9 +696,21 @@ int MyStreamWriter::write(Value const& root) const
696696
sout_ << root;
697697
return 0;
698698
}
699+
class StreamWriterBuilder {
700+
typedef StreamWriter::CommentStyle CommentStyle;
701+
CommentStyle cs_;
702+
public:
703+
virtual ~StreamWriterBuilder();
704+
virtual void setCommentStyle(CommentStyle cs);
705+
virtual StreamWriter* newStreamWriter(std::ostream* sout) const;
706+
};
699707
StreamWriterBuilder::~StreamWriterBuilder()
700708
{
701709
}
710+
void StreamWriterBuilder::setCommentStyle(CommentStyle cs)
711+
{
712+
cs_ = cs;
713+
}
702714
StreamWriter* StreamWriterBuilder::newStreamWriter(std::ostream* stream) const
703715
{
704716
// return new StyledStreamWriter(stream);
@@ -707,10 +719,26 @@ StreamWriter* StreamWriterBuilder::newStreamWriter(std::ostream* stream) const
707719
StreamWriterBuilderFactory::~StreamWriterBuilderFactory()
708720
{
709721
}
710-
StreamWriterBuilder* StreamWriterBuilderFactory::newStreamWriterBuilder()
722+
StreamWriterBuilder* StreamWriterBuilderFactory::newStreamWriterBuilder() const
711723
{
712724
return new StreamWriterBuilder;
713725
}
726+
727+
StreamWriter::Builder::Builder(StreamWriterBuilderFactory const* f)
728+
: own_(f->newStreamWriterBuilder())
729+
{
730+
}
731+
StreamWriter::Builder::~Builder()
732+
{
733+
delete own_;
734+
}
735+
void StreamWriter::Builder::setCommentStyle(CommentStyle cs)
736+
{
737+
own_->setCommentStyle(cs);
738+
}
739+
740+
/// Do not take ownership of sout, but maintain a reference.
741+
StreamWriter* newStreamWriter(std::ostream* sout);
714742
std::string writeString(Value const& root, StreamWriterBuilder const& builder) {
715743
std::ostringstream sout;
716744
std::unique_ptr<StreamWriter> const sw(builder.newStreamWriter(&sout));

0 commit comments

Comments
 (0)