1#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
3#ifndef SIMDJSON_CONDITIONAL_INCLUDE
4#define SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
5#include "simdjson/jsonpathutil.h"
6#include "simdjson/generic/ondemand/base.h"
7#include "simdjson/generic/ondemand/array.h"
8#include "simdjson/generic/ondemand/array_iterator-inl.h"
9#include "simdjson/generic/ondemand/json_iterator.h"
10#include "simdjson/generic/ondemand/value.h"
11#include "simdjson/generic/ondemand/value_iterator-inl.h"
15namespace SIMDJSON_IMPLEMENTATION {
64 simdjson_unused
bool has_value;
65 SIMDJSON_TRY( iter.start_array().get(has_value) );
69 simdjson_unused
bool has_value;
70 SIMDJSON_TRY( iter.start_root_array().get(has_value) );
75 SIMDJSON_TRY(iter.started_array().get(has_value));
80#if SIMDJSON_DEVELOPMENT_CHECKS
89 auto error =
iter.json_iter().skip_child(
iter.depth()-1);
90 if(error) {
iter.abandon(); }
95 const uint8_t * starting_point{
iter.peek_start()};
97 if(error) {
return error; }
101 const uint8_t * final_point{
iter._json_iter->unsafe_pointer()};
102 return std::string_view(
reinterpret_cast<const char*
>(starting_point),
size_t(final_point - starting_point));
105SIMDJSON_PUSH_DISABLE_WARNINGS
106SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
110 for(simdjson_unused
auto v : *
this) { count++; }
112 if(iter.error()) {
return iter.
error(); }
118SIMDJSON_POP_DISABLE_WARNINGS
122 auto error = iter.reset_array().get(is_not_empty);
123 if(error) {
return error; }
124 return !is_not_empty;
128 return iter.reset_array();
133 json_pointer = json_pointer.substr(1);
139 size_t array_index = 0;
141 for (i = 0; i < json_pointer.length() && json_pointer[i] !=
'/'; i++) {
142 uint8_t digit = uint8_t(json_pointer[i] -
'0');
145 array_index = array_index*10 + digit;
154 auto child = at(array_index);
161 if (i < json_pointer.length()) {
162 child = child.at_pointer(json_pointer.substr(i));
170 return at_pointer(json_pointer);
173#if SIMDJSON_SUPPORTS_CONCEPTS
174template <
typename Func>
175 requires std::invocable<Func, value>
177template <
typename Func>
180 auto result_pair = get_next_key_and_json_path(json_path);
181 std::string_view key = result_pair.first;
182 std::string_view remaining_path = result_pair.second;
191 for(
auto element: *
this) {
193 SIMDJSON_TRY(element.get(val));
194 if (remaining_path.empty()) {
197 error_code err = element.for_each_at_path_with_wildcard(remaining_path, callback);
198 if(err) {
return err; }
207 if(c <
'0' || c >
'9'){
210 idx = idx*10 + (c -
'0');
213 auto element = at(idx);
215 SIMDJSON_TRY(element.get(val));
216 if (remaining_path.empty()){
220 return element.for_each_at_path_with_wildcard(remaining_path, callback);
227 for (
auto value : *
this) {
228 if (i == index) {
return value; }
240simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::simdjson_result(
241 SIMDJSON_IMPLEMENTATION::ondemand::array &&value
243 : implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array>(
244 std::forward<SIMDJSON_IMPLEMENTATION::ondemand::array>(value)
248simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::simdjson_result(
251 : implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::array>(error)
255simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::begin() noexcept {
256 if (error()) {
return error(); }
257 return first.begin();
259simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::end() noexcept {
260 if (error()) {
return error(); }
263simdjson_inline simdjson_result<size_t> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::count_elements() &
noexcept {
264 if (error()) {
return error(); }
265 return first.count_elements();
267simdjson_inline simdjson_result<bool> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::is_empty() &
noexcept {
268 if (error()) {
return error(); }
269 return first.is_empty();
271simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::at(
size_t index)
noexcept {
272 if (error()) {
return error(); }
273 return first.at(index);
275simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::at_pointer(std::string_view json_pointer)
noexcept {
276 if (error()) {
return error(); }
277 return first.at_pointer(json_pointer);
279simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::at_path(std::string_view json_path)
noexcept {
280 if (error()) {
return error(); }
281 return first.at_path(json_path);
283#if SIMDJSON_SUPPORTS_CONCEPTS
284template <
typename Func>
285 requires std::invocable<Func, SIMDJSON_IMPLEMENTATION::ondemand::value>
287template <
typename Func>
289simdjson_inline
error_code simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::for_each_at_path_with_wildcard(std::string_view json_path, Func&& callback)
noexcept {
290 if (error()) {
return error(); }
291 return first.for_each_at_path_with_wildcard(json_path, std::forward<Func>(callback));
293simdjson_inline simdjson_result<std::string_view> simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array>::raw_json() noexcept {
294 if (error()) {
return error(); }
295 return first.raw_json();
A forward-only JSON array.
A forward-only JSON array.
error_code for_each_at_path_with_wildcard(std::string_view json_path, Func &&callback) noexcept
Call the provided callback for each value matching the given JSONPath expression with wildcard suppor...
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 simdjson_result< size_t > count_elements() &noexcept
This method scans the array and counts the number of elements.
simdjson_result< value > at_path(std::string_view json_path) noexcept
Get the value associated with the given JSONPath expression.
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_warn_unused simdjson_inline error_code consume() noexcept
Go to the end of the array, no matter where you are right now.
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 (checked when SIMDJSON_DEVELOPMENT_CHECKS=1)
@ 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.