simdjson  3.11.0
Ridiculously Fast JSON
document_stream.h
1 #ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
2 
3 #ifndef SIMDJSON_CONDITIONAL_INCLUDE
4 #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
5 #include "simdjson/generic/ondemand/base.h"
6 #include "simdjson/generic/implementation_simdjson_result_base.h"
7 #include "simdjson/generic/ondemand/document.h"
8 #include "simdjson/generic/ondemand/parser.h"
9 #endif // SIMDJSON_CONDITIONAL_INCLUDE
10 
11 #ifdef SIMDJSON_THREADS_ENABLED
12 #include <thread>
13 #include <mutex>
14 #include <condition_variable>
15 #endif
16 
17 namespace simdjson {
18 namespace SIMDJSON_IMPLEMENTATION {
19 namespace ondemand {
20 
21 #ifdef SIMDJSON_THREADS_ENABLED
23 struct stage1_worker {
24  stage1_worker() noexcept = default;
25  stage1_worker(const stage1_worker&) = delete;
26  stage1_worker(stage1_worker&&) = delete;
27  stage1_worker operator=(const stage1_worker&) = delete;
28  ~stage1_worker();
33  void start_thread();
38  void run(document_stream * ds, parser * stage1, size_t next_batch_start);
40  void finish();
41 
42 private:
43 
49  void stop_thread();
50 
51  std::thread thread{};
53  ondemand::parser * stage1_thread_parser{};
54  size_t _next_batch_start{};
55  document_stream * owner{};
60  bool has_work{false};
61  bool can_work{true};
62 
66  std::mutex locking_mutex{};
67  std::condition_variable cond_var{};
68 
69  friend class document_stream;
70 };
71 #endif // SIMDJSON_THREADS_ENABLED
72 
80 public:
89  simdjson_inline document_stream() noexcept;
91  simdjson_inline document_stream(document_stream &&other) noexcept = default;
93  simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
94 
95  simdjson_inline ~document_stream() noexcept;
96 
100  inline size_t size_in_bytes() const noexcept;
101 
120  inline size_t truncated_bytes() const noexcept;
121 
122  class iterator {
123  public:
126  using pointer = void;
127  using difference_type = std::ptrdiff_t;
128  using iterator_category = std::input_iterator_tag;
129 
133  simdjson_inline iterator() noexcept;
137  simdjson_inline reference operator*() noexcept;
141  inline iterator& operator++() noexcept;
146  simdjson_inline bool operator!=(const iterator &other) const noexcept;
162  simdjson_inline size_t current_index() const noexcept;
163 
183  simdjson_inline std::string_view source() const noexcept;
184 
188  inline error_code error() const noexcept;
189 
190  private:
191  simdjson_inline iterator(document_stream *s, bool finished) noexcept;
193  document_stream* stream;
195  bool finished;
196 
197  friend class document;
198  friend class document_stream;
199  friend class json_iterator;
200  };
201 
205  simdjson_inline iterator begin() noexcept;
209  simdjson_inline iterator end() noexcept;
210 
211 private:
212 
213  document_stream &operator=(const document_stream &) = delete; // Disallow copying
214  document_stream(const document_stream &other) = delete; // Disallow copying
215 
225  simdjson_inline document_stream(
226  ondemand::parser &parser,
227  const uint8_t *buf,
228  size_t len,
229  size_t batch_size,
230  bool allow_comma_separated
231  ) noexcept;
232 
237  inline void start() noexcept;
238 
262  inline void next() noexcept;
263 
265  inline void next_document() noexcept;
266 
268  inline size_t next_batch_start() const noexcept;
269 
271  inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept;
272 
273  // Fields
274  ondemand::parser *parser;
275  const uint8_t *buf;
276  size_t len;
277  size_t batch_size;
278  bool allow_comma_separated;
284  document doc{};
286  error_code error;
287  size_t batch_start{0};
288  size_t doc_index{};
289 
290  #ifdef SIMDJSON_THREADS_ENABLED
292  bool use_thread;
293 
294  inline void load_from_stage1_thread() noexcept;
295 
297  inline void start_stage1_thread() noexcept;
298 
300  inline void finish_stage1_thread() noexcept;
301 
303  error_code stage1_thread_error{UNINITIALIZED};
305  std::unique_ptr<stage1_worker> worker{new(std::nothrow) stage1_worker()};
310  ondemand::parser stage1_thread_parser{};
311 
312  friend struct stage1_worker;
313  #endif // SIMDJSON_THREADS_ENABLED
314 
315  friend class parser;
316  friend class document;
317  friend class json_iterator;
318  friend struct simdjson_result<ondemand::document_stream>;
319  friend struct simdjson::internal::simdjson_result_base<ondemand::document_stream>;
320 }; // document_stream
321 
322 } // namespace ondemand
323 } // namespace SIMDJSON_IMPLEMENTATION
324 } // namespace simdjson
325 
326 namespace simdjson {
327 template<>
328 struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_stream> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_stream> {
329 public:
330  simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document_stream &&value) noexcept;
331  simdjson_inline simdjson_result(error_code error) noexcept;
332  simdjson_inline simdjson_result() noexcept = default;
333 };
334 
335 } // namespace simdjson
336 
337 #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
simdjson_inline iterator end() noexcept
The end of the stream, for iterator comparison purposes.
simdjson_inline document_stream(document_stream &&other) noexcept=default
Move one document_stream to another.
size_t size_in_bytes() const noexcept
Returns the input size in bytes.
simdjson_inline document_stream & operator=(document_stream &&other) noexcept=default
Move one document_stream to another.
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() noexcept
Construct an uninitialized document_stream.
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
@ UNINITIALIZED
unknown error, or uninitialized document
Definition: error.h:32
The result of a simdjson operation that could fail.
Definition: error.h:215