1#ifndef SIMDJSON_SERIALIZATION_H
2#define SIMDJSON_SERIALIZATION_H
4#include "simdjson/dom/base.h"
5#include "simdjson/dom/element.h"
6#include "simdjson/dom/object.h"
17template <
class formatter>
class base_formatter {
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;
54 simdjson_inline
void one_char(
char c);
57 simdjson_inline
void chars(
const char *begin,
const char *end);
59 simdjson_inline
void call_print_newline() {
60 static_cast<formatter *
>(
this)->print_newline();
63 simdjson_inline
void call_print_indents(
size_t depth) {
64 static_cast<formatter *
>(
this)->print_indents(depth);
67 simdjson_inline
void call_print_space() {
68 static_cast<formatter *
>(
this)->print_space();
74 struct vector_with_small_buffer {
75 vector_with_small_buffer() =
default;
76 ~vector_with_small_buffer() { free_buffer(); }
78 vector_with_small_buffer(
const vector_with_small_buffer &) =
delete;
79 vector_with_small_buffer &
80 operator=(
const vector_with_small_buffer &) =
delete;
84 capacity = StaticCapacity;
89 simdjson_inline
void push_back(
char c) {
90 if (capacity < size + 1)
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)
99 grow(new_size < capacity * 2 ? capacity * 2 : new_size);
100 std::copy(begin, end, buffer + size);
104 std::string_view str()
const {
return std::string_view(buffer, size); }
111 void grow(
size_t new_capacity) {
112 auto new_buffer =
new char[new_capacity];
113 std::copy(buffer, buffer + size, new_buffer);
116 capacity = new_capacity;
119 static const size_t StaticCapacity = 64;
120 char array[StaticCapacity];
121 char *buffer =
array;
123 size_t capacity = StaticCapacity;
132class mini_formatter :
public base_formatter<mini_formatter> {
134 simdjson_inline
void print_newline();
136 simdjson_inline
void print_indents(
size_t depth);
138 simdjson_inline
void print_space();
141class pretty_formatter :
public base_formatter<pretty_formatter> {
143 simdjson_inline
void print_newline();
145 simdjson_inline
void print_indents(
size_t depth);
147 simdjson_inline
void print_space();
163template <
class formatter = mini_formatter>
class string_builder {
166 string_builder() =
default;
174 simdjson_inline
void clear();
182 simdjson_inline std::string_view str()
const;
202inline std::ostream &operator<<(std::ostream &out,
204#if SIMDJSON_EXCEPTIONS
206operator<<(std::ostream &out,
218#if SIMDJSON_EXCEPTIONS
220operator<<(std::ostream &out,
232#if SIMDJSON_EXCEPTIONS
234operator<<(std::ostream &out,
251 simdjson::internal::string_builder<> sb;
253 std::string_view answer = sb.str();
254 return std::string(answer.data(), answer.size());
256#if SIMDJSON_EXCEPTIONS
257template <
class T> std::string to_string(simdjson_result<T> x) {
259 throw simdjson_error(x.error());
276#if SIMDJSON_EXCEPTIONS
277template <
class T> std::string
minify(simdjson_result<T> x) {
279 throw simdjson_error(x.error());
304 simdjson::internal::string_builder<simdjson::internal::pretty_formatter> sb;
306 std::string_view answer = sb.str();
307 return std::string(answer.data(), answer.size());
310#if SIMDJSON_EXCEPTIONS
311template <
class T> std::string
prettify(simdjson_result<T> x) {
313 throw simdjson_error(x.error());
Key/value pair in an object.
@ number
A JSON number ( 1 or -2.3 or 4.5e6 ...)
@ array
A JSON array ( [ 1, 2, 3 ... ] )
The top level simdjson namespace, containing everything the library provides.
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.