simdjson  3.1.6
Ridiculously Fast JSON
document_stream.h
1 #ifndef SIMDJSON_DOCUMENT_STREAM_H
2 #define SIMDJSON_DOCUMENT_STREAM_H
3 
4 #include "simdjson/common_defs.h"
5 #include "simdjson/dom/parser.h"
6 #include "simdjson/error.h"
7 #ifdef SIMDJSON_THREADS_ENABLED
8 #include <thread>
9 #include <mutex>
10 #include <condition_variable>
11 #endif
12 
13 namespace simdjson {
14 namespace dom {
15 
16 
17 #ifdef SIMDJSON_THREADS_ENABLED
19 struct stage1_worker {
20  stage1_worker() noexcept = default;
21  stage1_worker(const stage1_worker&) = delete;
22  stage1_worker(stage1_worker&&) = delete;
23  stage1_worker operator=(const stage1_worker&) = delete;
24  ~stage1_worker();
29  void start_thread();
34  void run(document_stream * ds, dom::parser * stage1, size_t next_batch_start);
36  void finish();
37 
38 private:
39 
45  void stop_thread();
46 
47  std::thread thread{};
49  dom::parser * stage1_thread_parser{};
50  size_t _next_batch_start{};
51  document_stream * owner{};
56  bool has_work{false};
57  bool can_work{true};
58 
62  std::mutex locking_mutex{};
63  std::condition_variable cond_var{};
64 };
65 #endif
66 
74 public:
83  simdjson_inline document_stream() noexcept;
85  simdjson_inline document_stream(document_stream &&other) noexcept = default;
87  simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
88 
89  simdjson_inline ~document_stream() noexcept;
93  inline size_t size_in_bytes() const noexcept;
112  inline size_t truncated_bytes() const noexcept;
116  class iterator {
117  public:
119  using reference = value_type;
120 
121  using difference_type = std::ptrdiff_t;
122 
123  using iterator_category = std::input_iterator_tag;
124 
128  simdjson_inline iterator() noexcept;
132  simdjson_inline reference operator*() noexcept;
136  inline iterator& operator++() noexcept;
141  simdjson_inline bool operator!=(const iterator &other) const noexcept;
157  simdjson_inline size_t current_index() const noexcept;
177  simdjson_inline std::string_view source() const noexcept;
178 
179  private:
180  simdjson_inline iterator(document_stream *s, bool finished) noexcept;
182  document_stream* stream;
184  bool finished;
185  friend class document_stream;
186  };
187 
191  simdjson_inline iterator begin() noexcept;
195  simdjson_inline iterator end() noexcept;
196 
197 private:
198 
199  document_stream &operator=(const document_stream &) = delete; // Disallow copying
200  document_stream(const document_stream &other) = delete; // Disallow copying
201 
211  simdjson_inline document_stream(
212  dom::parser &parser,
213  const uint8_t *buf,
214  size_t len,
215  size_t batch_size
216  ) noexcept;
217 
222  inline void start() noexcept;
223 
248  inline void next() noexcept;
249 
254  inline void load_batch() noexcept;
255 
257  inline size_t next_batch_start() const noexcept;
258 
260  inline error_code run_stage1(dom::parser &p, size_t batch_start) noexcept;
261 
262  dom::parser *parser;
263  const uint8_t *buf;
264  size_t len;
265  size_t batch_size;
267  error_code error;
268  size_t batch_start{0};
269  size_t doc_index{};
270 #ifdef SIMDJSON_THREADS_ENABLED
272  bool use_thread;
273 
274  inline void load_from_stage1_thread() noexcept;
275 
277  inline void start_stage1_thread() noexcept;
278 
280  inline void finish_stage1_thread() noexcept;
281 
283  error_code stage1_thread_error{UNINITIALIZED};
285  friend struct stage1_worker;
286  std::unique_ptr<stage1_worker> worker{new(std::nothrow) stage1_worker()};
291  dom::parser stage1_thread_parser{};
292 #endif // SIMDJSON_THREADS_ENABLED
293 
294  friend class dom::parser;
295  friend struct simdjson_result<dom::document_stream>;
296  friend struct internal::simdjson_result_base<dom::document_stream>;
297 
298 }; // class document_stream
299 
300 } // namespace dom
301 
302 template<>
303 struct simdjson_result<dom::document_stream> : public internal::simdjson_result_base<dom::document_stream> {
304 public:
305  simdjson_inline simdjson_result() noexcept;
306  simdjson_inline simdjson_result(error_code error) noexcept;
307  simdjson_inline simdjson_result(dom::document_stream &&value) noexcept;
308 
309 #if SIMDJSON_EXCEPTIONS
310  simdjson_inline dom::document_stream::iterator begin() noexcept(false);
311  simdjson_inline dom::document_stream::iterator end() noexcept(false);
312 #else // SIMDJSON_EXCEPTIONS
313 #ifndef SIMDJSON_DISABLE_DEPRECATED_API
314  [[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
315  simdjson_inline dom::document_stream::iterator begin() noexcept;
316  [[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
317  simdjson_inline dom::document_stream::iterator end() noexcept;
318 #endif // SIMDJSON_DISABLE_DEPRECATED_API
319 #endif // SIMDJSON_EXCEPTIONS
320 }; // struct simdjson_result<dom::document_stream>
321 
322 } // namespace simdjson
323 
324 #endif // SIMDJSON_DOCUMENT_STREAM_H
An iterator through a forward-only stream of documents.
A forward-only stream of documents.
simdjson_inline document_stream & operator=(document_stream &&other) noexcept=default
Move one document_stream to another.
size_t size_in_bytes() const noexcept
Returns the input size in bytes.
size_t truncated_bytes() const noexcept
After iterating through the stream, this method returns the number of bytes that were not parsed at t...
simdjson_inline iterator begin() noexcept
Start iterating the documents in the stream.
simdjson_inline document_stream(document_stream &&other) noexcept=default
Move one document_stream to another.
simdjson_inline iterator end() noexcept
The end of the stream, for iterator comparison purposes.
simdjson_inline document_stream() noexcept
Construct an uninitialized document_stream.
A persistent document parser.
Definition: parser.h:58
We want to support argument-dependent lookup (ADL).
error_code
All possible errors returned by simdjson.
Definition: error.h:17
@ UNINITIALIZED
unknown error, or uninitialized document
Definition: error.h:29
The result of a simdjson operation that could fail.
Definition: error.h:205