simdjson  3.1.3
Ridiculously Fast JSON
json_iterator.h
1 namespace simdjson {
2 namespace SIMDJSON_IMPLEMENTATION {
3 namespace ondemand {
4 
5 class document;
6 class document_stream;
7 class object;
8 class array;
9 class value;
10 class raw_json_string;
11 class parser;
12 
18 class json_iterator {
19 protected:
20  token_iterator token{};
21  ondemand::parser *parser{};
27  uint8_t *_string_buf_loc{};
38  error_code error{SUCCESS};
47  depth_t _depth{};
54  token_position _root{};
61  bool _streaming{false};
62 
63 public:
64  simdjson_inline json_iterator() noexcept = default;
65  simdjson_inline json_iterator(json_iterator &&other) noexcept;
66  simdjson_inline json_iterator &operator=(json_iterator &&other) noexcept;
67  simdjson_inline explicit json_iterator(const json_iterator &other) noexcept = default;
68  simdjson_inline json_iterator &operator=(const json_iterator &other) noexcept = default;
72  simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept;
73 
77  simdjson_inline bool at_root() const noexcept;
78 
85  simdjson_inline bool streaming() const noexcept;
86 
90  simdjson_inline token_position root_position() const noexcept;
94  simdjson_inline void assert_at_document_depth() const noexcept;
98  simdjson_inline void assert_at_root() const noexcept;
99 
103  simdjson_inline bool at_end() const noexcept;
104 
108  simdjson_inline bool is_alive() const noexcept;
109 
113  simdjson_inline void abandon() noexcept;
114 
118  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
119 
126  simdjson_inline bool is_single_token() const noexcept;
127 
133  simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept;
139  simdjson_inline void assert_valid_position(token_position position) const noexcept;
150  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
158  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
167  simdjson_inline const uint8_t *unsafe_pointer() const noexcept;
178  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
186  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
195  simdjson_inline const uint8_t *peek_last() const noexcept;
196 
204  simdjson_inline void ascend_to(depth_t parent_depth) noexcept;
205 
213  simdjson_inline void descend_to(depth_t child_depth) noexcept;
214  simdjson_inline void descend_to(depth_t child_depth, int32_t delta) noexcept;
215 
219  simdjson_inline depth_t depth() const noexcept;
220 
224  simdjson_inline uint8_t *&string_buf_loc() noexcept;
225 
232  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
233 
239  simdjson_inline error_code optional_error(error_code error, const char *message) noexcept;
240 
241  template<int N> simdjson_warn_unused simdjson_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t (&tmpbuf)[N]) noexcept;
242 
243  simdjson_inline token_position position() const noexcept;
249  simdjson_inline simdjson_result<std::string_view> unescape(raw_json_string in, bool allow_replacement) noexcept;
250  simdjson_inline simdjson_result<std::string_view> unescape_wobbly(raw_json_string in) noexcept;
251  simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept;
252 
253 #if SIMDJSON_DEVELOPMENT_CHECKS
254  simdjson_inline token_position start_position(depth_t depth) const noexcept;
255  simdjson_inline void set_start_position(depth_t depth, token_position position) noexcept;
256 #endif
257 
258  /* Useful for debugging and logging purposes. */
259  inline std::string to_string() const noexcept;
260 
264  inline simdjson_result<const char *> current_location() noexcept;
265 
270  inline void rewind() noexcept;
277  inline bool balanced() const noexcept;
278 protected:
279  simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept;
281  simdjson_inline token_position last_position() const noexcept;
283  simdjson_inline token_position end_position() const noexcept;
285  simdjson_inline token_position end() const noexcept;
286 
287  friend class document;
288  friend class document_stream;
289  friend class object;
290  friend class array;
291  friend class value;
292  friend class raw_json_string;
293  friend class parser;
294  friend class value_iterator;
295  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta) noexcept;
296  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail) noexcept;
297 }; // json_iterator
298 
299 } // namespace ondemand
300 } // namespace SIMDJSON_IMPLEMENTATION
301 } // namespace simdjson
302 
303 namespace simdjson {
304 
305 template<>
306 struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::json_iterator> {
307 public:
308  simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::json_iterator &&value) noexcept;
309  simdjson_inline simdjson_result(error_code error) noexcept;
310 
311  simdjson_inline simdjson_result() noexcept = default;
312 };
313 
314 } // namespace simdjson
@ 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
@ SUCCESS
No error.
Definition: error.h:18
std::string to_string(T x)
Converts JSON to a string.
The result of a simdjson operation that could fail.
Definition: error.h:205