simdjson 4.2.1
Ridiculously Fast JSON
Loading...
Searching...
No Matches
value_iterator.h
1#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
2
3#ifndef SIMDJSON_CONDITIONAL_INCLUDE
4#define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
5#include "simdjson/generic/ondemand/base.h"
6#include "simdjson/generic/implementation_simdjson_result_base.h"
7#endif // SIMDJSON_CONDITIONAL_INCLUDE
8
9namespace simdjson {
10namespace SIMDJSON_IMPLEMENTATION {
11namespace ondemand {
12
21class value_iterator {
22protected:
24 json_iterator *_json_iter{};
26 depth_t _depth{};
30 token_position _start_position{};
31
32public:
33 simdjson_inline value_iterator() noexcept = default;
34
38 simdjson_inline void start_document() noexcept;
39
45 simdjson_warn_unused simdjson_inline error_code skip_child() noexcept;
46
50 simdjson_inline bool at_end() const noexcept;
51
55 simdjson_inline bool at_start() const noexcept;
56
60 simdjson_inline bool is_open() const noexcept;
61
65 simdjson_inline bool at_first_field() const noexcept;
66
70 simdjson_inline void abandon() noexcept;
71
75 simdjson_inline value_iterator child_value() const noexcept;
76
80 simdjson_inline int32_t depth() const noexcept;
81
87 simdjson_inline simdjson_result<json_type> type() const noexcept;
88
104 simdjson_warn_unused simdjson_inline simdjson_result<bool> start_object() noexcept;
112 simdjson_warn_unused simdjson_inline simdjson_result<bool> start_root_object() noexcept;
120 simdjson_warn_unused simdjson_inline error_code check_root_object() noexcept;
131 simdjson_warn_unused simdjson_inline simdjson_result<bool> started_object() noexcept;
142 simdjson_warn_unused simdjson_inline simdjson_result<bool> started_root_object() noexcept;
143
154 simdjson_warn_unused simdjson_inline simdjson_result<bool> has_next_field() noexcept;
155
159 simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> field_key() noexcept;
160
164 simdjson_warn_unused simdjson_inline error_code field_value() noexcept;
165
182 simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept;
183
201 simdjson_warn_unused simdjson_inline simdjson_result<bool> find_field_raw(const std::string_view key) noexcept;
202
221 simdjson_warn_unused simdjson_inline simdjson_result<bool> find_field_unordered_raw(const std::string_view key) noexcept;
222
238 simdjson_warn_unused simdjson_inline simdjson_result<bool> start_array() noexcept;
246 simdjson_warn_unused simdjson_inline simdjson_result<bool> start_root_array() noexcept;
254 simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept;
265 simdjson_warn_unused simdjson_inline simdjson_result<bool> started_array() noexcept;
276 simdjson_warn_unused simdjson_inline simdjson_result<bool> started_root_array() noexcept;
277
287 simdjson_warn_unused simdjson_inline simdjson_result<bool> has_next_element() noexcept;
288
292 simdjson_warn_unused simdjson_inline value_iterator child() const noexcept;
293
302 simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement) noexcept;
303 template <typename string_type>
304 simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept;
305 simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept;
306 simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
307 simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
308 simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
309 simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
310 simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
311 simdjson_warn_unused simdjson_inline simdjson_result<double> get_double() noexcept;
312 simdjson_warn_unused simdjson_inline simdjson_result<double> get_double_in_string() noexcept;
313 simdjson_warn_unused simdjson_inline simdjson_result<bool> get_bool() noexcept;
314 simdjson_warn_unused simdjson_inline simdjson_result<bool> is_null() noexcept;
315 simdjson_warn_unused simdjson_inline bool is_negative() noexcept;
316 simdjson_warn_unused simdjson_inline simdjson_result<bool> is_integer() noexcept;
317 simdjson_warn_unused simdjson_inline simdjson_result<number_type> get_number_type() noexcept;
318 simdjson_warn_unused simdjson_inline simdjson_result<number> get_number() noexcept;
319
320 simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_root_string(bool check_trailing, bool allow_replacement) noexcept;
321 template <typename string_type>
322 simdjson_warn_unused simdjson_inline error_code get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept;
323 simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_root_wobbly_string(bool check_trailing) noexcept;
324 simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> get_root_raw_json_string(bool check_trailing) noexcept;
325 simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_root_uint64(bool check_trailing) noexcept;
326 simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_root_uint64_in_string(bool check_trailing) noexcept;
327 simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_root_int64(bool check_trailing) noexcept;
328 simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_root_int64_in_string(bool check_trailing) noexcept;
329 simdjson_warn_unused simdjson_inline simdjson_result<double> get_root_double(bool check_trailing) noexcept;
330 simdjson_warn_unused simdjson_inline simdjson_result<double> get_root_double_in_string(bool check_trailing) noexcept;
331 simdjson_warn_unused simdjson_inline simdjson_result<bool> get_root_bool(bool check_trailing) noexcept;
332 simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept;
333 simdjson_warn_unused simdjson_inline simdjson_result<bool> is_root_integer(bool check_trailing) noexcept;
334 simdjson_warn_unused simdjson_inline simdjson_result<number_type> get_root_number_type(bool check_trailing) noexcept;
335 simdjson_warn_unused simdjson_inline simdjson_result<number> get_root_number(bool check_trailing) noexcept;
336 simdjson_warn_unused simdjson_inline simdjson_result<bool> is_root_null(bool check_trailing) noexcept;
337
338 simdjson_warn_unused simdjson_inline error_code error() const noexcept;
339 simdjson_inline uint8_t *&string_buf_loc() noexcept;
340 simdjson_inline const json_iterator &json_iter() const noexcept;
341 simdjson_inline json_iterator &json_iter() noexcept;
342
343 simdjson_inline void assert_is_valid() const noexcept;
344 simdjson_inline bool is_valid() const noexcept;
345
347protected:
352 simdjson_inline simdjson_result<bool> reset_array() noexcept;
357 simdjson_inline simdjson_result<bool> reset_object() noexcept;
365 simdjson_inline void move_at_start() noexcept;
366
373 simdjson_inline void move_at_container_start() noexcept;
374 /* Useful for debugging and logging purposes. */
375 inline std::string to_string() const noexcept;
376 simdjson_inline value_iterator(json_iterator *json_iter, depth_t depth, token_position start_index) noexcept;
377
378 simdjson_inline simdjson_result<bool> parse_null(const uint8_t *json) const noexcept;
379 simdjson_inline simdjson_result<bool> parse_bool(const uint8_t *json) const noexcept;
380 simdjson_inline const uint8_t *peek_start() const noexcept;
381 simdjson_inline uint32_t peek_start_length() const noexcept;
382 simdjson_inline uint32_t peek_root_length() const noexcept;
383
413 simdjson_inline void advance_scalar(const char *type) noexcept;
414 simdjson_inline void advance_root_scalar(const char *type) noexcept;
415 simdjson_inline void advance_non_root_scalar(const char *type) noexcept;
416
417 simdjson_inline const uint8_t *peek_scalar(const char *type) noexcept;
418 simdjson_inline const uint8_t *peek_root_scalar(const char *type) noexcept;
419 simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept;
420
421
422 simdjson_warn_unused simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept;
423 simdjson_warn_unused simdjson_inline error_code end_container() noexcept;
424
431 simdjson_inline simdjson_result<const uint8_t *> advance_to_value() noexcept;
432
433 simdjson_warn_unused simdjson_inline error_code incorrect_type_error(const char *message) const noexcept;
434 simdjson_warn_unused simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept;
435
436 simdjson_inline bool is_at_start() const noexcept;
443 simdjson_inline bool is_at_iterator_start() const noexcept;
444
452 simdjson_inline bool is_at_key() const noexcept;
453
454 inline void assert_at_start() const noexcept;
455 inline void assert_at_container_start() const noexcept;
456 inline void assert_at_root() const noexcept;
457 inline void assert_at_child() const noexcept;
458 inline void assert_at_next() const noexcept;
459 inline void assert_at_non_root_start() const noexcept;
460
462 simdjson_inline token_position start_position() const noexcept;
463
465 simdjson_inline token_position position() const noexcept;
467 simdjson_inline token_position last_position() const noexcept;
469 simdjson_inline token_position end_position() const noexcept;
471 simdjson_warn_unused simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
472
473 friend class document;
474 friend class object;
475 friend class array;
476 friend class value;
477 friend class field;
478}; // value_iterator
479
480} // namespace ondemand
481} // namespace SIMDJSON_IMPLEMENTATION
482} // namespace simdjson
483
484namespace simdjson {
485
486template<>
487struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value_iterator> {
488public:
489 simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::value_iterator &&value) noexcept;
490 simdjson_inline simdjson_result(error_code error) noexcept;
491 simdjson_inline simdjson_result() noexcept = default;
492};
493
494} // namespace simdjson
495
496#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
A JSON field (key/value pair) in an object.
Definition field.h:22
A string escaped per JSON rules, terminated with quote (").
An ephemeral JSON value returned during iteration.
Definition value.h:22
simdjson_warn_unused simdjson_inline simdjson_result< bool > started_array() noexcept
Start an array iteration, after the user has already checked and moved past the [.
simdjson_warn_unused simdjson_inline simdjson_result< bool > start_array() noexcept
Check for an opening [ and start an array iteration.
simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept
Checks whether an array could be started from the root.
simdjson_warn_unused simdjson_inline simdjson_result< bool > has_next_element() noexcept
Moves to the next element in an array.
simdjson_warn_unused simdjson_inline simdjson_result< bool > start_root_array() noexcept
Check for an opening [ and start an array iteration while at the root.
simdjson_warn_unused simdjson_inline simdjson_result< bool > started_root_array() noexcept
Start an array iteration from the root, after the user has already checked and moved past the [.
simdjson_warn_unused simdjson_inline value_iterator child() const noexcept
Get a child value iterator.
simdjson_warn_unused simdjson_inline simdjson_result< bool > started_object() noexcept
Start an object iteration after the user has already checked and moved past the {.
simdjson_warn_unused simdjson_inline error_code check_root_object() noexcept
Checks whether an object could be started from the root.
simdjson_warn_unused simdjson_inline simdjson_result< bool > start_object() noexcept
Start an object iteration.
simdjson_warn_unused simdjson_inline simdjson_result< bool > find_field_unordered_raw(const std::string_view key) noexcept
Find the field with the given key without regard to order, and without unescaping.
simdjson_warn_unused simdjson_inline simdjson_result< bool > has_next_field() noexcept
Moves to the next field in an object.
simdjson_warn_unused simdjson_inline simdjson_result< raw_json_string > field_key() noexcept
Get the current field's key.
simdjson_warn_unused simdjson_inline simdjson_result< bool > started_root_object() noexcept
Start an object iteration from the root, after the user has already checked and moved past the {.
simdjson_warn_unused simdjson_inline error_code field_value() noexcept
Pass the : in the field and move to its value.
simdjson_warn_unused simdjson_inline simdjson_result< bool > find_field_raw(const std::string_view key) noexcept
Find the next field with the given key, without unescaping.
simdjson_warn_unused simdjson_inline simdjson_result< bool > start_root_object() noexcept
Start an object iteration from the root.
simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept
Find the next field with the given key.
int32_t depth_t
Represents the depth of a JSON value (number of nested arrays/objects).
Definition base.h:18
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
A type representing a JSON number.
Definition json_type.h:33
The result of a simdjson operation that could fail.
Definition error.h:278