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) {}
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::WriteNull(); }
97 bool Int(
int i) { PrettyPrefix(
kNumberType);
return Base::WriteInt(i); }
98 bool Uint(
unsigned u) { PrettyPrefix(
kNumberType);
return Base::WriteUint(u); }
99 bool Int64(int64_t i64) { PrettyPrefix(
kNumberType);
return Base::WriteInt64(i64); }
100 bool Uint64(uint64_t u64) { PrettyPrefix(
kNumberType);
return Base::WriteUint64(u64); }
101 bool Double(
double d) { PrettyPrefix(
kNumberType);
return Base::WriteDouble(d); }
103 bool RawNumber(
const Ch* str,
SizeType length,
bool copy =
false) {
107 return Base::WriteString(str, length);
110 bool String(
const Ch* str,
SizeType length,
bool copy =
false) {
114 return Base::WriteString(str, length);
117 #if RAPIDJSON_HAS_STDSTRING 118 bool String(
const std::basic_string<Ch>& str) {
119 return String(str.data(),
SizeType(str.size()));
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 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
144 Base::os_->Put(
'\n');
147 bool ret = Base::WriteEndObject();
150 if (Base::level_stack_.Empty())
157 new (Base::level_stack_.template Push<typename Base::Level>())
typename Base::Level(
true);
158 return Base::WriteStartArray();
161 bool EndArray(
SizeType memberCount = 0) {
164 RAPIDJSON_ASSERT(Base::level_stack_.
template Top<typename Base::Level>()->inArray);
165 bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
167 if (!empty && !(formatOptions_ & kFormatSingleLineArray)) {
168 Base::os_->Put(
'\n');
171 bool ret = Base::WriteEndArray();
174 if (Base::level_stack_.Empty())
185 bool String(
const Ch* str) {
return String(str, internal::StrLen(str)); }
186 bool Key(
const Ch* str) {
return Key(str, internal::StrLen(str)); }
202 return Base::WriteRawValue(json, length);
206 void PrettyPrefix(
Type type) {
208 if (Base::level_stack_.GetSize() != 0) {
209 typename Base::Level* level = Base::level_stack_.template Top<typename Base::Level>();
214 if (formatOptions_ & kFormatSingleLineArray)
218 if (!(formatOptions_ & kFormatSingleLineArray)) {
219 Base::os_->Put(
'\n');
227 Base::os_->Put(
'\n');
235 Base::os_->Put(
'\n');
246 Base::hasRoot_ =
true;
251 size_t count = (Base::level_stack_.GetSize() /
sizeof(
typename Base::Level)) * indentCharCount_;
252 PutN(*Base::os_, static_cast<typename TargetEncoding::Ch>(indentChar_), count);
256 unsigned indentCharCount_;
257 PrettyFormatOptions formatOptions_;
267 #if defined(__clang__) 275 #endif // RAPIDJSON_RAPIDJSON_H_ bool RawValue(const Ch *json, size_t length, Type type)
Write a raw JSON value.
Definition: prettywriter.h:199
size_t valueCount
number of values in this level
Definition: writer.h:272
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:380
bool inArray
true if in array, otherwise in object
Definition: writer.h:273
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:402
JSON writer.
Definition: fwd.h:95
object
Definition: rapidjson.h:607
PrettyWriter & SetIndent(Ch indentChar, unsigned indentCharCount)
Set custom indentation.
Definition: prettywriter.h:75
bool String(const Ch *str)
Simpler but slower overload.
Definition: prettywriter.h:185
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition: rapidjson.h:119
array
Definition: rapidjson.h:608
false
Definition: rapidjson.h:605
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition: rapidjson.h:116
Information for each nested level.
Definition: writer.h:270
string
Definition: rapidjson.h:609
number
Definition: rapidjson.h:610
PrettyWriter(OutputStream &os, StackAllocator *allocator=0, size_t levelDepth=Base::kDefaultLevelDepth)
Constructor.
Definition: prettywriter.h:58
true
Definition: rapidjson.h:606
Type
Type of JSON value.
Definition: rapidjson.h:603
PrettyWriter & SetFormatOptions(PrettyFormatOptions options)
Set pretty writer formatting options.
Definition: prettywriter.h:85
Writer with indentation and spacing.
Definition: fwd.h:100
null
Definition: rapidjson.h:604