1 #ifndef RAPIDJSON_PRETTYWRITER_H_
2 #define RAPIDJSON_PRETTYWRITER_H_
14 template<
typename Stream,
typename Encoding = UTF8<>,
typename Allocator = MemoryPoolAllocator<> >
18 typedef typename Base::Ch Ch;
26 Base(stream, allocator, levelDepth), indentChar_(
' '), indentCharCount_(4) {}
34 RAPIDJSON_ASSERT(indentChar ==
' ' || indentChar ==
'\t' || indentChar ==
'\n' || indentChar ==
'\r');
35 indentChar_ = indentChar;
36 indentCharCount_ = indentCharCount;
43 PrettyWriter& Null() { PrettyPrefix(kNullType); Base::WriteNull();
return *
this; }
44 PrettyWriter& Bool(
bool b) { PrettyPrefix(b ? kTrueType : kFalseType); Base::WriteBool(b);
return *
this; }
45 PrettyWriter& Int(
int i) { PrettyPrefix(kNumberType); Base::WriteInt(i);
return *
this; }
46 PrettyWriter& Uint(
unsigned u) { PrettyPrefix(kNumberType); Base::WriteUint(u);
return *
this; }
47 PrettyWriter& Int64(int64_t i64) { PrettyPrefix(kNumberType); Base::WriteInt64(i64);
return *
this; }
48 PrettyWriter& Uint64(uint64_t u64) { PrettyPrefix(kNumberType); Base::WriteUint64(u64);
return *
this; }
51 PrettyWriter& String(
const Ch* str, SizeType length,
bool copy =
false) {
53 PrettyPrefix(kStringType);
54 Base::WriteString(str, length);
59 PrettyPrefix(kObjectType);
60 new (Base::level_stack_.template Push<typename Base::Level>())
typename Base::Level(
false);
61 Base::WriteStartObject();
67 RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >=
sizeof(
typename Base::Level));
68 RAPIDJSON_ASSERT(!Base::level_stack_.
template Top<typename Base::Level>()->inArray);
69 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
72 Base::stream_.Put(
'\n');
75 Base::WriteEndObject();
80 PrettyPrefix(kArrayType);
81 new (Base::level_stack_.template Push<typename Base::Level>())
typename Base::Level(
true);
82 Base::WriteStartArray();
88 RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >=
sizeof(
typename Base::Level));
89 RAPIDJSON_ASSERT(Base::level_stack_.
template Top<typename Base::Level>()->inArray);
90 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
93 Base::stream_.Put(
'\n');
96 Base::WriteEndArray();
106 void PrettyPrefix(Type type) {
108 if (Base::level_stack_.GetSize() != 0) {
109 typename Base::Level* level = Base::level_stack_.template Top<typename Base::Level>();
111 if (level->inArray) {
112 if (level->valueCount > 0) {
113 Base::stream_.Put(
',');
114 Base::stream_.Put(
'\n');
117 Base::stream_.Put(
'\n');
121 if (level->valueCount > 0) {
122 if (level->valueCount % 2 == 0) {
123 Base::stream_.Put(
',');
124 Base::stream_.Put(
'\n');
127 Base::stream_.Put(
':');
128 Base::stream_.Put(
' ');
132 Base::stream_.Put(
'\n');
134 if (level->valueCount % 2 == 0)
137 if (!level->inArray && level->valueCount % 2 == 0)
138 RAPIDJSON_ASSERT(type == kStringType);
142 RAPIDJSON_ASSERT(type == kObjectType || type == kArrayType);
146 size_t count = (Base::level_stack_.GetSize() /
sizeof(
typename Base::Level)) * indentCharCount_;
147 PutN(Base::stream_, indentChar_, count);
151 unsigned indentCharCount_;
156 #endif // RAPIDJSON_RAPIDJSON_H_