simdjson 4.4.0
Ridiculously Fast JSON
Loading...
Searching...
No Matches
json_structure_analyzer.h
1#ifndef SIMDJSON_INTERNAL_JSON_STRUCTURE_ANALYZER_H
2#define SIMDJSON_INTERNAL_JSON_STRUCTURE_ANALYZER_H
3
4#include "simdjson/dom/base.h"
5#include "simdjson/dom/element.h"
6#include "simdjson/dom/array.h"
7#include "simdjson/dom/object.h"
8#include "simdjson/dom/fractured_json.h"
9#include "simdjson/internal/tape_type.h"
10
11#include <vector>
12#include <string>
13#include <string_view>
14#include <set>
15
16namespace simdjson {
17namespace internal {
18
22enum class layout_mode {
23 INLINE, // Single line: [1, 2, 3] or {"a": 1}
24 COMPACT_MULTILINE, // Multiple items per line with breaks
25 TABLE, // Tabular format for arrays of similar objects
26 EXPANDED // Traditional multi-line with indentation
27};
28
33struct element_metrics {
35 size_t complexity = 0;
36
38 size_t estimated_inline_len = 0;
39
41 size_t child_count = 0;
42
44 bool can_inline = false;
45
47 bool is_uniform_array = false;
48
50 std::vector<std::string> common_keys{};
51
53 layout_mode recommended_layout = layout_mode::EXPANDED;
54
56 std::vector<element_metrics> children{};
57};
58
70class structure_analyzer {
71public:
73 structure_analyzer() : current_opts_(nullptr) {}
74
76 structure_analyzer(const structure_analyzer&) = delete;
77
79 structure_analyzer& operator=(const structure_analyzer&) = delete;
80
82 structure_analyzer(structure_analyzer&&) = default;
83
85 structure_analyzer& operator=(structure_analyzer&&) = default;
86
93 element_metrics analyze(const dom::element& elem,
94 const fractured_json_options& opts);
95
99 void clear();
100
107 element_metrics analyze_array(const dom::array& arr,
108 const fractured_json_options& opts);
109
116 element_metrics analyze_object(const dom::object& obj,
117 const fractured_json_options& opts);
118
119private:
120 const fractured_json_options* current_opts_ = nullptr;
121
123 element_metrics analyze_element(const dom::element& elem, size_t depth);
124
126 element_metrics analyze_scalar(const dom::element& elem);
127
129 element_metrics analyze_array(const dom::array& arr, size_t depth);
130
132 element_metrics analyze_object(const dom::object& obj, size_t depth);
133
135 size_t estimate_string_length(std::string_view s) const;
136
138 size_t estimate_number_length(double d) const;
139 size_t estimate_number_length(int64_t i) const;
140 size_t estimate_number_length(uint64_t u) const;
141
148 bool check_array_uniformity(const dom::array& arr,
149 std::vector<std::string>& common_keys) const;
150
155 double compute_object_similarity(const dom::object& a,
156 const dom::object& b) const;
157
161 layout_mode decide_layout(const element_metrics& metrics,
162 size_t depth,
163 size_t available_width) const;
164};
165
166} // namespace internal
167} // namespace simdjson
168
169#endif // SIMDJSON_INTERNAL_JSON_STRUCTURE_ANALYZER_H
The top level simdjson namespace, containing everything the library provides.
Definition base.h:8