simdjson 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +5 -0
  3. data/.gitignore +14 -0
  4. data/.gitmodules +3 -0
  5. data/.rubocop.yml +9 -0
  6. data/.travis.yml +7 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +39 -0
  10. data/Rakefile +32 -0
  11. data/benchmark/apache_builds.json +4421 -0
  12. data/benchmark/demo.json +15 -0
  13. data/benchmark/github_events.json +1390 -0
  14. data/benchmark/run_benchmark.rb +30 -0
  15. data/ext/simdjson/extconf.rb +22 -0
  16. data/ext/simdjson/simdjson.cpp +76 -0
  17. data/ext/simdjson/simdjson.hpp +6 -0
  18. data/lib/simdjson/version.rb +3 -0
  19. data/lib/simdjson.rb +2 -0
  20. data/simdjson.gemspec +35 -0
  21. data/vendor/.gitkeep +0 -0
  22. data/vendor/simdjson/AUTHORS +3 -0
  23. data/vendor/simdjson/CMakeLists.txt +63 -0
  24. data/vendor/simdjson/CONTRIBUTORS +27 -0
  25. data/vendor/simdjson/Dockerfile +10 -0
  26. data/vendor/simdjson/LICENSE +201 -0
  27. data/vendor/simdjson/Makefile +203 -0
  28. data/vendor/simdjson/Notes.md +85 -0
  29. data/vendor/simdjson/README.md +581 -0
  30. data/vendor/simdjson/amalgamation.sh +158 -0
  31. data/vendor/simdjson/benchmark/CMakeLists.txt +8 -0
  32. data/vendor/simdjson/benchmark/benchmark.h +223 -0
  33. data/vendor/simdjson/benchmark/distinctuseridcompetition.cpp +347 -0
  34. data/vendor/simdjson/benchmark/linux/linux-perf-events.h +93 -0
  35. data/vendor/simdjson/benchmark/minifiercompetition.cpp +181 -0
  36. data/vendor/simdjson/benchmark/parse.cpp +393 -0
  37. data/vendor/simdjson/benchmark/parseandstatcompetition.cpp +305 -0
  38. data/vendor/simdjson/benchmark/parsingcompetition.cpp +298 -0
  39. data/vendor/simdjson/benchmark/statisticalmodel.cpp +208 -0
  40. data/vendor/simdjson/dependencies/jsoncppdist/json/json-forwards.h +344 -0
  41. data/vendor/simdjson/dependencies/jsoncppdist/json/json.h +2366 -0
  42. data/vendor/simdjson/dependencies/jsoncppdist/jsoncpp.cpp +5418 -0
  43. data/vendor/simdjson/doc/apache_builds.jsonparseandstat.png +0 -0
  44. data/vendor/simdjson/doc/gbps.png +0 -0
  45. data/vendor/simdjson/doc/github_events.jsonparseandstat.png +0 -0
  46. data/vendor/simdjson/doc/twitter.jsonparseandstat.png +0 -0
  47. data/vendor/simdjson/doc/update-center.jsonparseandstat.png +0 -0
  48. data/vendor/simdjson/images/halvarflake.png +0 -0
  49. data/vendor/simdjson/images/logo.png +0 -0
  50. data/vendor/simdjson/include/simdjson/common_defs.h +102 -0
  51. data/vendor/simdjson/include/simdjson/isadetection.h +152 -0
  52. data/vendor/simdjson/include/simdjson/jsoncharutils.h +301 -0
  53. data/vendor/simdjson/include/simdjson/jsonformatutils.h +202 -0
  54. data/vendor/simdjson/include/simdjson/jsonioutil.h +32 -0
  55. data/vendor/simdjson/include/simdjson/jsonminifier.h +30 -0
  56. data/vendor/simdjson/include/simdjson/jsonparser.h +250 -0
  57. data/vendor/simdjson/include/simdjson/numberparsing.h +587 -0
  58. data/vendor/simdjson/include/simdjson/padded_string.h +70 -0
  59. data/vendor/simdjson/include/simdjson/parsedjson.h +544 -0
  60. data/vendor/simdjson/include/simdjson/portability.h +172 -0
  61. data/vendor/simdjson/include/simdjson/simdjson.h +44 -0
  62. data/vendor/simdjson/include/simdjson/simdjson_version.h +13 -0
  63. data/vendor/simdjson/include/simdjson/simdprune_tables.h +35074 -0
  64. data/vendor/simdjson/include/simdjson/simdutf8check_arm64.h +180 -0
  65. data/vendor/simdjson/include/simdjson/simdutf8check_haswell.h +198 -0
  66. data/vendor/simdjson/include/simdjson/simdutf8check_westmere.h +169 -0
  67. data/vendor/simdjson/include/simdjson/stage1_find_marks.h +121 -0
  68. data/vendor/simdjson/include/simdjson/stage1_find_marks_arm64.h +210 -0
  69. data/vendor/simdjson/include/simdjson/stage1_find_marks_flatten.h +93 -0
  70. data/vendor/simdjson/include/simdjson/stage1_find_marks_flatten_haswell.h +95 -0
  71. data/vendor/simdjson/include/simdjson/stage1_find_marks_haswell.h +210 -0
  72. data/vendor/simdjson/include/simdjson/stage1_find_marks_macros.h +239 -0
  73. data/vendor/simdjson/include/simdjson/stage1_find_marks_westmere.h +194 -0
  74. data/vendor/simdjson/include/simdjson/stage2_build_tape.h +85 -0
  75. data/vendor/simdjson/include/simdjson/stringparsing.h +105 -0
  76. data/vendor/simdjson/include/simdjson/stringparsing_arm64.h +56 -0
  77. data/vendor/simdjson/include/simdjson/stringparsing_haswell.h +43 -0
  78. data/vendor/simdjson/include/simdjson/stringparsing_macros.h +88 -0
  79. data/vendor/simdjson/include/simdjson/stringparsing_westmere.h +41 -0
  80. data/vendor/simdjson/jsonexamples/small/jsoniter_scala/README.md +4 -0
  81. data/vendor/simdjson/scripts/dumpsimplestats.sh +11 -0
  82. data/vendor/simdjson/scripts/issue150.sh +14 -0
  83. data/vendor/simdjson/scripts/javascript/README.md +3 -0
  84. data/vendor/simdjson/scripts/javascript/generatelargejson.js +19 -0
  85. data/vendor/simdjson/scripts/minifier.sh +11 -0
  86. data/vendor/simdjson/scripts/parseandstat.sh +24 -0
  87. data/vendor/simdjson/scripts/parser.sh +11 -0
  88. data/vendor/simdjson/scripts/parsingcompdata.sh +26 -0
  89. data/vendor/simdjson/scripts/plotparse.sh +98 -0
  90. data/vendor/simdjson/scripts/selectparser.sh +11 -0
  91. data/vendor/simdjson/scripts/setupfortesting/disablehyperthreading.sh +15 -0
  92. data/vendor/simdjson/scripts/setupfortesting/powerpolicy.sh +32 -0
  93. data/vendor/simdjson/scripts/setupfortesting/setupfortesting.sh +6 -0
  94. data/vendor/simdjson/scripts/setupfortesting/turboboost.sh +51 -0
  95. data/vendor/simdjson/scripts/testjson2json.sh +99 -0
  96. data/vendor/simdjson/scripts/transitions/Makefile +10 -0
  97. data/vendor/simdjson/scripts/transitions/generatetransitions.cpp +20 -0
  98. data/vendor/simdjson/singleheader/README.md +1 -0
  99. data/vendor/simdjson/singleheader/amalgamation_demo.cpp +20 -0
  100. data/vendor/simdjson/singleheader/simdjson.cpp +1652 -0
  101. data/vendor/simdjson/singleheader/simdjson.h +39692 -0
  102. data/vendor/simdjson/src/CMakeLists.txt +67 -0
  103. data/vendor/simdjson/src/jsonioutil.cpp +35 -0
  104. data/vendor/simdjson/src/jsonminifier.cpp +285 -0
  105. data/vendor/simdjson/src/jsonparser.cpp +91 -0
  106. data/vendor/simdjson/src/parsedjson.cpp +323 -0
  107. data/vendor/simdjson/src/parsedjsoniterator.cpp +272 -0
  108. data/vendor/simdjson/src/simdjson.cpp +30 -0
  109. data/vendor/simdjson/src/stage1_find_marks.cpp +41 -0
  110. data/vendor/simdjson/src/stage2_build_tape.cpp +567 -0
  111. data/vendor/simdjson/style/clang-format-check.sh +25 -0
  112. data/vendor/simdjson/style/clang-format.sh +25 -0
  113. data/vendor/simdjson/style/run-clang-format.py +326 -0
  114. data/vendor/simdjson/tape.md +134 -0
  115. data/vendor/simdjson/tests/CMakeLists.txt +25 -0
  116. data/vendor/simdjson/tests/allparserscheckfile.cpp +192 -0
  117. data/vendor/simdjson/tests/basictests.cpp +75 -0
  118. data/vendor/simdjson/tests/jsoncheck.cpp +136 -0
  119. data/vendor/simdjson/tests/numberparsingcheck.cpp +224 -0
  120. data/vendor/simdjson/tests/pointercheck.cpp +38 -0
  121. data/vendor/simdjson/tests/singleheadertest.cpp +22 -0
  122. data/vendor/simdjson/tests/stringparsingcheck.cpp +408 -0
  123. data/vendor/simdjson/tools/CMakeLists.txt +3 -0
  124. data/vendor/simdjson/tools/cmake/FindCTargets.cmake +15 -0
  125. data/vendor/simdjson/tools/cmake/FindOptions.cmake +52 -0
  126. data/vendor/simdjson/tools/json2json.cpp +112 -0
  127. data/vendor/simdjson/tools/jsonpointer.cpp +93 -0
  128. data/vendor/simdjson/tools/jsonstats.cpp +143 -0
  129. data/vendor/simdjson/tools/minify.cpp +21 -0
  130. data/vendor/simdjson/tools/release.py +125 -0
  131. data/vendor/simdjson/windows/dirent_portable.h +1043 -0
  132. metadata +273 -0
@@ -0,0 +1,202 @@
1
+ #ifndef SIMDJSON_JSONFORMATUTILS_H
2
+ #define SIMDJSON_JSONFORMATUTILS_H
3
+
4
+ #include <cstdio>
5
+ #include <iomanip>
6
+ #include <iostream>
7
+
8
+ namespace simdjson {
9
+ // ends with zero char
10
+ static inline void print_with_escapes(const unsigned char *src) {
11
+ while (*src) {
12
+ switch (*src) {
13
+ case '\b':
14
+ putchar('\\');
15
+ putchar('b');
16
+ break;
17
+ case '\f':
18
+ putchar('\\');
19
+ putchar('f');
20
+ break;
21
+ case '\n':
22
+ putchar('\\');
23
+ putchar('n');
24
+ break;
25
+ case '\r':
26
+ putchar('\\');
27
+ putchar('r');
28
+ break;
29
+ case '\"':
30
+ putchar('\\');
31
+ putchar('"');
32
+ break;
33
+ case '\t':
34
+ putchar('\\');
35
+ putchar('t');
36
+ break;
37
+ case '\\':
38
+ putchar('\\');
39
+ putchar('\\');
40
+ break;
41
+ default:
42
+ if (*src <= 0x1F) {
43
+ printf("\\u%04x", *src);
44
+ } else {
45
+ putchar(*src);
46
+ }
47
+ }
48
+ src++;
49
+ }
50
+ }
51
+
52
+ // ends with zero char
53
+ static inline void print_with_escapes(const unsigned char *src,
54
+ std::ostream &os) {
55
+ while (*src) {
56
+ switch (*src) {
57
+ case '\b':
58
+ os << '\\';
59
+ os << 'b';
60
+ break;
61
+ case '\f':
62
+ os << '\\';
63
+ os << 'f';
64
+ break;
65
+ case '\n':
66
+ os << '\\';
67
+ os << 'n';
68
+ break;
69
+ case '\r':
70
+ os << '\\';
71
+ os << 'r';
72
+ break;
73
+ case '\"':
74
+ os << '\\';
75
+ os << '"';
76
+ break;
77
+ case '\t':
78
+ os << '\\';
79
+ os << 't';
80
+ break;
81
+ case '\\':
82
+ os << '\\';
83
+ os << '\\';
84
+ break;
85
+ default:
86
+ if (*src <= 0x1F) {
87
+ std::ios::fmtflags f(os.flags());
88
+ os << std::hex << std::setw(4) << std::setfill('0')
89
+ << static_cast<int>(*src);
90
+ os.flags(f);
91
+ } else {
92
+ os << *src;
93
+ }
94
+ }
95
+ src++;
96
+ }
97
+ }
98
+
99
+ // print len chars
100
+ static inline void print_with_escapes(const unsigned char *src, size_t len) {
101
+ const unsigned char *finalsrc = src + len;
102
+ while (src < finalsrc) {
103
+ switch (*src) {
104
+ case '\b':
105
+ putchar('\\');
106
+ putchar('b');
107
+ break;
108
+ case '\f':
109
+ putchar('\\');
110
+ putchar('f');
111
+ break;
112
+ case '\n':
113
+ putchar('\\');
114
+ putchar('n');
115
+ break;
116
+ case '\r':
117
+ putchar('\\');
118
+ putchar('r');
119
+ break;
120
+ case '\"':
121
+ putchar('\\');
122
+ putchar('"');
123
+ break;
124
+ case '\t':
125
+ putchar('\\');
126
+ putchar('t');
127
+ break;
128
+ case '\\':
129
+ putchar('\\');
130
+ putchar('\\');
131
+ break;
132
+ default:
133
+ if (*src <= 0x1F) {
134
+ printf("\\u%04x", *src);
135
+ } else {
136
+ putchar(*src);
137
+ }
138
+ }
139
+ src++;
140
+ }
141
+ }
142
+
143
+ // print len chars
144
+ static inline void print_with_escapes(const unsigned char *src,
145
+ std::ostream &os, size_t len) {
146
+ const unsigned char *finalsrc = src + len;
147
+ while (src < finalsrc) {
148
+ switch (*src) {
149
+ case '\b':
150
+ os << '\\';
151
+ os << 'b';
152
+ break;
153
+ case '\f':
154
+ os << '\\';
155
+ os << 'f';
156
+ break;
157
+ case '\n':
158
+ os << '\\';
159
+ os << 'n';
160
+ break;
161
+ case '\r':
162
+ os << '\\';
163
+ os << 'r';
164
+ break;
165
+ case '\"':
166
+ os << '\\';
167
+ os << '"';
168
+ break;
169
+ case '\t':
170
+ os << '\\';
171
+ os << 't';
172
+ break;
173
+ case '\\':
174
+ os << '\\';
175
+ os << '\\';
176
+ break;
177
+ default:
178
+ if (*src <= 0x1F) {
179
+ std::ios::fmtflags f(os.flags());
180
+ os << std::hex << std::setw(4) << std::setfill('0')
181
+ << static_cast<int>(*src);
182
+ os.flags(f);
183
+ } else {
184
+ os << *src;
185
+ }
186
+ }
187
+ src++;
188
+ }
189
+ }
190
+
191
+ static inline void print_with_escapes(const char *src, std::ostream &os) {
192
+ print_with_escapes(reinterpret_cast<const unsigned char *>(src), os);
193
+ }
194
+
195
+ static inline void print_with_escapes(const char *src, std::ostream &os,
196
+ size_t len) {
197
+ print_with_escapes(reinterpret_cast<const unsigned char *>(src), os, len);
198
+ }
199
+ } // namespace simdjson
200
+
201
+ #
202
+ #endif
@@ -0,0 +1,32 @@
1
+ #ifndef SIMDJSON_JSONIOUTIL_H
2
+ #define SIMDJSON_JSONIOUTIL_H
3
+
4
+ #include "simdjson/common_defs.h"
5
+ #include <exception>
6
+ #include <fstream>
7
+ #include <iostream>
8
+ #include <sstream>
9
+ #include <string>
10
+
11
+ #include "simdjson/padded_string.h"
12
+
13
+ namespace simdjson {
14
+
15
+ // load a file in memory...
16
+ // get a corpus; pad out to cache line so we can always use SIMD
17
+ // throws exceptions in case of failure
18
+ // first element of the pair is a string (null terminated)
19
+ // whereas the second element is the length.
20
+ // caller is responsible to free (aligned_free((void*)result.data())))
21
+ //
22
+ // throws an exception if the file cannot be opened, use try/catch
23
+ // try {
24
+ // p = get_corpus(filename);
25
+ // } catch (const std::exception& e) {
26
+ // aligned_free((void*)p.data());
27
+ // std::cout << "Could not load the file " << filename << std::endl;
28
+ // }
29
+ padded_string get_corpus(const std::string &filename);
30
+ } // namespace simdjson
31
+
32
+ #endif
@@ -0,0 +1,30 @@
1
+ #ifndef SIMDJSON_JSONMINIFIER_H
2
+ #define SIMDJSON_JSONMINIFIER_H
3
+
4
+ #include "simdjson/padded_string.h"
5
+ #include <cstddef>
6
+ #include <cstdint>
7
+ #include <string_view>
8
+
9
+ namespace simdjson {
10
+
11
+ // Take input from buf and remove useless whitespace, write it to out; buf and
12
+ // out can be the same pointer. Result is null terminated,
13
+ // return the string length (minus the null termination).
14
+ // The accelerated version of this function only runs on AVX2 hardware.
15
+ size_t json_minify(const uint8_t *buf, size_t len, uint8_t *out);
16
+
17
+ static inline size_t json_minify(const char *buf, size_t len, char *out) {
18
+ return json_minify(reinterpret_cast<const uint8_t *>(buf), len,
19
+ reinterpret_cast<uint8_t *>(out));
20
+ }
21
+
22
+ static inline size_t json_minify(const std::string_view &p, char *out) {
23
+ return json_minify(p.data(), p.size(), out);
24
+ }
25
+
26
+ static inline size_t json_minify(const padded_string &p, char *out) {
27
+ return json_minify(p.data(), p.size(), out);
28
+ }
29
+ } // namespace simdjson
30
+ #endif
@@ -0,0 +1,250 @@
1
+ #ifndef SIMDJSON_JSONPARSER_H
2
+ #define SIMDJSON_JSONPARSER_H
3
+ #include "simdjson/common_defs.h"
4
+ #include "simdjson/jsonioutil.h"
5
+ #include "simdjson/padded_string.h"
6
+ #include "simdjson/parsedjson.h"
7
+ #include "simdjson/simdjson.h"
8
+ #include "simdjson/stage1_find_marks.h"
9
+ #include "simdjson/stage2_build_tape.h"
10
+ #include <string>
11
+ #ifdef _MSC_VER
12
+ #include <windows.h>
13
+ // must be included after windows.h
14
+ #include <sysinfoapi.h>
15
+ #else
16
+ #include <unistd.h>
17
+ #endif
18
+
19
+ namespace simdjson {
20
+ // json_parse_implementation is the generic function, it is specialized for
21
+ // various architectures, e.g., as
22
+ // json_parse_implementation<Architecture::HASWELL> or
23
+ // json_parse_implementation<Architecture::ARM64>
24
+ template <Architecture T>
25
+ int json_parse_implementation(const uint8_t *buf, size_t len, ParsedJson &pj,
26
+ bool realloc_if_needed = true) {
27
+ if (pj.byte_capacity < len) {
28
+ return simdjson::CAPACITY;
29
+ }
30
+ bool reallocated = false;
31
+ if (realloc_if_needed) {
32
+ #if ALLOW_SAME_PAGE_BUFFER_OVERRUN
33
+ // realloc is needed if the end of the memory crosses a page
34
+ #ifdef _MSC_VER
35
+ SYSTEM_INFO sysInfo;
36
+ GetSystemInfo(&sysInfo);
37
+ long page_size = sysInfo.dwPageSize;
38
+ #else
39
+ long page_size = sysconf(_SC_PAGESIZE);
40
+ #endif
41
+ //////////////
42
+ // We want to check that buf + len - 1 and buf + len - 1 + SIMDJSON_PADDING
43
+ // are in the same page.
44
+ // That is, we want to check that
45
+ // (buf + len - 1) / page_size == (buf + len - 1 + SIMDJSON_PADDING) /
46
+ // page_size That's true if (buf + len - 1) % page_size + SIMDJSON_PADDING <
47
+ // page_size.
48
+ ///////////
49
+ if ((reinterpret_cast<uintptr_t>(buf + len - 1) % page_size) +
50
+ SIMDJSON_PADDING <
51
+ static_cast<uintptr_t>(page_size)) {
52
+ #else // SIMDJSON_SAFE_SAME_PAGE_READ_OVERRUN
53
+ if (true) { // if not SIMDJSON_SAFE_SAME_PAGE_READ_OVERRUN, we always
54
+ // reallocate
55
+ #endif
56
+ const uint8_t *tmp_buf = buf;
57
+ buf = (uint8_t *)allocate_padded_buffer(len);
58
+ if (buf == NULL)
59
+ return simdjson::MEMALLOC;
60
+ memcpy((void *)buf, tmp_buf, len);
61
+ reallocated = true;
62
+ } // if (true) OR if ( (reinterpret_cast<uintptr_t>(buf + len - 1) %
63
+ // page_size ) + SIMDJSON_PADDING < static_cast<uintptr_t>(page_size) ) {
64
+ } // if(realloc_if_needed) {
65
+ int stage1_is_ok = simdjson::find_structural_bits<T>(buf, len, pj);
66
+ if (stage1_is_ok != simdjson::SUCCESS) {
67
+ pj.error_code = stage1_is_ok;
68
+ return pj.error_code;
69
+ }
70
+ int res = unified_machine<T>(buf, len, pj);
71
+ if (reallocated) {
72
+ aligned_free((void *)buf);
73
+ }
74
+ return res;
75
+ }
76
+
77
+ // Parse a document found in buf.
78
+ //
79
+ // The content should be a valid JSON document encoded as UTF-8. If there is a
80
+ // UTF-8 BOM, the caller is responsible for omitting it, UTF-8 BOM are
81
+ // discouraged.
82
+ //
83
+ // You need to preallocate ParsedJson with a capacity of len (e.g.,
84
+ // pj.allocate_capacity(len)).
85
+ //
86
+ // The function returns simdjson::SUCCESS (an integer = 0) in case of a success
87
+ // or an error code from simdjson/simdjson.h in case of failure such as
88
+ // simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
89
+ // the simdjson::error_message function converts these error codes into a
90
+ // string).
91
+ //
92
+ // You can also check validity by calling pj.is_valid(). The same ParsedJson can
93
+ // be reused for other documents.
94
+ //
95
+ // If realloc_if_needed is true (default) then a temporary buffer is created
96
+ // when needed during processing (a copy of the input string is made). The input
97
+ // buf should be readable up to buf + len + SIMDJSON_PADDING if
98
+ // realloc_if_needed is false, all bytes at and after buf + len are ignored
99
+ // (can be garbage). The ParsedJson object can be reused.
100
+
101
+ int json_parse(const uint8_t *buf, size_t len, ParsedJson &pj,
102
+ bool realloc_if_needed = true);
103
+
104
+ // Parse a document found in buf.
105
+ //
106
+ // The content should be a valid JSON document encoded as UTF-8. If there is a
107
+ // UTF-8 BOM, the caller is responsible for omitting it, UTF-8 BOM are
108
+ // discouraged.
109
+ //
110
+ // You need to preallocate ParsedJson with a capacity of len (e.g.,
111
+ // pj.allocate_capacity(len)).
112
+ //
113
+ // The function returns simdjson::SUCCESS (an integer = 0) in case of a success
114
+ // or an error code from simdjson/simdjson.h in case of failure such as
115
+ // simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
116
+ // the simdjson::error_message function converts these error codes into a
117
+ // string).
118
+ //
119
+ // You can also check validity
120
+ // by calling pj.is_valid(). The same ParsedJson can be reused for other
121
+ // documents.
122
+ //
123
+ // If realloc_if_needed is true (default) then a temporary buffer is created
124
+ // when needed during processing (a copy of the input string is made). The input
125
+ // buf should be readable up to buf + len + SIMDJSON_PADDING if
126
+ // realloc_if_needed is false, all bytes at and after buf + len are ignored
127
+ // (can be garbage). The ParsedJson object can be reused.
128
+ int json_parse(const char *buf, size_t len, ParsedJson &pj,
129
+ bool realloc_if_needed = true);
130
+
131
+ // We do not want to allow implicit conversion from C string to std::string.
132
+ int json_parse(const char *buf, ParsedJson &pj) = delete;
133
+
134
+ // Parse a document found in in string s.
135
+ // You need to preallocate ParsedJson with a capacity of len (e.g.,
136
+ // pj.allocate_capacity(len)).
137
+ //
138
+ // The function returns simdjson::SUCCESS (an integer = 0) in case of a success
139
+ // or an error code from simdjson/simdjson.h in case of failure such as
140
+ // simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
141
+ // the simdjson::error_message function converts these error codes into a
142
+ // string).
143
+ //
144
+ // A temporary buffer is created when needed during processing
145
+ // (a copy of the input string is made).
146
+ inline int json_parse(const std::string &s, ParsedJson &pj) {
147
+ return json_parse(s.data(), s.length(), pj, true);
148
+ }
149
+
150
+ // Parse a document found in in string s.
151
+ //
152
+ // The content should be a valid JSON document encoded as UTF-8. If there is a
153
+ // UTF-8 BOM, the caller is responsible for omitting it, UTF-8 BOM are
154
+ // discouraged.
155
+ //
156
+ // You need to preallocate ParsedJson with a capacity of len (e.g.,
157
+ // pj.allocate_capacity(len)).
158
+ //
159
+ // The function returns simdjson::SUCCESS (an integer = 0) in case of a success
160
+ // or an error code from simdjson/simdjson.h in case of failure such as
161
+ // simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
162
+ // the simdjson::error_message function converts these error codes into a
163
+ // string).
164
+ //
165
+ // You can also check validity
166
+ // by calling pj.is_valid(). The same ParsedJson can be reused for other
167
+ // documents.
168
+ inline int json_parse(const padded_string &s, ParsedJson &pj) {
169
+ return json_parse(s.data(), s.length(), pj, false);
170
+ }
171
+
172
+ // Build a ParsedJson object. You can check validity
173
+ // by calling pj.is_valid(). This does the memory allocation needed for
174
+ // ParsedJson. If realloc_if_needed is true (default) then a temporary buffer is
175
+ // created when needed during processing (a copy of the input string is made).
176
+ //
177
+ // The input buf should be readable up to buf + len + SIMDJSON_PADDING if
178
+ // realloc_if_needed is false, all bytes at and after buf + len are ignored
179
+ // (can be garbage).
180
+ //
181
+ // The content should be a valid JSON document encoded as UTF-8. If there is a
182
+ // UTF-8 BOM, the caller is responsible for omitting it, UTF-8 BOM are
183
+ // discouraged.
184
+ //
185
+ // This is a convenience function which calls json_parse.
186
+ WARN_UNUSED
187
+ ParsedJson build_parsed_json(const uint8_t *buf, size_t len,
188
+ bool realloc_if_needed = true);
189
+
190
+ WARN_UNUSED
191
+ // Build a ParsedJson object. You can check validity
192
+ // by calling pj.is_valid(). This does the memory allocation needed for
193
+ // ParsedJson. If realloc_if_needed is true (default) then a temporary buffer is
194
+ // created when needed during processing (a copy of the input string is made).
195
+ //
196
+ // The input buf should be readable up to buf + len + SIMDJSON_PADDING if
197
+ // realloc_if_needed is false, all bytes at and after buf + len are ignored
198
+ // (can be garbage).
199
+ //
200
+ //
201
+ // The content should be a valid JSON document encoded as UTF-8. If there is a
202
+ // UTF-8 BOM, the caller is responsible for omitting it, UTF-8 BOM are
203
+ // discouraged.
204
+ //
205
+ // This is a convenience function which calls json_parse.
206
+ inline ParsedJson build_parsed_json(const char *buf, size_t len,
207
+ bool realloc_if_needed = true) {
208
+ return build_parsed_json(reinterpret_cast<const uint8_t *>(buf), len,
209
+ realloc_if_needed);
210
+ }
211
+
212
+ // We do not want to allow implicit conversion from C string to std::string.
213
+ ParsedJson build_parsed_json(const char *buf) = delete;
214
+
215
+ // Parse a document found in in string s.
216
+ // You need to preallocate ParsedJson with a capacity of len (e.g.,
217
+ // pj.allocate_capacity(len)). Return SUCCESS (an integer = 0) in case of a
218
+ // success. You can also check validity by calling pj.is_valid(). The same
219
+ // ParsedJson can be reused for other documents.
220
+ //
221
+ // A temporary buffer is created when needed during processing
222
+ // (a copy of the input string is made).
223
+ //
224
+ // The content should be a valid JSON document encoded as UTF-8. If there is a
225
+ // UTF-8 BOM, the caller is responsible for omitting it, UTF-8 BOM are
226
+ // discouraged.
227
+ //
228
+ // This is a convenience function which calls json_parse.
229
+ WARN_UNUSED
230
+ inline ParsedJson build_parsed_json(const std::string &s) {
231
+ return build_parsed_json(s.data(), s.length(), true);
232
+ }
233
+
234
+ // Parse a document found in in string s.
235
+ // You need to preallocate ParsedJson with a capacity of len (e.g.,
236
+ // pj.allocate_capacity(len)). Return SUCCESS (an integer = 0) in case of a
237
+ // success. You can also check validity by calling pj.is_valid(). The same
238
+ // ParsedJson can be reused for other documents.
239
+ //
240
+ // The content should be a valid JSON document encoded as UTF-8. If there is a
241
+ // UTF-8 BOM, the caller is responsible for omitting it, UTF-8 BOM are
242
+ // discouraged.
243
+ //
244
+ // This is a convenience function which calls json_parse.
245
+ WARN_UNUSED
246
+ inline ParsedJson build_parsed_json(const padded_string &s) {
247
+ return build_parsed_json(s.data(), s.length(), false);
248
+ }
249
+ } // namespace simdjson
250
+ #endif