1 #ifndef SIMDJSON_ARRAY_INL_H
2 #define SIMDJSON_ARRAY_INL_H
6 #include "simdjson/dom/base.h"
7 #include "simdjson/dom/array.h"
8 #include "simdjson/dom/element.h"
9 #include "simdjson/error-inl.h"
10 #include "simdjson/jsonpathutil.h"
11 #include "simdjson/internal/tape_ref-inl.h"
20 simdjson_inline simdjson_result<dom::array>::simdjson_result() noexcept
21 : internal::simdjson_result_base<dom::array>() {}
22 simdjson_inline simdjson_result<dom::array>::simdjson_result(dom::array value) noexcept
23 : internal::simdjson_result_base<dom::array>(std::forward<dom::array>(value)) {}
24 simdjson_inline simdjson_result<dom::array>::simdjson_result(
error_code error) noexcept
25 : internal::simdjson_result_base<dom::array>(error) {}
27 #if SIMDJSON_EXCEPTIONS
29 inline dom::array::iterator simdjson_result<dom::array>::begin() const noexcept(false) {
30 if (
error()) {
throw simdjson_error(
error()); }
33 inline dom::array::iterator simdjson_result<dom::array>::end() const noexcept(false) {
34 if (
error()) {
throw simdjson_error(
error()); }
37 inline size_t simdjson_result<dom::array>::size() const noexcept(false) {
38 if (
error()) {
throw simdjson_error(
error()); }
44 inline simdjson_result<dom::element> simdjson_result<dom::array>::at_pointer(std::string_view json_pointer)
const noexcept {
45 if (error()) {
return error(); }
46 return first.at_pointer(json_pointer);
49 inline simdjson_result<dom::element> simdjson_result<dom::array>::at_path(std::string_view json_path)
const noexcept {
52 return at_pointer(json_pointer);
55 inline simdjson_result<dom::element> simdjson_result<dom::array>::at(
size_t index)
const noexcept {
56 if (error()) {
return error(); }
57 return first.at(index);
66 simdjson_inline
array::array(
const internal::tape_ref &_tape) noexcept : tape{_tape} {}
68 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
69 return internal::tape_ref(tape.doc, tape.json_index + 1);
72 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
73 return internal::tape_ref(tape.doc, tape.after_element() - 1);
76 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
77 return tape.scope_count();
80 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
81 return tape.matching_brace_index() - tape.json_index;
84 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
85 if(json_pointer.empty()) {
87 }
else if(json_pointer[0] !=
'/') {
90 json_pointer = json_pointer.substr(1);
96 size_t array_index = 0;
98 for (i = 0; i < json_pointer.length() && json_pointer[i] !=
'/'; i++) {
99 uint8_t digit = uint8_t(json_pointer[i] -
'0');
102 array_index = array_index*10 + digit;
112 auto child =
array(tape).
at(array_index);
118 if (i < json_pointer.length()) {
119 child = child.at_pointer(json_pointer.substr(i));
127 return at_pointer(json_pointer);
131 SIMDJSON_DEVELOPMENT_ASSERT(tape.usable());
134 if (i == index) {
return element; }
140 inline array::operator
element() const noexcept {
147 simdjson_inline array::iterator::iterator(
const internal::tape_ref &_tape) noexcept : tape{_tape} { }
152 tape.json_index = tape.after_element();
161 return tape.json_index != other.tape.json_index;
163 inline bool array::iterator::operator==(
const array::iterator& other)
const noexcept {
164 return tape.json_index == other.tape.json_index;
166 inline bool array::iterator::operator<(
const array::iterator& other)
const noexcept {
167 return tape.json_index < other.tape.json_index;
169 inline bool array::iterator::operator<=(
const array::iterator& other)
const noexcept {
170 return tape.json_index <= other.tape.json_index;
172 inline bool array::iterator::operator>=(
const array::iterator& other)
const noexcept {
173 return tape.json_index >= other.tape.json_index;
175 inline bool array::iterator::operator>(
const array::iterator& other)
const noexcept {
176 return tape.json_index > other.tape.json_index;
184 #include "simdjson/dom/element-inl.h"
186 #if defined(__cpp_lib_ranges)
187 static_assert(std::ranges::view<simdjson::dom::array>);
188 static_assert(std::ranges::sized_range<simdjson::dom::array>);
189 #if SIMDJSON_EXCEPTIONS
bool operator!=(const iterator &other) const noexcept
Check if these values come from the same place in the JSON.
iterator & operator++() noexcept
Get the next value.
reference operator*() const noexcept
Get the actual value.
size_t number_of_slots() const noexcept
Get the total number of slots used by this array on the tape.
iterator end() const noexcept
One past the last array element.
size_t size() const noexcept
Get the size of the array (number of immediate children).
simdjson_result< element > at(size_t index) const noexcept
Get the value at the given index.
simdjson_result< element > at_pointer(std::string_view json_pointer) const noexcept
Get the value associated with the given JSON pointer.
simdjson_inline array() noexcept
Create a new, invalid array.
simdjson_result< element > at_path(std::string_view json_path) const noexcept
Get the value associated with the given JSONPath expression.
iterator begin() const noexcept
Return the first array element.
The top level simdjson namespace, containing everything the library provides.
error_code
All possible errors returned by simdjson.
@ INCORRECT_TYPE
JSON element has a different type than user expected.
@ INDEX_OUT_OF_BOUNDS
JSON array index too large.
@ INVALID_JSON_POINTER
Invalid JSON pointer syntax.
std::string json_path_to_pointer_conversion(std::string_view json_path)
Converts JSONPath to JSON Pointer.
The result of a simdjson operation that could fail.
simdjson_inline error_code error() const noexcept
The error.