1 #ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
3 #ifndef SIMDJSON_CONDITIONAL_INCLUDE
4 #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
5 #include "simdjson/generic/ondemand/base.h"
6 #include "simdjson/generic/ondemand/array.h"
7 #include "simdjson/generic/ondemand/array_iterator-inl.h"
8 #include "simdjson/generic/ondemand/json_iterator.h"
9 #include "simdjson/generic/ondemand/value.h"
10 #include "simdjson/generic/ondemand/value_iterator-inl.h"
14 namespace SIMDJSON_IMPLEMENTATION {
63 simdjson_unused
bool has_value;
64 SIMDJSON_TRY( iter.start_array().get(has_value) );
68 simdjson_unused
bool has_value;
69 SIMDJSON_TRY( iter.start_root_array().get(has_value) );
74 SIMDJSON_TRY(iter.started_array().get(has_value));
79 #if SIMDJSON_DEVELOPMENT_CHECKS
88 auto error =
iter.json_iter().skip_child(
iter.depth()-1);
89 if(error) {
iter.abandon(); }
94 const uint8_t * starting_point{
iter.peek_start()};
96 if(error) {
return error; }
100 const uint8_t * final_point{
iter._json_iter->unsafe_pointer()};
101 return std::string_view(
reinterpret_cast<const char*
>(starting_point),
size_t(final_point - starting_point));
104 SIMDJSON_PUSH_DISABLE_WARNINGS
105 SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
109 for(simdjson_unused
auto v : *
this) { count++; }
111 if(iter.error()) {
return iter.error(); }
117 SIMDJSON_POP_DISABLE_WARNINGS
121 auto error = iter.reset_array().get(is_not_empty);
122 if(error) {
return error; }
123 return !is_not_empty;
127 return iter.reset_array();
132 json_pointer = json_pointer.substr(1);
138 size_t array_index = 0;
140 for (i = 0; i < json_pointer.length() && json_pointer[i] !=
'/'; i++) {
141 uint8_t digit = uint8_t(json_pointer[i] -
'0');
144 array_index = array_index*10 + digit;
153 auto child = at(array_index);
160 if (i < json_pointer.length()) {
161 child = child.at_pointer(json_pointer.substr(i));
168 for (
auto value : *
this) {
169 if (i == index) {
return value; }
181 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::simdjson_result(
182 SIMDJSON_IMPLEMENTATION::ondemand::array &&value
184 : implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array>(
185 std::forward<SIMDJSON_IMPLEMENTATION::ondemand::array>(value)
189 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::simdjson_result(
192 : implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array>(error)
196 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::begin() noexcept {
198 return first.begin();
200 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::end() noexcept {
204 simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::count_elements() & noexcept {
205 if (error()) {
return error(); }
206 return first.count_elements();
208 simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::is_empty() & noexcept {
209 if (error()) {
return error(); }
210 return first.is_empty();
212 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::at(
size_t index) noexcept {
213 if (error()) {
return error(); }
214 return first.at(index);
216 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::at_pointer(std::string_view json_pointer) noexcept {
217 if (error()) {
return error(); }
218 return first.at_pointer(json_pointer);
220 simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::raw_json() noexcept {
222 return first.raw_json();
A forward-only JSON array.
A forward-only JSON array.
simdjson_inline simdjson_result< value > at(size_t index) noexcept
Get the value at the given index.
value_iterator iter
Iterator marking current position.
simdjson_inline simdjson_result< bool > is_empty() &noexcept
This method scans the beginning of the array and checks whether the array is empty.
simdjson_result< value > at_pointer(std::string_view json_pointer) noexcept
Get the value associated with the given JSON pointer.
static simdjson_inline simdjson_result< array > start(value_iterator &iter) noexcept
Begin array iteration.
simdjson_inline simdjson_result< array_iterator > begin() noexcept
Begin array iteration.
simdjson_inline array() noexcept=default
Create a new invalid array.
simdjson_inline error_code consume() noexcept
Go to the end of the array, no matter where you are right now.
simdjson_inline simdjson_result< size_t > count_elements() &noexcept
This method scans the array and counts the number of elements.
static simdjson_inline simdjson_result< array > start_root(value_iterator &iter) noexcept
Begin array iteration from the root.
static simdjson_inline simdjson_result< array > started(value_iterator &iter) noexcept
Begin array iteration.
simdjson_inline simdjson_result< std::string_view > raw_json() noexcept
Consumes the array and returns a string_view instance corresponding to the array as represented in JS...
simdjson_inline simdjson_result< array_iterator > end() noexcept
Sentinel representing the end of the array.
simdjson_result< bool > reset() &noexcept
Reset the iterator so that we are pointing back at the beginning of the array.
An ephemeral JSON value returned during iteration.
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.
@ OUT_OF_ORDER_ITERATION
tried to iterate an array or object out of order
@ INDEX_OUT_OF_BOUNDS
JSON array index too large.
@ INVALID_JSON_POINTER
Invalid JSON pointer reference.
The result of a simdjson operation that could fail.
simdjson_inline error_code error() const noexcept
The error.