simdjson  3.1.1
Ridiculously Fast JSON
value_iterator.h
1 namespace simdjson {
2 namespace SIMDJSON_IMPLEMENTATION {
3 namespace ondemand {
4 
5 class document;
6 class object;
7 class array;
8 class value;
9 class raw_json_string;
10 class parser;
11 
20 class value_iterator {
21 protected:
23  json_iterator *_json_iter{};
25  depth_t _depth{};
29  token_position _start_position{};
30 
31 public:
32  simdjson_inline value_iterator() noexcept = default;
33 
37  simdjson_inline void start_document() noexcept;
38 
44  simdjson_warn_unused simdjson_inline error_code skip_child() noexcept;
45 
49  simdjson_inline bool at_end() const noexcept;
50 
54  simdjson_inline bool at_start() const noexcept;
55 
59  simdjson_inline bool is_open() const noexcept;
60 
64  simdjson_inline bool at_first_field() const noexcept;
65 
69  simdjson_inline void abandon() noexcept;
70 
74  simdjson_inline value_iterator child_value() const noexcept;
75 
79  simdjson_inline int32_t depth() const noexcept;
80 
86  simdjson_inline simdjson_result<json_type> type() const noexcept;
87 
103  simdjson_warn_unused simdjson_inline simdjson_result<bool> start_object() noexcept;
111  simdjson_warn_unused simdjson_inline simdjson_result<bool> start_root_object() noexcept;
112 
122  simdjson_warn_unused simdjson_inline simdjson_result<bool> started_object() noexcept;
132  simdjson_warn_unused simdjson_inline simdjson_result<bool> started_root_object() noexcept;
133 
144  simdjson_warn_unused simdjson_inline simdjson_result<bool> has_next_field() noexcept;
145 
149  simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> field_key() noexcept;
150 
154  simdjson_warn_unused simdjson_inline error_code field_value() noexcept;
155 
172  simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept;
173 
191  simdjson_warn_unused simdjson_inline simdjson_result<bool> find_field_raw(const std::string_view key) noexcept;
192 
211  simdjson_warn_unused simdjson_inline simdjson_result<bool> find_field_unordered_raw(const std::string_view key) noexcept;
212 
228  simdjson_warn_unused simdjson_inline simdjson_result<bool> start_array() noexcept;
236  simdjson_warn_unused simdjson_inline simdjson_result<bool> start_root_array() noexcept;
237 
247  simdjson_warn_unused simdjson_inline simdjson_result<bool> started_array() noexcept;
257  simdjson_warn_unused simdjson_inline simdjson_result<bool> started_root_array() noexcept;
258 
268  simdjson_warn_unused simdjson_inline simdjson_result<bool> has_next_element() noexcept;
269 
273  simdjson_warn_unused simdjson_inline value_iterator child() const noexcept;
274 
283  simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_string() noexcept;
284  simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
285  simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
286  simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
287  simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
288  simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
289  simdjson_warn_unused simdjson_inline simdjson_result<double> get_double() noexcept;
290  simdjson_warn_unused simdjson_inline simdjson_result<double> get_double_in_string() noexcept;
291  simdjson_warn_unused simdjson_inline simdjson_result<bool> get_bool() noexcept;
292  simdjson_warn_unused simdjson_inline simdjson_result<bool> is_null() noexcept;
293  simdjson_warn_unused simdjson_inline bool is_negative() noexcept;
294  simdjson_warn_unused simdjson_inline simdjson_result<bool> is_integer() noexcept;
295  simdjson_warn_unused simdjson_inline simdjson_result<number_type> get_number_type() noexcept;
296  simdjson_warn_unused simdjson_inline simdjson_result<number> get_number() noexcept;
297 
298  simdjson_warn_unused simdjson_inline simdjson_result<std::string_view> get_root_string(bool check_trailing) noexcept;
299  simdjson_warn_unused simdjson_inline simdjson_result<raw_json_string> get_root_raw_json_string(bool check_trailing) noexcept;
300  simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_root_uint64(bool check_trailing) noexcept;
301  simdjson_warn_unused simdjson_inline simdjson_result<uint64_t> get_root_uint64_in_string(bool check_trailing) noexcept;
302  simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_root_int64(bool check_trailing) noexcept;
303  simdjson_warn_unused simdjson_inline simdjson_result<int64_t> get_root_int64_in_string(bool check_trailing) noexcept;
304  simdjson_warn_unused simdjson_inline simdjson_result<double> get_root_double(bool check_trailing) noexcept;
305  simdjson_warn_unused simdjson_inline simdjson_result<double> get_root_double_in_string(bool check_trailing) noexcept;
306  simdjson_warn_unused simdjson_inline simdjson_result<bool> get_root_bool(bool check_trailing) noexcept;
307  simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept;
308  simdjson_warn_unused simdjson_inline simdjson_result<bool> is_root_integer(bool check_trailing) noexcept;
309  simdjson_warn_unused simdjson_inline simdjson_result<number_type> get_root_number_type(bool check_trailing) noexcept;
310  simdjson_warn_unused simdjson_inline simdjson_result<number> get_root_number(bool check_trailing) noexcept;
311  simdjson_warn_unused simdjson_inline simdjson_result<bool> is_root_null(bool check_trailing) noexcept;
312 
313  simdjson_inline error_code error() const noexcept;
314  simdjson_inline uint8_t *&string_buf_loc() noexcept;
315  simdjson_inline const json_iterator &json_iter() const noexcept;
316  simdjson_inline json_iterator &json_iter() noexcept;
317 
318  simdjson_inline void assert_is_valid() const noexcept;
319  simdjson_inline bool is_valid() const noexcept;
320 
322 protected:
327  simdjson_inline simdjson_result<bool> reset_array() noexcept;
332  simdjson_inline simdjson_result<bool> reset_object() noexcept;
340  simdjson_inline void move_at_start() noexcept;
341 
348  simdjson_inline void move_at_container_start() noexcept;
349  /* Useful for debugging and logging purposes. */
350  inline std::string to_string() const noexcept;
351  simdjson_inline value_iterator(json_iterator *json_iter, depth_t depth, token_position start_index) noexcept;
352 
353  simdjson_inline simdjson_result<bool> parse_null(const uint8_t *json) const noexcept;
354  simdjson_inline simdjson_result<bool> parse_bool(const uint8_t *json) const noexcept;
355  simdjson_inline const uint8_t *peek_start() const noexcept;
356  simdjson_inline uint32_t peek_start_length() const noexcept;
357 
387  simdjson_inline void advance_scalar(const char *type) noexcept;
388  simdjson_inline void advance_root_scalar(const char *type) noexcept;
389  simdjson_inline void advance_non_root_scalar(const char *type) noexcept;
390 
391  simdjson_inline const uint8_t *peek_scalar(const char *type) noexcept;
392  simdjson_inline const uint8_t *peek_root_scalar(const char *type) noexcept;
393  simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept;
394 
395 
396  simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept;
397  simdjson_inline error_code end_container() noexcept;
398 
405  simdjson_inline simdjson_result<const uint8_t *> advance_to_value() noexcept;
406 
407  simdjson_inline error_code incorrect_type_error(const char *message) const noexcept;
408  simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept;
409 
410  simdjson_inline bool is_at_start() const noexcept;
417  simdjson_inline bool is_at_iterator_start() const noexcept;
418 
426  simdjson_inline bool is_at_key() const noexcept;
427 
428  inline void assert_at_start() const noexcept;
429  inline void assert_at_container_start() const noexcept;
430  inline void assert_at_root() const noexcept;
431  inline void assert_at_child() const noexcept;
432  inline void assert_at_next() const noexcept;
433  inline void assert_at_non_root_start() const noexcept;
434 
436  simdjson_inline token_position start_position() const noexcept;
437 
439  simdjson_inline token_position position() const noexcept;
441  simdjson_inline token_position last_position() const noexcept;
443  simdjson_inline token_position end_position() const noexcept;
445  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
446 
447  friend class document;
448  friend class object;
449  friend class array;
450  friend class value;
451 }; // value_iterator
452 
453 } // namespace ondemand
454 } // namespace SIMDJSON_IMPLEMENTATION
455 } // namespace simdjson
456 
457 namespace simdjson {
458 
459 template<>
460 struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value_iterator> {
461 public:
462  simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::value_iterator &&value) noexcept;
463  simdjson_inline simdjson_result(error_code error) noexcept;
464  simdjson_inline simdjson_result() noexcept = default;
465 };
466 
467 } // namespace simdjson
A string escaped per JSON rules, terminated with quote (").
An ephemeral JSON value returned during iteration.
Definition: value.h:17
json_type
The type of a JSON value.
Definition: json_type.h:7
@ object
A JSON object ( { "a": 1, "b" 2, ... } )
int32_t depth_t
Represents the depth of a JSON value (number of nested arrays/objects).
Definition: ondemand.h:11
We want to support argument-dependent lookup (ADL).
error_code
All possible errors returned by simdjson.
Definition: error.h:17
std::string to_string(T x)
Converts JSON to a string.
A type representing a JSON number.
Definition: json_type.h:24
The result of a simdjson operation that could fail.
Definition: error.h:205