simdjson  3.11.0
Ridiculously Fast JSON
dom_parser_implementation.h
1 #ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
2 
3 #ifndef SIMDJSON_CONDITIONAL_INCLUDE
4 #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
5 #include "simdjson/generic/base.h"
6 #include "simdjson/internal/dom_parser_implementation.h"
7 #endif // SIMDJSON_CONDITIONAL_INCLUDE
8 
9 namespace simdjson {
10 namespace SIMDJSON_IMPLEMENTATION {
11 
12 // expectation: sizeof(open_container) = 64/8.
14  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
15  uint32_t count; // how many elements in the scope
16 }; // struct open_container
17 
18 static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
19 
20 class dom_parser_implementation final : public internal::dom_parser_implementation {
21 public:
23  std::unique_ptr<open_container[]> open_containers{};
25  std::unique_ptr<bool[]> is_array{};
27  const uint8_t *buf{};
29  size_t len{0};
32 
33  inline dom_parser_implementation() noexcept;
35  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
37  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
38 
39  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
40  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
41  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
42  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
43  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
44  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
45  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
46  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
47 private:
48  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
49 
50 };
51 
52 } // namespace SIMDJSON_IMPLEMENTATION
53 } // namespace simdjson
54 
55 namespace simdjson {
56 namespace SIMDJSON_IMPLEMENTATION {
57 
58 inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
60 inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
61 
62 // Leaving these here so they can be inlined if so desired
63 inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
64  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
65  // Stage 1 index output
66  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
67  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
68  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
69  structural_indexes[0] = 0;
70  n_structural_indexes = 0;
71 
72  _capacity = capacity;
73  return SUCCESS;
74 }
75 
76 inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
77  // Stage 2 stacks
78  open_containers.reset(new (std::nothrow) open_container[max_depth]);
79  is_array.reset(new (std::nothrow) bool[max_depth]);
80  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
81 
82  _max_depth = max_depth;
83  return SUCCESS;
84 }
85 
86 } // namespace SIMDJSON_IMPLEMENTATION
87 } // namespace simdjson
88 
89 #endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
std::unique_ptr< bool[]> is_array
Whether each open container is a [ or {.
std::unique_ptr< open_container[]> open_containers
Tape location of each open { or [.
A parsed JSON document.
Definition: document.h:16
The top level simdjson namespace, containing everything the library provides.
Definition: base.h:8
constexpr SIMDJSON_PUSH_DISABLE_UNUSED_WARNINGS size_t SIMDJSON_MAXSIZE_BYTES
The maximum document size supported by simdjson.
Definition: base.h:22
error_code
All possible errors returned by simdjson.
Definition: error.h:19
@ CAPACITY
This parser can't support a document that big.
Definition: error.h:21
@ MEMALLOC
Error allocating memory, most likely out of memory.
Definition: error.h:22
@ SUCCESS
No error.
Definition: error.h:20
stage1_mode
This enum is used with the dom_parser_implementation::stage1 function.