simdjson 5.0.1
Ridiculously Fast JSON
Loading...
Searching...
No Matches
document_stream.h
1#ifndef SIMDJSON_DOCUMENT_STREAM_H
2#define SIMDJSON_DOCUMENT_STREAM_H
3
4#include "simdjson/dom/base.h"
5#include "simdjson/dom/parser.h"
6
7#ifdef SIMDJSON_THREADS_ENABLED
8#include <thread>
9#include <mutex>
10#include <condition_variable>
11#endif
12
13namespace simdjson {
14namespace dom {
15
16#ifdef SIMDJSON_THREADS_ENABLED
18struct stage1_worker {
19 stage1_worker() noexcept = default;
20 stage1_worker(const stage1_worker&) = delete;
21 stage1_worker(stage1_worker&&) = delete;
22 stage1_worker operator=(const stage1_worker&) = delete;
23 ~stage1_worker();
28 void start_thread();
33 void run(document_stream * ds, dom::parser * stage1, size_t next_batch_start);
35 void finish();
36
37private:
38
44 void stop_thread();
45
46 std::thread thread{};
48 dom::parser * stage1_thread_parser{};
49 size_t _next_batch_start{};
50 document_stream * owner{};
55 bool has_work{false};
56 bool can_work{true};
57
61 std::mutex locking_mutex{};
62 std::condition_variable cond_var{};
63};
64#endif
65
73public:
82 simdjson_inline document_stream() noexcept;
84 simdjson_inline document_stream(document_stream &&other) noexcept = default;
86 simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
87
88 simdjson_inline ~document_stream() noexcept;
92 inline size_t size_in_bytes() const noexcept;
128 inline size_t truncated_bytes() const noexcept;
132 class iterator {
133 public:
135 using reference = value_type;
136
137 using difference_type = std::ptrdiff_t;
138
139 using iterator_category = std::input_iterator_tag;
140
144 simdjson_inline iterator() noexcept;
148 simdjson_inline reference operator*() noexcept;
152 inline iterator& operator++() noexcept;
157 simdjson_inline bool operator!=(const iterator &other) const noexcept;
173 simdjson_inline size_t current_index() const noexcept;
193 simdjson_inline std::string_view source() const noexcept;
194
195 private:
196 simdjson_inline iterator(document_stream *s, bool finished) noexcept;
198 document_stream* stream;
200 bool finished;
201 friend class document_stream;
202 };
203
207 simdjson_inline iterator begin() noexcept;
211 simdjson_inline iterator end() noexcept;
212
213private:
214
215 document_stream &operator=(const document_stream &) = delete; // Disallow copying
216 document_stream(const document_stream &other) = delete; // Disallow copying
217
228 simdjson_inline document_stream(
229 dom::parser &parser,
230 const uint8_t *buf,
231 size_t len,
232 size_t batch_size,
234 ) noexcept;
235
240 inline void start() noexcept;
241
265 inline void next() noexcept;
266
271 inline void load_batch() noexcept;
272
274 inline size_t next_batch_start() const noexcept;
275
277 inline error_code run_stage1(dom::parser &p, size_t batch_start) noexcept;
278
279 dom::parser *parser;
280 const uint8_t *buf;
281 size_t len;
282 size_t batch_size;
284 stream_format format;
286 error_code error;
287 size_t batch_start{0};
288 size_t doc_index{};
289#ifdef SIMDJSON_THREADS_ENABLED
291 bool use_thread;
292
293 inline void load_from_stage1_thread() noexcept;
294
296 inline void start_stage1_thread() noexcept;
297
299 inline void finish_stage1_thread() noexcept;
300
302 error_code stage1_thread_error{UNINITIALIZED};
304 friend struct stage1_worker;
305 std::unique_ptr<stage1_worker> worker{new(std::nothrow) stage1_worker()};
310 dom::parser stage1_thread_parser{};
311#endif // SIMDJSON_THREADS_ENABLED
312
313 friend class dom::parser;
314 friend struct simdjson_result<dom::document_stream>;
315 friend struct internal::simdjson_result_base<dom::document_stream>;
316
317}; // class document_stream
318
319} // namespace dom
320
321template<>
322struct simdjson_result<dom::document_stream> : public internal::simdjson_result_base<dom::document_stream> {
323public:
324 simdjson_inline simdjson_result() noexcept;
325 simdjson_inline simdjson_result(error_code error) noexcept;
326 simdjson_inline simdjson_result(dom::document_stream &&value) noexcept;
327
328#if SIMDJSON_EXCEPTIONS
329 simdjson_inline dom::document_stream::iterator begin() noexcept(false);
330 simdjson_inline dom::document_stream::iterator end() noexcept(false);
331#else // SIMDJSON_EXCEPTIONS
332#ifndef SIMDJSON_DISABLE_DEPRECATED_API
333 [[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
334 simdjson_inline dom::document_stream::iterator begin() noexcept;
335 [[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
336 simdjson_inline dom::document_stream::iterator end() noexcept;
337#endif // SIMDJSON_DISABLE_DEPRECATED_API
338#endif // SIMDJSON_EXCEPTIONS
339}; // struct simdjson_result<dom::document_stream>
340
341} // namespace simdjson
342
343#endif // SIMDJSON_DOCUMENT_STREAM_H
An iterator through a forward-only stream of documents.
A forward-only stream of documents.
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 document_stream & operator=(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:30
The top level simdjson namespace, containing everything the library provides.
Definition base.h:8
stream_format
Stream format for parse_many/iterate_many.
Definition base.h:61
@ whitespace_delimited
Whitespace-delimited JSON documents (default, includes NDJSON/JSONL)
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:281