1#ifndef SIMDJSON_INTERNAL_JSON_STRUCTURE_ANALYZER_H
2#define SIMDJSON_INTERNAL_JSON_STRUCTURE_ANALYZER_H
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"
22enum class layout_mode {
33struct element_metrics {
35 size_t complexity = 0;
38 size_t estimated_inline_len = 0;
41 size_t child_count = 0;
44 bool can_inline =
false;
47 bool is_uniform_array =
false;
50 std::vector<std::string> common_keys{};
53 layout_mode recommended_layout = layout_mode::EXPANDED;
56 std::vector<element_metrics> children{};
70class structure_analyzer {
73 structure_analyzer() : current_opts_(nullptr) {}
76 structure_analyzer(
const structure_analyzer&) =
delete;
79 structure_analyzer& operator=(
const structure_analyzer&) =
delete;
82 structure_analyzer(structure_analyzer&&) =
default;
85 structure_analyzer& operator=(structure_analyzer&&) =
default;
93 element_metrics analyze(
const dom::element& elem,
94 const fractured_json_options& opts);
107 element_metrics analyze_array(
const dom::array& arr,
108 const fractured_json_options& opts);
116 element_metrics analyze_object(
const dom::object& obj,
117 const fractured_json_options& opts);
120 const fractured_json_options* current_opts_ =
nullptr;
123 element_metrics analyze_element(
const dom::element& elem,
size_t depth);
126 element_metrics analyze_scalar(
const dom::element& elem);
129 element_metrics analyze_array(
const dom::array& arr,
size_t depth);
132 element_metrics analyze_object(
const dom::object& obj,
size_t depth);
135 size_t estimate_string_length(std::string_view s)
const;
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;
148 bool check_array_uniformity(
const dom::array& arr,
149 std::vector<std::string>& common_keys)
const;
155 double compute_object_similarity(
const dom::object& a,
156 const dom::object& b)
const;
161 layout_mode decide_layout(
const element_metrics& metrics,
163 size_t available_width)
const;
The top level simdjson namespace, containing everything the library provides.