1#ifndef SIMDJSON_DOM_DOCUMENT_H
2#define SIMDJSON_DOM_DOCUMENT_H
3
4#include "simdjson/common_defs.h"
5#include <memory>
6#include <ostream>
7
8namespace simdjson {
9namespace dom {
10
11class element;
12
13/**
14 * A parsed JSON document.
15 *
16 * This class cannot be copied, only moved, to avoid unintended allocations.
17 */
18class document {
19public:
20 /**
21 * Create a document container with zero capacity.
22 *
23 * The parser will allocate capacity as needed.
24 */
25 document() noexcept = default;
26 ~document() noexcept = default;
27
28 /**
29 * Take another document's buffers.
30 *
31 * @param other The document to take. Its capacity is zeroed and it is invalidated.
32 */
33 document(document &&other) noexcept = default;
34 /** @private */
35 document(const document &) = delete; // Disallow copying
36 /**
37 * Take another document's buffers.
38 *
39 * @param other The document to take. Its capacity is zeroed.
40 */
41 document &operator=(document &&other) noexcept = default;
42 /** @private */
43 document &operator=(const document &) = delete; // Disallow copying
44
45 /**
46 * Get the root element of this document as a JSON array.
47 */
48 element root() const noexcept;
49
50 /**
51 * @private Dump the raw tape for debugging.
52 *
53 * @param os the stream to output to.
54 * @return false if the tape is likely wrong (e.g., you did not parse a valid JSON).
55 */
56 bool dump_raw_tape(std::ostream &os) const noexcept;
57
58 /** @private Structural values. */
59 std::unique_ptr<uint64_t[]> tape{};
60
61 /** @private String values.
62 *
63 * Should be at least byte_capacity.
64 */
65 std::unique_ptr<uint8_t[]> string_buf{};
66 /** @private Allocate memory to support
67 * input JSON documents of up to len bytes.
68 *
69 * When calling this function, you lose
70 * all the data.
71 *
72 * The memory allocation is strict: you
73 * can you use this function to increase
74 * or lower the amount of allocated memory.
75 * Passsing zero clears the memory.
76 */
77 error_code allocate(size_t len) noexcept;
78 /** @private Capacity in bytes, in terms
79 * of how many bytes of input JSON we can
80 * support.
81 */
82 size_t capacity() const noexcept;
83
84
85private:
86 size_t allocated_capacity{0};
87 friend class parser;
88}; // class document
89
90} // namespace dom
91} // namespace simdjson
92
93#endif // SIMDJSON_DOM_DOCUMENT_H
94