15 #ifndef RAPIDJSON_PRETTYWRITER_H_
16 #define RAPIDJSON_PRETTYWRITER_H_
22 RAPIDJSON_DIAG_OFF(effc++)
30 enum PrettyFormatOptions {
32 kFormatSingleLineArray = 1
42 template<
typename OutputStream,
typename SourceEncoding = UTF8<>,
typename TargetEncoding = UTF8<>,
typename StackAllocator = CrtAllocator,
unsigned writeFlags = kWriteDefaultFlags>
43 class PrettyWriter :
public Writer<OutputStream, SourceEncoding, TargetEncoding, StackAllocator, writeFlags> {
46 typedef typename Base::Ch Ch;
53 explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0,
size_t levelDepth = Base::kDefaultLevelDepth) :
54 Base(os, allocator, levelDepth), indentChar_(
' '), indentCharCount_(4), formatOptions_(kFormatDefault) {}
57 explicit PrettyWriter(StackAllocator* allocator = 0,
size_t levelDepth = Base::kDefaultLevelDepth) :
58 Base(allocator, levelDepth), indentChar_(
' '), indentCharCount_(4) {}
66 RAPIDJSON_ASSERT(indentChar ==
' ' || indentChar ==
'\t' || indentChar ==
'\n' || indentChar ==
'\r');
67 indentChar_ = indentChar;
68 indentCharCount_ = indentCharCount;
76 formatOptions_ = options;
85 bool Null() { PrettyPrefix(
kNullType);
return Base::WriteNull(); }
87 bool Int(
int i) { PrettyPrefix(
kNumberType);
return Base::WriteInt(i); }
88 bool Uint(
unsigned u) { PrettyPrefix(
kNumberType);
return Base::WriteUint(u); }
89 bool Int64(int64_t i64) { PrettyPrefix(
kNumberType);
return Base::WriteInt64(i64); }
90 bool Uint64(uint64_t u64) { PrettyPrefix(
kNumberType);
return Base::WriteUint64(u64); }
91 bool Double(
double d) { PrettyPrefix(
kNumberType);
return Base::WriteDouble(d); }
93 bool RawNumber(
const Ch* str,
SizeType length,
bool copy =
false) {
97 return Base::WriteString(str, length);
100 bool String(
const Ch* str,
SizeType length,
bool copy =
false) {
104 return Base::WriteString(str, length);
107 #if RAPIDJSON_HAS_STDSTRING
108 bool String(
const std::basic_string<Ch>& str) {
109 return String(str.data(),
SizeType(str.size()));
115 new (Base::level_stack_.template Push<typename Base::Level>())
typename Base::Level(
false);
116 return Base::WriteStartObject();
119 bool Key(
const Ch* str,
SizeType length,
bool copy =
false) {
return String(str, length, copy); }
121 #if RAPIDJSON_HAS_STDSTRING
122 bool Key(
const std::basic_string<Ch>& str) {
123 return Key(str.data(),
SizeType(str.size()));
127 bool EndObject(
SizeType memberCount = 0) {
129 RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >=
sizeof(
typename Base::Level));
130 RAPIDJSON_ASSERT(!Base::level_stack_.
template Top<typename Base::Level>()->inArray);
131 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
134 Base::os_->Put(
'\n');
137 bool ret = Base::WriteEndObject();
140 if (Base::level_stack_.Empty())
147 new (Base::level_stack_.template Push<typename Base::Level>())
typename Base::Level(
true);
148 return Base::WriteStartArray();
151 bool EndArray(
SizeType memberCount = 0) {
153 RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >=
sizeof(
typename Base::Level));
154 RAPIDJSON_ASSERT(Base::level_stack_.
template Top<typename Base::Level>()->inArray);
155 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
157 if (!empty && !(formatOptions_ & kFormatSingleLineArray)) {
158 Base::os_->Put(
'\n');
161 bool ret = Base::WriteEndArray();
164 if (Base::level_stack_.Empty())
175 bool String(
const Ch* str) {
return String(str, internal::StrLen(str)); }
176 bool Key(
const Ch* str) {
return Key(str, internal::StrLen(str)); }
192 return Base::WriteRawValue(json, length);
196 void PrettyPrefix(
Type type) {
198 if (Base::level_stack_.GetSize() != 0) {
199 typename Base::Level* level = Base::level_stack_.template Top<typename Base::Level>();
201 if (level->inArray) {
202 if (level->valueCount > 0) {
204 if (formatOptions_ & kFormatSingleLineArray)
208 if (!(formatOptions_ & kFormatSingleLineArray)) {
209 Base::os_->Put(
'\n');
214 if (level->valueCount > 0) {
215 if (level->valueCount % 2 == 0) {
217 Base::os_->Put(
'\n');
225 Base::os_->Put(
'\n');
227 if (level->valueCount % 2 == 0)
230 if (!level->inArray && level->valueCount % 2 == 0)
236 Base::hasRoot_ =
true;
241 size_t count = (Base::level_stack_.GetSize() /
sizeof(
typename Base::Level)) * indentCharCount_;
242 PutN(*Base::os_,
static_cast<typename TargetEncoding::Ch
>(indentChar_), count);
246 unsigned indentCharCount_;
247 PrettyFormatOptions formatOptions_;
261 #endif // RAPIDJSON_RAPIDJSON_H_