simdjson 5.0.1
Ridiculously Fast JSON
Loading...
Searching...
No Matches
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
17namespace simdjson {
18namespace SIMDJSON_IMPLEMENTATION {
19namespace ondemand {
20
21#ifdef SIMDJSON_THREADS_ENABLED
23struct 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
42private:
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
80public:
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
130 inline size_t truncated_bytes() const noexcept;
131
132 class iterator {
133 public:
136 using pointer = void;
137 using difference_type = std::ptrdiff_t;
138 using iterator_category = std::input_iterator_tag;
139
143 simdjson_inline iterator() noexcept;
144 simdjson_inline iterator(const iterator &other) noexcept = default;
148 simdjson_inline reference operator*() noexcept;
152 inline iterator& operator++() noexcept;
157 simdjson_inline bool operator!=(const iterator &other) const noexcept;
158 simdjson_inline bool operator==(const iterator &other) const noexcept;
174 simdjson_inline size_t current_index() const noexcept;
175
195 simdjson_inline std::string_view source() const noexcept;
196
200 inline error_code error() const noexcept;
201
205 inline bool at_end() const noexcept;
206
207 private:
208 simdjson_inline iterator(document_stream *s, bool finished) noexcept;
210 document_stream* stream;
212 bool finished;
213
214 friend class document;
215 friend class document_stream;
216 friend class json_iterator;
217 };
219
223 simdjson_inline iterator begin() noexcept;
227 simdjson_inline iterator end() noexcept;
228
229private:
230
231 document_stream &operator=(const document_stream &) = delete; // Disallow copying
232 document_stream(const document_stream &other) = delete; // Disallow copying
233
245 simdjson_inline document_stream(
246 ondemand::parser &parser,
247 const uint8_t *buf,
248 size_t len,
249 size_t batch_size,
250 bool allow_comma_separated,
252 ) noexcept;
253
258 inline void start() noexcept;
259
283 inline void next() noexcept;
284
294 inline void next_document() noexcept;
296 simdjson_inline uint8_t document_delimiter() const noexcept;
301 simdjson_inline bool skip_to_delimiter(uint8_t delimiter) noexcept;
302
304 inline size_t next_batch_start() const noexcept;
305
307 inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept;
308
309 // Fields
310 ondemand::parser *parser;
311 const uint8_t *buf;
312 size_t len;
313 size_t batch_size;
314 bool allow_comma_separated;
315 stream_format format;
321 document doc{};
323 error_code error;
324 size_t batch_start{0};
325 size_t doc_index{};
326
327 #ifdef SIMDJSON_THREADS_ENABLED
329 bool use_thread;
330
331 inline void load_from_stage1_thread() noexcept;
332
334 inline void start_stage1_thread() noexcept;
335
337 inline void finish_stage1_thread() noexcept;
338
340 error_code stage1_thread_error{UNINITIALIZED};
342 std::unique_ptr<stage1_worker> worker{};
347 ondemand::parser stage1_thread_parser{};
348
349 friend struct stage1_worker;
350 #endif // SIMDJSON_THREADS_ENABLED
351
352 friend class parser;
353 friend class document;
354 friend class json_iterator;
355 friend struct simdjson_result<ondemand::document_stream>;
356 friend struct simdjson::internal::simdjson_result_base<ondemand::document_stream>;
357}; // document_stream
358
359} // namespace ondemand
360} // namespace SIMDJSON_IMPLEMENTATION
361} // namespace simdjson
362
363namespace simdjson {
364template<>
365struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document_stream> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document_stream> {
366public:
367 simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document_stream &&value) noexcept;
368 simdjson_inline simdjson_result(error_code error) noexcept;
369 simdjson_inline simdjson_result() noexcept = default;
370};
371
372} // namespace simdjson
373
374#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.
simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept
Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user i...
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