1 #ifndef RAPIDJSON_PRETTYWRITER_H_
2 #define RAPIDJSON_PRETTYWRITER_H_
8 RAPIDJSON_DIAG_OFF(effc++)
20 template<
typename OutputStream,
typename SourceEncoding = UTF8<>,
typename TargetEncoding = UTF8<>,
typename Allocator = MemoryPoolAllocator<> >
24 typedef typename Base::Ch Ch;
32 Base(os, allocator, levelDepth), indentChar_(
' '), indentCharCount_(4) {}
43 RAPIDJSON_ASSERT(indentChar ==
' ' || indentChar ==
'\t' || indentChar ==
'\n' || indentChar ==
'\r');
44 indentChar_ = indentChar;
45 indentCharCount_ = indentCharCount;
54 bool Null() { PrettyPrefix(
kNullType);
return Base::WriteNull(); }
56 bool Int(
int i) { PrettyPrefix(
kNumberType);
return Base::WriteInt(i); }
57 bool Uint(
unsigned u) { PrettyPrefix(
kNumberType);
return Base::WriteUint(u); }
58 bool Int64(int64_t i64) { PrettyPrefix(
kNumberType);
return Base::WriteInt64(i64); }
59 bool Uint64(uint64_t u64) { PrettyPrefix(
kNumberType);
return Base::WriteUint64(u64); }
62 bool String(
const Ch* str,
SizeType length,
bool copy =
false) {
65 return Base::WriteString(str, length);
70 new (Base::level_stack_.template Push<typename Base::Level>())
typename Base::Level(
false);
71 return Base::WriteStartObject();
74 bool EndObject(
SizeType memberCount = 0) {
76 RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >=
sizeof(
typename Base::Level));
77 RAPIDJSON_ASSERT(!Base::level_stack_.
template Top<typename Base::Level>()->inArray);
78 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
84 if (!Base::WriteEndObject())
86 if (Base::level_stack_.Empty())
93 new (Base::level_stack_.template Push<typename Base::Level>())
typename Base::Level(
true);
94 return Base::WriteStartArray();
97 bool EndArray(
SizeType memberCount = 0) {
99 RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >=
sizeof(
typename Base::Level));
100 RAPIDJSON_ASSERT(Base::level_stack_.
template Top<typename Base::Level>()->inArray);
101 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
104 Base::os_->Put(
'\n');
107 if (!Base::WriteEndArray())
109 if (Base::level_stack_.Empty())
120 bool String(
const Ch* str) {
return String(str, internal::StrLen(str)); }
126 bool ret = Double(d);
133 void PrettyPrefix(
Type type) {
135 if (Base::level_stack_.GetSize() != 0) {
136 typename Base::Level* level = Base::level_stack_.template Top<typename Base::Level>();
138 if (level->inArray) {
139 if (level->valueCount > 0) {
141 Base::os_->Put(
'\n');
144 Base::os_->Put(
'\n');
148 if (level->valueCount > 0) {
149 if (level->valueCount % 2 == 0) {
151 Base::os_->Put(
'\n');
159 Base::os_->Put(
'\n');
161 if (level->valueCount % 2 == 0)
164 if (!level->inArray && level->valueCount % 2 == 0)
171 Base::hasRoot_ =
true;
176 size_t count = (Base::level_stack_.GetSize() /
sizeof(
typename Base::Level)) * indentCharCount_;
177 PutN(*Base::os_, indentChar_, count);
181 unsigned indentCharCount_;
195 #endif // RAPIDJSON_RAPIDJSON_H_