15 #ifndef RAPIDJSON_PRETTYWRITER_H_ 16 #define RAPIDJSON_PRETTYWRITER_H_ 22 RAPIDJSON_DIAG_OFF(effc++)
25 #if defined(__clang__) 27 RAPIDJSON_DIAG_OFF(c++98-compat)
35 enum PrettyFormatOptions {
37 kFormatSingleLineArray = 1
47 template<
typename OutputStream,
typename SourceEncoding = UTF8<>,
typename TargetEncoding = UTF8<>,
typename StackAllocator = CrtAllocator,
unsigned writeFlags = kWriteDefaultFlags>
48 class PrettyWriter :
public Writer<OutputStream, SourceEncoding, TargetEncoding, StackAllocator, writeFlags> {
51 typedef typename Base::Ch Ch;
58 explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0,
size_t levelDepth = Base::kDefaultLevelDepth) :
59 Base(os, allocator, levelDepth), indentChar_(
' '), indentCharCount_(4), formatOptions_(kFormatDefault) {}
62 explicit PrettyWriter(StackAllocator* allocator = 0,
size_t levelDepth = Base::kDefaultLevelDepth) :
63 Base(allocator, levelDepth), indentChar_(
' '), indentCharCount_(4), formatOptions_(kFormatDefault) {}
65 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS 67 Base(std::forward<PrettyWriter>(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {}
76 RAPIDJSON_ASSERT(indentChar ==
' ' || indentChar ==
'\t' || indentChar ==
'\n' || indentChar ==
'\r');
77 indentChar_ = indentChar;
78 indentCharCount_ = indentCharCount;
86 formatOptions_ = options;
95 bool Null() { PrettyPrefix(kNullType);
return Base::EndValue(Base::WriteNull()); }
96 bool Bool(
bool b) { PrettyPrefix(b ? kTrueType : kFalseType);
return Base::EndValue(Base::WriteBool(b)); }
97 bool Int(
int i) { PrettyPrefix(kNumberType);
return Base::EndValue(Base::WriteInt(i)); }
98 bool Uint(
unsigned u) { PrettyPrefix(kNumberType);
return Base::EndValue(Base::WriteUint(u)); }
99 bool Int64(int64_t i64) { PrettyPrefix(kNumberType);
return Base::EndValue(Base::WriteInt64(i64)); }
100 bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType);
return Base::EndValue(Base::WriteUint64(u64)); }
101 bool Double(
double d) { PrettyPrefix(kNumberType);
return Base::EndValue(Base::WriteDouble(d)); }
103 bool RawNumber(
const Ch* str, SizeType length,
bool copy =
false) {
106 PrettyPrefix(kNumberType);
107 return Base::EndValue(Base::WriteString(str, length));
110 bool String(
const Ch* str, SizeType length,
bool copy =
false,
bool raw =
false) {
113 PrettyPrefix(kStringType);
114 return Base::EndValue(Base::WriteString(str, length, raw));
117 #if RAPIDJSON_HAS_STDSTRING 118 bool String(
const std::basic_string<Ch>& str) {
119 return String(str.data(), SizeType(str.size()));
124 PrettyPrefix(kObjectType);
125 new (Base::level_stack_.template Push<typename Base::Level>())
typename Base::Level(
false);
126 return Base::WriteStartObject();
129 bool Key(
const Ch* str, SizeType length,
bool copy =
false) {
return String(str, length, copy); }
131 #if RAPIDJSON_HAS_STDSTRING 132 bool Key(
const std::basic_string<Ch>& str) {
133 return Key(str.data(), SizeType(str.size()));
137 bool EndObject(SizeType memberCount = 0) {
140 RAPIDJSON_ASSERT(!Base::level_stack_.
template Top<typename Base::Level>()->inArray);
141 RAPIDJSON_ASSERT(0 == Base::level_stack_.
template Top<typename Base::Level>()->valueCount % 2);
143 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
146 Base::os_->Put(
'\n');
149 bool ret = Base::EndValue(Base::WriteEndObject());
152 if (Base::level_stack_.Empty())
158 PrettyPrefix(kArrayType);
159 new (Base::level_stack_.template Push<typename Base::Level>())
typename Base::Level(
true);
160 return Base::WriteStartArray();
163 bool EndArray(SizeType memberCount = 0) {
166 RAPIDJSON_ASSERT(Base::level_stack_.
template Top<typename Base::Level>()->inArray);
167 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
169 if (!empty && !(formatOptions_ & kFormatSingleLineArray)) {
170 Base::os_->Put(
'\n');
173 bool ret = Base::EndValue(Base::WriteEndArray());
176 if (Base::level_stack_.Empty())
187 bool String(
const Ch* str) {
return String(str, internal::StrLen(str)); }
188 bool Key(
const Ch* str) {
return Key(str, internal::StrLen(str)); }
201 bool RawValue(
const Ch* json,
size_t length, Type type) {
204 return Base::EndValue(Base::WriteRawValue(json, length));
208 void PrettyPrefix(Type type) {
210 if (Base::level_stack_.GetSize() != 0) {
211 typename Base::Level* level = Base::level_stack_.template Top<typename Base::Level>();
216 if (formatOptions_ & kFormatSingleLineArray)
220 if (!(formatOptions_ & kFormatSingleLineArray)) {
221 Base::os_->Put(
'\n');
229 Base::os_->Put(
'\n');
237 Base::os_->Put(
'\n');
248 Base::hasRoot_ =
true;
253 size_t count = (Base::level_stack_.GetSize() /
sizeof(
typename Base::Level)) * indentCharCount_;
254 PutN(*Base::os_, static_cast<typename OutputStream::Ch>(indentChar_), count);
258 unsigned indentCharCount_;
259 PrettyFormatOptions formatOptions_;
269 #if defined(__clang__) 277 #endif // RAPIDJSON_RAPIDJSON_H_ PrettyWriter(OutputStream &os, StackAllocator *allocator=0, size_t levelDepth=Base::kDefaultLevelDepth)
Constructor.
Definition: prettywriter.h:58
size_t valueCount
number of values in this level
Definition: writer.h:292
bool String(const Ch *str)
Simpler but slower overload.
Definition: prettywriter.h:187
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition: rapidjson.h:121
JSON writer.
Definition: fwd.h:95
void Flush()
Flush the output stream.
Definition: writer.h:282
PrettyWriter & SetFormatOptions(PrettyFormatOptions options)
Set pretty writer formatting options.
Definition: prettywriter.h:85
Writer with indentation and spacing.
Definition: fwd.h:100
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition: rapidjson.h:124
PrettyWriter & SetIndent(Ch indentChar, unsigned indentCharCount)
Set custom indentation.
Definition: prettywriter.h:75
bool RawValue(const Ch *json, size_t length, Type type)
Write a raw JSON value.
Definition: prettywriter.h:201
Information for each nested level.
Definition: writer.h:290
bool inArray
true if in array, otherwise in object
Definition: writer.h:293
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:437