simdjson 4.2.3
Ridiculously Fast JSON
Loading...
Searching...
No Matches
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
9namespace simdjson {
10namespace 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
18static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
19
20class dom_parser_implementation final : public internal::dom_parser_implementation {
21public:
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;
47private:
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
55namespace simdjson {
56namespace SIMDJSON_IMPLEMENTATION {
57
58inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
60inline 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
63inline 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
76inline 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
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.