simdjson 5.0.2
Ridiculously Fast JSON
Loading...
Searching...
No Matches
fractured_formatter.h
1#ifndef SIMDJSON_INTERNAL_FRACTURED_FORMATTER_H
2#define SIMDJSON_INTERNAL_FRACTURED_FORMATTER_H
3
4#include "simdjson/dom/serialization.h"
5#include "simdjson/dom/fractured_json.h"
6#include "simdjson/internal/json_structure_analyzer.h"
7
8namespace simdjson {
9namespace internal {
10
18class fractured_formatter : public base_formatter<fractured_formatter> {
19public:
20 explicit fractured_formatter(const fractured_json_options& opts = {});
21
23 simdjson_inline void print_newline();
24
26 simdjson_inline void print_indents(size_t depth);
27
29 simdjson_inline void print_space();
30
32 void set_layout_mode(layout_mode mode);
33
35 layout_mode get_layout_mode() const;
36
38 void track_line_length(size_t chars);
39
41 bool should_break_line(size_t upcoming_length) const;
42
44 const fractured_json_options& options() const;
45
46private:
47 fractured_json_options options_;
48 layout_mode current_layout_ = layout_mode::expanded;
49 size_t current_line_length_ = 0;
50};
51
53class scoped_single_line_mode {
54public:
55 explicit scoped_single_line_mode(fractured_formatter& format)
56 : format_(format), prev_(format.get_layout_mode()) {
57 format_.set_layout_mode(layout_mode::single_line);
58 }
59 ~scoped_single_line_mode() { format_.set_layout_mode(prev_); }
60 scoped_single_line_mode(const scoped_single_line_mode&) = delete;
61 scoped_single_line_mode& operator=(const scoped_single_line_mode&) = delete;
62
63private:
64 fractured_formatter& format_;
65 layout_mode prev_;
66};
67
75class fractured_string_builder {
76public:
77 fractured_string_builder(const fractured_json_options& opts = {});
78
80 void append(const dom::element& value);
81
83 void append(const dom::array& value);
84
86 void append(const dom::object& value);
87
89 simdjson_inline void clear();
90
92 simdjson_inline std::string_view str() const;
93
94private:
95 fractured_formatter format_;
96 structure_analyzer analyzer_;
97 fractured_json_options options_;
98
100 void format_element(const dom::element& elem, const element_metrics& metrics, size_t depth,
101 bool has_trailing_comma = false);
102
104 void format_array(const dom::array& arr, const element_metrics& metrics, size_t depth,
105 bool has_trailing_comma = false);
106
108 void format_array_inline(const dom::array& arr, const element_metrics& metrics);
109
111 void format_array_compact_multiline(const dom::array& arr, const element_metrics& metrics, size_t depth);
112
115 void format_array_compact_multiline_aligned(const dom::array& arr, const element_metrics& metrics, size_t depth);
116
118 void format_array_as_table(const dom::array& arr, const element_metrics& metrics, size_t depth);
119
121 void format_table_object_row(const dom::object& obj, const element_metrics& row_metrics,
122 const std::vector<table_column>& columns, size_t depth);
123
125 void format_table_array_row(const dom::array& arr, const element_metrics& row_metrics,
126 const std::vector<table_column>& columns, size_t depth);
127
129 void format_table_row(const dom::element& elem, const element_metrics& row_metrics,
130 const std::vector<table_column>& columns, size_t depth);
131
133 void format_table_scalar_row(const dom::element& elem, const element_metrics& row_metrics,
134 size_t width, size_t depth, table_column_type column_type);
135
138 void format_table_row_columns(const std::vector<table_column>& columns,
139 const std::vector<bool>& found,
140 const std::vector<dom::element>& values,
141 const std::vector<const element_metrics*>& value_metrics,
142 size_t depth);
143
145 void format_table_leaf_value(const dom::element& elem, const element_metrics& vm, size_t width,
146 table_column_type column_type, bool needs_comma,
147 bool add_comma_space, size_t depth);
148
150 bool comma_goes_before_padding(table_column_type column_type) const;
151
153 void format_array_expanded(const dom::array& arr, const element_metrics& metrics, size_t depth);
154
156 void format_object(const dom::object& obj, const element_metrics& metrics, size_t depth,
157 bool has_trailing_comma = false);
158
160 void format_object_inline(const dom::object& obj, const element_metrics& metrics);
161
163 void format_object_expanded(const dom::object& obj, const element_metrics& metrics, size_t depth);
164
166 void format_scalar(const dom::element& elem);
167
169 bool bracket_padding_for(const element_metrics& metrics) const;
170};
171
172} // namespace internal
173} // namespace simdjson
174
175#endif // SIMDJSON_INTERNAL_FRACTURED_FORMATTER_H
The top level simdjson namespace, containing everything the library provides.
Definition base.h:8