prettywriter.h
Go to the documentation of this file.
1 #ifndef RAPIDJSON_PRETTYWRITER_H_
2 #define RAPIDJSON_PRETTYWRITER_H_
3 
4 #include "writer.h"
5 
6 namespace rapidjson {
7 
9 
14 template<typename Stream, typename Encoding = UTF8<>, typename Allocator = MemoryPoolAllocator<> >
15 class PrettyWriter : public Writer<Stream, Encoding, Allocator> {
16 public:
18  typedef typename Base::Ch Ch;
19 
21 
25  PrettyWriter(Stream& stream, int precision = 20, Allocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) :
26  Base(stream, precision, allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {}
27 
29 
33  PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) {
34  RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r');
35  indentChar_ = indentChar;
36  indentCharCount_ = indentCharCount;
37  return *this;
38  }
39 
40  //@name Implementation of Handler.
42 
46  PrettyWriter& Uint(unsigned u) { PrettyPrefix(kNumberType); Base::WriteUint(u); return *this; }
49  PrettyWriter& Double(double d) { PrettyPrefix(kNumberType); Base::WriteDouble(d); return *this; }
50 
51  PrettyWriter& String(const Ch* str, SizeType length, bool copy = false) {
52  (void)copy;
54  Base::WriteString(str, length);
55  return *this;
56  }
57 
60  new (Base::level_stack_.template Push<typename Base::Level>()) typename Base::Level(false);
62  return *this;
63  }
64 
65  PrettyWriter& EndObject(SizeType memberCount = 0) {
66  (void)memberCount;
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;
70 
71  if (!empty) {
72  Base::stream_.Put('\n');
73  WriteIndent();
74  }
76  return *this;
77  }
78 
81  new (Base::level_stack_.template Push<typename Base::Level>()) typename Base::Level(true);
83  return *this;
84  }
85 
86  PrettyWriter& EndArray(SizeType memberCount = 0) {
87  (void)memberCount;
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;
91 
92  if (!empty) {
93  Base::stream_.Put('\n');
94  WriteIndent();
95  }
97  return *this;
98  }
99 
101 
104 
105 protected:
107  (void)type;
108  if (Base::level_stack_.GetSize() != 0) { // this value is not at root
109  typename Base::Level* level = Base::level_stack_.template Top<typename Base::Level>();
110 
111  if (level->inArray) {
112  if (level->valueCount > 0) {
113  Base::stream_.Put(','); // add comma if it is not the first element in array
114  Base::stream_.Put('\n');
115  }
116  else
117  Base::stream_.Put('\n');
118  WriteIndent();
119  }
120  else { // in object
121  if (level->valueCount > 0) {
122  if (level->valueCount % 2 == 0) {
123  Base::stream_.Put(',');
124  Base::stream_.Put('\n');
125  }
126  else {
127  Base::stream_.Put(':');
128  Base::stream_.Put(' ');
129  }
130  }
131  else
132  Base::stream_.Put('\n');
133 
134  if (level->valueCount % 2 == 0)
135  WriteIndent();
136  }
137  if (!level->inArray && level->valueCount % 2 == 0)
138  RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name
139  level->valueCount++;
140  }
141  else
143  }
144 
145  void WriteIndent() {
146  size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_;
147  PutN(Base::stream_, indentChar_, count);
148  }
149 
152 };
153 
154 } // namespace rapidjson
155 
156 #endif // RAPIDJSON_RAPIDJSON_H_
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Scalar * b
Definition: benchVecAdd.cpp:17
Concept for allocating, resizing and freeing memory block.
Writer with indentation and spacing.
Definition: prettywriter.h:15
PrettyWriter & SetIndent(Ch indentChar, unsigned indentCharCount)
Set custom indentation.
Definition: prettywriter.h:33
PrettyWriter & Null_()
Definition: prettywriter.h:43
Writer< Stream, Encoding, Allocator > Base
Definition: prettywriter.h:17
PrettyWriter & EndObject(SizeType memberCount=0)
Definition: prettywriter.h:65
PrettyWriter & StartObject()
Definition: prettywriter.h:58
PrettyWriter & Uint64(uint64_t u64)
Definition: prettywriter.h:48
void WriteIndent()
Definition: prettywriter.h:145
PrettyWriter & Int(int i)
Definition: prettywriter.h:45
PrettyWriter & String(const Ch *str, SizeType length, bool copy=false)
Definition: prettywriter.h:51
unsigned indentCharCount_
Definition: prettywriter.h:151
Base::Ch Ch
Definition: prettywriter.h:18
PrettyWriter & String(const Ch *str)
Simpler but slower overload.
Definition: prettywriter.h:103
PrettyWriter(Stream &stream, int precision=20, Allocator *allocator=0, size_t levelDepth=Base::kDefaultLevelDepth)
Constructor.
Definition: prettywriter.h:25
PrettyWriter & Int64(int64_t i64)
Definition: prettywriter.h:47
Ch indentChar_
Definition: prettywriter.h:150
PrettyWriter & EndArray(SizeType memberCount=0)
Definition: prettywriter.h:86
PrettyWriter & Bool_(bool b)
Definition: prettywriter.h:44
PrettyWriter & Double(double d)
Definition: prettywriter.h:49
PrettyWriter & StartArray()
Definition: prettywriter.h:79
PrettyWriter & Uint(unsigned u)
Definition: prettywriter.h:46
void PrettyPrefix(Type type)
Definition: prettywriter.h:106
Concept for reading and writing characters.
JSON writer.
Definition: writer.h:33
void WriteStartArray()
Definition: writer.h:295
void WriteString(const Ch *str, SizeType length)
Definition: writer.h:260
static const size_t kDefaultLevelDepth
Definition: writer.h:120
void WriteDouble(double d)
Definition: writer.h:212
void WriteUint(unsigned u)
Definition: writer.h:143
void WriteInt64(int64_t i64)
Definition: writer.h:157
void WriteStartObject()
Definition: writer.h:293
Encoding::Ch Ch
Definition: writer.h:35
void WriteBool_(bool b)
Definition: writer.h:126
void WriteUint64(uint64_t u64)
Definition: writer.h:165
internal::Stack< Allocator > level_stack_
Definition: writer.h:317
Stream & stream_
Definition: writer.h:316
void WriteNull_()
Definition: writer.h:122
void WriteEndObject()
Definition: writer.h:294
void WriteInt(int i)
Definition: writer.h:135
void WriteEndArray()
Definition: writer.h:296
EIGEN_BLAS_FUNC() copy(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
Definition: level1_impl.h:32
std::int64_t int64_t
Definition: Meta.h:43
std::uint64_t uint64_t
Definition: Meta.h:42
type
Definition: compute_granudrum_aor.py:141
str
Definition: compute_granudrum_aor.py:141
SizeType StrLen(const Ch *s)
Custom strlen() which works on different character types.
Definition: strfunc.h:14
Definition: document.h:13
void PutN(GenericWriteStream &stream, char c, size_t n)
Definition: genericstream.h:88
Type
Type of JSON value.
Definition: rapidjson.h:513
@ kArrayType
array
Definition: rapidjson.h:518
@ kNull_Type
null
Definition: rapidjson.h:514
@ kTrueType
true
Definition: rapidjson.h:516
@ kFalseType
false
Definition: rapidjson.h:515
@ kNumberType
number
Definition: rapidjson.h:520
@ kObjectType
object
Definition: rapidjson.h:517
@ kStringType
string
Definition: rapidjson.h:519
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:80
Information for each nested level.
Definition: writer.h:114
size_t valueCount
number of values in this level
Definition: writer.h:117
bool inArray
true if in array, otherwise in object
Definition: writer.h:116