simdjson  3.9.4
Ridiculously Fast JSON
parser.h
1 #ifndef SIMDJSON_DOM_PARSER_H
2 #define SIMDJSON_DOM_PARSER_H
3 
4 #include "simdjson/dom/base.h"
5 #include "simdjson/dom/document.h"
6 
7 namespace simdjson {
8 
9 namespace dom {
10 
30 class parser {
31 public:
43  simdjson_inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
49  simdjson_inline parser(parser &&other) noexcept;
50  parser(const parser &) = delete;
56  simdjson_inline parser &operator=(parser &&other) noexcept;
57  parser &operator=(const parser &) = delete;
58 
60  ~parser()=default;
61 
105  inline simdjson_result<element> load(const std::string &path) & noexcept;
106  inline simdjson_result<element> load(const std::string &path) && = delete ;
107 
151  inline simdjson_result<element> load_into_document(document& doc, const std::string &path) & noexcept;
152  inline simdjson_result<element> load_into_document(document& doc, const std::string &path) && =delete;
153 
221  inline simdjson_result<element> parse(const uint8_t *buf, size_t len, bool realloc_if_needed = true) & noexcept;
222  inline simdjson_result<element> parse(const uint8_t *buf, size_t len, bool realloc_if_needed = true) && =delete;
224  simdjson_inline simdjson_result<element> parse(const char *buf, size_t len, bool realloc_if_needed = true) & noexcept;
225  simdjson_inline simdjson_result<element> parse(const char *buf, size_t len, bool realloc_if_needed = true) && =delete;
227  simdjson_inline simdjson_result<element> parse(const std::string &s) & noexcept;
228  simdjson_inline simdjson_result<element> parse(const std::string &s) && =delete;
230  simdjson_inline simdjson_result<element> parse(const padded_string &s) & noexcept;
231  simdjson_inline simdjson_result<element> parse(const padded_string &s) && =delete;
233  simdjson_inline simdjson_result<element> parse(const padded_string_view &v) & noexcept;
234  simdjson_inline simdjson_result<element> parse(const padded_string_view &v) && =delete;
235 
237  simdjson_inline simdjson_result<element> parse(const char *buf) noexcept = delete;
238 
283  inline simdjson_result<element> parse_into_document(document& doc, const uint8_t *buf, size_t len, bool realloc_if_needed = true) & noexcept;
284  inline simdjson_result<element> parse_into_document(document& doc, const uint8_t *buf, size_t len, bool realloc_if_needed = true) && =delete;
286  simdjson_inline simdjson_result<element> parse_into_document(document& doc, const char *buf, size_t len, bool realloc_if_needed = true) & noexcept;
287  simdjson_inline simdjson_result<element> parse_into_document(document& doc, const char *buf, size_t len, bool realloc_if_needed = true) && =delete;
289  simdjson_inline simdjson_result<element> parse_into_document(document& doc, const std::string &s) & noexcept;
290  simdjson_inline simdjson_result<element> parse_into_document(document& doc, const std::string &s) && =delete;
292  simdjson_inline simdjson_result<element> parse_into_document(document& doc, const padded_string &s) & noexcept;
293  simdjson_inline simdjson_result<element> parse_into_document(document& doc, const padded_string &s) && =delete;
294 
296  simdjson_inline simdjson_result<element> parse_into_document(document& doc, const char *buf) noexcept = delete;
297 
373  inline simdjson_result<document_stream> load_many(const std::string &path, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
374 
471  inline simdjson_result<document_stream> parse_many(const uint8_t *buf, size_t len, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
473  inline simdjson_result<document_stream> parse_many(const char *buf, size_t len, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
475  inline simdjson_result<document_stream> parse_many(const std::string &s, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
476  inline simdjson_result<document_stream> parse_many(const std::string &&s, size_t batch_size) = delete;// unsafe
478  inline simdjson_result<document_stream> parse_many(const padded_string &s, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
479  inline simdjson_result<document_stream> parse_many(const padded_string &&s, size_t batch_size) = delete;// unsafe
480 
482  simdjson_result<document_stream> parse_many(const char *buf, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept = delete;
483 
492  simdjson_warn_unused inline error_code allocate(size_t capacity, size_t max_depth = DEFAULT_MAX_DEPTH) noexcept;
493 
494 #ifndef SIMDJSON_DISABLE_DEPRECATED_API
506  [[deprecated("Use allocate() instead.")]]
507  simdjson_warn_unused inline bool allocate_capacity(size_t capacity, size_t max_depth = DEFAULT_MAX_DEPTH) noexcept;
508 #endif // SIMDJSON_DISABLE_DEPRECATED_API
514  simdjson_inline size_t capacity() const noexcept;
515 
523  simdjson_inline size_t max_capacity() const noexcept;
524 
530  simdjson_pure simdjson_inline size_t max_depth() const noexcept;
531 
546  simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
547 
548 #ifdef SIMDJSON_THREADS_ENABLED
554  bool threaded{true};
555 #endif
557  class Iterator;
559  using InvalidJSON [[deprecated("Use simdjson_error instead")]] = simdjson_error;
560 
562  std::unique_ptr<internal::dom_parser_implementation> implementation{};
563 
565  bool valid{false};
567  error_code error{UNINITIALIZED};
568 
570  document doc{};
571 
573  [[deprecated("Use the result of parser.parse() instead")]]
574  inline bool is_valid() const noexcept;
575 
580  [[deprecated("Use the result of parser.parse() instead")]]
581  inline int get_error_code() const noexcept;
582 
584  [[deprecated("Use error_message() on the result of parser.parse() instead, or cout << error")]]
585  inline std::string get_error_message() const noexcept;
586 
588  [[deprecated("Use cout << on the result of parser.parse() instead")]]
589  inline bool print_json(std::ostream &os) const noexcept;
590 
592  inline bool dump_raw_tape(std::ostream &os) const noexcept;
593 
594 
595 private:
601  size_t _max_capacity;
602 
606  std::unique_ptr<char[]> loaded_bytes;
607 
609  size_t _loaded_bytes_capacity{0};
610 
611  // all nodes are stored on the doc.tape using a 64-bit word.
612  //
613  // strings, double and ints are stored as
614  // a 64-bit word with a pointer to the actual value
615  //
616  //
617  //
618  // for objects or arrays, store [ or { at the beginning and } and ] at the
619  // end. For the openings ([ or {), we annotate them with a reference to the
620  // location on the doc.tape of the end, and for then closings (} and ]), we
621  // annotate them with a reference to the location of the opening
622  //
623  //
624 
630  inline error_code ensure_capacity(size_t desired_capacity) noexcept;
636  inline error_code ensure_capacity(document& doc, size_t desired_capacity) noexcept;
637 
639  inline simdjson_result<size_t> read_file(const std::string &path) noexcept;
640 
641  friend class parser::Iterator;
642  friend class document_stream;
643 
644 
645 }; // class parser
646 
647 } // namespace dom
648 } // namespace simdjson
649 
650 #endif // SIMDJSON_DOM_PARSER_H
A parsed JSON document.
Definition: document.h:16
A persistent document parser.
Definition: parser.h:30
simdjson_inline parser(size_t max_capacity=SIMDJSON_MAXSIZE_BYTES) noexcept
Create a JSON parser.
Definition: parser-inl.h:23
simdjson_result< element > parse(const uint8_t *buf, size_t len, bool realloc_if_needed=true) &noexcept
Parse a JSON document and return a temporary reference to it.
Definition: parser-inl.h:153
simdjson_result< element > parse_into_document(document &doc, const uint8_t *buf, size_t len, bool realloc_if_needed=true) &noexcept
Parse a JSON document into a provide document instance and return a temporary reference to it.
Definition: parser-inl.h:113
simdjson_inline parser(parser &&other) noexcept
Take another parser's buffers and state.
simdjson_result< document_stream > load_many(const std::string &path, size_t batch_size=dom::DEFAULT_BATCH_SIZE) noexcept
Load a file containing many JSON documents.
Definition: parser-inl.h:105
simdjson_inline void set_max_capacity(size_t max_capacity) noexcept
Set max_capacity.
Definition: parser-inl.h:247
simdjson_inline size_t max_capacity() const noexcept
The largest document this parser can automatically support.
Definition: parser-inl.h:191
simdjson_pure simdjson_inline size_t max_depth() const noexcept
The maximum level of nested object and arrays supported by this parser.
Definition: parser-inl.h:194
simdjson_result< element > load(const std::string &path) &noexcept
Load a JSON document from a file and return a reference to it.
Definition: parser-inl.h:94
simdjson_result< element > load_into_document(document &doc, const std::string &path) &noexcept
Load a JSON document from a file into a provide document instance and return a temporary reference to...
Definition: parser-inl.h:98
~parser()=default
Deallocate the JSON parser.
simdjson_inline size_t capacity() const noexcept
The largest document this parser can support without reallocating.
Definition: parser-inl.h:188
simdjson_inline parser & operator=(parser &&other) noexcept
Take another parser's buffers and state.
simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept
Ensure this parser has enough memory to process JSON documents up to capacity bytes in length and max...
Definition: parser-inl.h:199
simdjson_result< document_stream > parse_many(const uint8_t *buf, size_t len, size_t batch_size=dom::DEFAULT_BATCH_SIZE) noexcept
Parse a buffer containing many JSON documents.
Definition: parser-inl.h:170
An implementation of simdjson for a particular CPU architecture.
User-provided string that promises it has extra padded bytes at the end for use with parser::parse().
The top level simdjson namespace, containing everything the library provides.
Definition: base.h:8
constexpr SIMDJSON_PUSH_DISABLE_UNUSED_WARNINGS size_t SIMDJSON_MAXSIZE_BYTES
The maximum document size supported by simdjson.
Definition: base.h:21
const char * error_message(error_code error) noexcept
It is the convention throughout the code that the macro SIMDJSON_DEVELOPMENT_CHECKS determines whethe...
Definition: error-inl.h:20
constexpr size_t DEFAULT_MAX_DEPTH
By default, simdjson supports this many nested objects and arrays.
Definition: base.h:38
error_code
All possible errors returned by simdjson.
Definition: error.h:19
@ UNINITIALIZED
unknown error, or uninitialized document
Definition: error.h:32
String with extra allocation for ease of use with parser::parse()
Definition: padded_string.h:23
Exception thrown when an exception-supporting simdjson method is called.
Definition: error.h:82
The result of a simdjson operation that could fail.
Definition: error.h:215