simdjson 4.1.0
Ridiculously Fast JSON
Loading...
Searching...
No Matches
serialization.h
1#ifndef SIMDJSON_SERIALIZATION_H
2#define SIMDJSON_SERIALIZATION_H
3
4#include "simdjson/dom/base.h"
5#include "simdjson/dom/element.h"
6#include "simdjson/dom/object.h"
7
8namespace simdjson {
9
15namespace internal {
16
17template <class formatter> class base_formatter {
18public:
20 simdjson_inline void comma();
22 simdjson_inline void start_array();
24 simdjson_inline void end_array();
26 simdjson_inline void start_object();
28 simdjson_inline void end_object();
30 simdjson_inline void true_atom();
32 simdjson_inline void false_atom();
34 simdjson_inline void null_atom();
36 simdjson_inline void number(int64_t x);
38 simdjson_inline void number(uint64_t x);
40 simdjson_inline void number(double x);
42 simdjson_inline void key(std::string_view unescaped);
44 simdjson_inline void string(std::string_view unescaped);
46 simdjson_inline void clear();
51 simdjson_inline std::string_view str() const;
52
54 simdjson_inline void one_char(char c);
55
57 simdjson_inline void chars(const char *begin, const char *end);
58
59 simdjson_inline void call_print_newline() {
60 static_cast<formatter *>(this)->print_newline();
61 }
62
63 simdjson_inline void call_print_indents(size_t depth) {
64 static_cast<formatter *>(this)->print_indents(depth);
65 }
66
67 simdjson_inline void call_print_space() {
68 static_cast<formatter *>(this)->print_space();
69 }
70
71protected:
72 // implementation details (subject to change)
74 struct vector_with_small_buffer {
75 vector_with_small_buffer() = default;
76 ~vector_with_small_buffer() { free_buffer(); }
77
78 vector_with_small_buffer(const vector_with_small_buffer &) = delete;
79 vector_with_small_buffer &
80 operator=(const vector_with_small_buffer &) = delete;
81
82 void clear() {
83 size = 0;
84 capacity = StaticCapacity;
85 free_buffer();
86 buffer = array;
87 }
88
89 simdjson_inline void push_back(char c) {
90 if (capacity < size + 1)
91 grow(capacity * 2);
92 buffer[size++] = c;
93 }
94
95 simdjson_inline void append(const char *begin, const char *end) {
96 const size_t new_size = size + (end - begin);
97 if (capacity < new_size)
98 // std::max(new_size, capacity * 2); is broken in tests on Windows
99 grow(new_size < capacity * 2 ? capacity * 2 : new_size);
100 std::copy(begin, end, buffer + size);
101 size = new_size;
102 }
103
104 std::string_view str() const { return std::string_view(buffer, size); }
105
106 private:
107 void free_buffer() {
108 if (buffer != array)
109 delete[] buffer;
110 }
111 void grow(size_t new_capacity) {
112 auto new_buffer = new char[new_capacity];
113 std::copy(buffer, buffer + size, new_buffer);
114 free_buffer();
115 buffer = new_buffer;
116 capacity = new_capacity;
117 }
118
119 static const size_t StaticCapacity = 64;
120 char array[StaticCapacity];
121 char *buffer = array;
122 size_t size = 0;
123 size_t capacity = StaticCapacity;
124 } buffer{};
125};
126
132class mini_formatter : public base_formatter<mini_formatter> {
133public:
134 simdjson_inline void print_newline();
135
136 simdjson_inline void print_indents(size_t depth);
137
138 simdjson_inline void print_space();
139};
140
141class pretty_formatter : public base_formatter<pretty_formatter> {
142public:
143 simdjson_inline void print_newline();
144
145 simdjson_inline void print_indents(size_t depth);
146
147 simdjson_inline void print_space();
148
149protected:
150 int indent_step = 4;
151};
152
163template <class formatter = mini_formatter> class string_builder {
164public:
166 string_builder() = default;
168 inline void append(simdjson::dom::element value);
170 inline void append(simdjson::dom::array value);
172 inline void append(simdjson::dom::object value);
174 simdjson_inline void clear();
182 simdjson_inline std::string_view str() const;
184 simdjson_inline void append(simdjson::dom::key_value_pair value);
185
186private:
187 formatter format{};
188};
189
190} // namespace internal
191
192namespace dom {
193
202inline std::ostream &operator<<(std::ostream &out,
204#if SIMDJSON_EXCEPTIONS
205inline std::ostream &
206operator<<(std::ostream &out,
208#endif
217inline std::ostream &operator<<(std::ostream &out, simdjson::dom::array value);
218#if SIMDJSON_EXCEPTIONS
219inline std::ostream &
220operator<<(std::ostream &out,
222#endif
231inline std::ostream &operator<<(std::ostream &out, simdjson::dom::object value);
232#if SIMDJSON_EXCEPTIONS
233inline std::ostream &
234operator<<(std::ostream &out,
236#endif
237} // namespace dom
238
247template <class T> std::string to_string(T x) {
248 // in C++, to_string is standard:
249 // http://www.cplusplus.com/reference/string/to_string/ Currently minify and
250 // to_string are identical but in the future, they may differ.
251 simdjson::internal::string_builder<> sb;
252 sb.append(x);
253 std::string_view answer = sb.str();
254 return std::string(answer.data(), answer.size());
255}
256#if SIMDJSON_EXCEPTIONS
257template <class T> std::string to_string(simdjson_result<T> x) {
258 if (x.error()) {
259 throw simdjson_error(x.error());
260 }
261 return to_string(x.value());
262}
263#endif
264
274template <class T> std::string minify(T x) { return to_string(x); }
275
276#if SIMDJSON_EXCEPTIONS
277template <class T> std::string minify(simdjson_result<T> x) {
278 if (x.error()) {
279 throw simdjson_error(x.error());
280 }
281 return to_string(x.value());
282}
283#endif
284
303template <class T> std::string prettify(T x) {
304 simdjson::internal::string_builder<simdjson::internal::pretty_formatter> sb;
305 sb.append(x);
306 std::string_view answer = sb.str();
307 return std::string(answer.data(), answer.size());
308}
309
310#if SIMDJSON_EXCEPTIONS
311template <class T> std::string prettify(simdjson_result<T> x) {
312 if (x.error()) {
313 throw simdjson_error(x.error());
314 }
315 return to_string(x.value());
316}
317#endif
318
319} // namespace simdjson
320
321#endif
JSON array.
Definition array.h:15
A JSON element.
Definition element.h:33
Key/value pair in an object.
Definition object.h:258
JSON object.
Definition object.h:16
@ number
A JSON number ( 1 or -2.3 or 4.5e6 ...)
The top level simdjson namespace, containing everything the library provides.
Definition base.h:8
std::string to_string(T x)
Converts JSON to a string.
std::string minify(T x)
Minifies a JSON element or document, printing the smallest possible valid JSON.
std::string prettify(T x)
Prettifies a JSON element or document, printing the valid JSON with indentation.
The result of a simdjson operation that could fail.
Definition error.h:278