simdjson  3.11.0
Ridiculously Fast JSON
element-inl.h
1 #ifndef SIMDJSON_ELEMENT_INL_H
2 #define SIMDJSON_ELEMENT_INL_H
3 
4 #include "simdjson/dom/base.h"
5 #include "simdjson/dom/element.h"
6 #include "simdjson/dom/document.h"
7 #include "simdjson/dom/object.h"
8 #include "simdjson/internal/tape_type.h"
9 
10 #include "simdjson/dom/object-inl.h"
11 #include "simdjson/error-inl.h"
12 #include "simdjson/jsonpathutil.h"
13 
14 #include <ostream>
15 #include <limits>
16 
17 namespace simdjson {
18 
19 //
20 // simdjson_result<dom::element> inline implementation
21 //
22 simdjson_inline simdjson_result<dom::element>::simdjson_result() noexcept
23  : internal::simdjson_result_base<dom::element>() {}
24 simdjson_inline simdjson_result<dom::element>::simdjson_result(dom::element &&value) noexcept
25  : internal::simdjson_result_base<dom::element>(std::forward<dom::element>(value)) {}
26 simdjson_inline simdjson_result<dom::element>::simdjson_result(error_code error) noexcept
27  : internal::simdjson_result_base<dom::element>(error) {}
28 inline simdjson_result<dom::element_type> simdjson_result<dom::element>::type() const noexcept {
29  if (error()) { return error(); }
30  return first.type();
31 }
32 
33 template<typename T>
34 simdjson_inline bool simdjson_result<dom::element>::is() const noexcept {
35  return !error() && first.is<T>();
36 }
37 template<typename T>
38 simdjson_inline simdjson_result<T> simdjson_result<dom::element>::get() const noexcept {
39  if (error()) { return error(); }
40  return first.get<T>();
41 }
42 template<typename T>
43 simdjson_warn_unused simdjson_inline error_code simdjson_result<dom::element>::get(T &value) const noexcept {
44  if (error()) { return error(); }
45  return first.get<T>(value);
46 }
47 
48 simdjson_inline simdjson_result<dom::array> simdjson_result<dom::element>::get_array() const noexcept {
49  if (error()) { return error(); }
50  return first.get_array();
51 }
52 simdjson_inline simdjson_result<dom::object> simdjson_result<dom::element>::get_object() const noexcept {
53  if (error()) { return error(); }
54  return first.get_object();
55 }
56 simdjson_inline simdjson_result<const char *> simdjson_result<dom::element>::get_c_str() const noexcept {
57  if (error()) { return error(); }
58  return first.get_c_str();
59 }
60 simdjson_inline simdjson_result<size_t> simdjson_result<dom::element>::get_string_length() const noexcept {
61  if (error()) { return error(); }
62  return first.get_string_length();
63 }
64 simdjson_inline simdjson_result<std::string_view> simdjson_result<dom::element>::get_string() const noexcept {
65  if (error()) { return error(); }
66  return first.get_string();
67 }
68 simdjson_inline simdjson_result<int64_t> simdjson_result<dom::element>::get_int64() const noexcept {
69  if (error()) { return error(); }
70  return first.get_int64();
71 }
72 simdjson_inline simdjson_result<uint64_t> simdjson_result<dom::element>::get_uint64() const noexcept {
73  if (error()) { return error(); }
74  return first.get_uint64();
75 }
76 simdjson_inline simdjson_result<double> simdjson_result<dom::element>::get_double() const noexcept {
77  if (error()) { return error(); }
78  return first.get_double();
79 }
80 simdjson_inline simdjson_result<bool> simdjson_result<dom::element>::get_bool() const noexcept {
81  if (error()) { return error(); }
82  return first.get_bool();
83 }
84 
85 simdjson_inline bool simdjson_result<dom::element>::is_array() const noexcept {
86  return !error() && first.is_array();
87 }
88 simdjson_inline bool simdjson_result<dom::element>::is_object() const noexcept {
89  return !error() && first.is_object();
90 }
91 simdjson_inline bool simdjson_result<dom::element>::is_string() const noexcept {
92  return !error() && first.is_string();
93 }
94 simdjson_inline bool simdjson_result<dom::element>::is_int64() const noexcept {
95  return !error() && first.is_int64();
96 }
97 simdjson_inline bool simdjson_result<dom::element>::is_uint64() const noexcept {
98  return !error() && first.is_uint64();
99 }
100 simdjson_inline bool simdjson_result<dom::element>::is_double() const noexcept {
101  return !error() && first.is_double();
102 }
103 simdjson_inline bool simdjson_result<dom::element>::is_number() const noexcept {
104  return !error() && first.is_number();
105 }
106 simdjson_inline bool simdjson_result<dom::element>::is_bool() const noexcept {
107  return !error() && first.is_bool();
108 }
109 
110 simdjson_inline bool simdjson_result<dom::element>::is_null() const noexcept {
111  return !error() && first.is_null();
112 }
113 
114 simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::operator[](std::string_view key) const noexcept {
115  if (error()) { return error(); }
116  return first[key];
117 }
118 simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::operator[](const char *key) const noexcept {
119  if (error()) { return error(); }
120  return first[key];
121 }
122 simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_pointer(const std::string_view json_pointer) const noexcept {
123  if (error()) { return error(); }
124  return first.at_pointer(json_pointer);
125 }
126 simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_path(const std::string_view json_path) const noexcept {
127  auto json_pointer = json_path_to_pointer_conversion(json_path);
128  if (json_pointer == "-1") { return INVALID_JSON_POINTER; }
129  return at_pointer(json_pointer);
130 }
131 #ifndef SIMDJSON_DISABLE_DEPRECATED_API
132 [[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
133 simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at(const std::string_view json_pointer) const noexcept {
134 SIMDJSON_PUSH_DISABLE_WARNINGS
135 SIMDJSON_DISABLE_DEPRECATED_WARNING
136  if (error()) { return error(); }
137  return first.at(json_pointer);
138 SIMDJSON_POP_DISABLE_WARNINGS
139 }
140 #endif // SIMDJSON_DISABLE_DEPRECATED_API
141 simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at(size_t index) const noexcept {
142  if (error()) { return error(); }
143  return first.at(index);
144 }
145 simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_key(std::string_view key) const noexcept {
146  if (error()) { return error(); }
147  return first.at_key(key);
148 }
149 simdjson_inline simdjson_result<dom::element> simdjson_result<dom::element>::at_key_case_insensitive(std::string_view key) const noexcept {
150  if (error()) { return error(); }
151  return first.at_key_case_insensitive(key);
152 }
153 
154 #if SIMDJSON_EXCEPTIONS
155 
156 simdjson_inline simdjson_result<dom::element>::operator bool() const noexcept(false) {
157  return get<bool>();
158 }
159 simdjson_inline simdjson_result<dom::element>::operator const char *() const noexcept(false) {
160  return get<const char *>();
161 }
162 simdjson_inline simdjson_result<dom::element>::operator std::string_view() const noexcept(false) {
163  return get<std::string_view>();
164 }
165 simdjson_inline simdjson_result<dom::element>::operator uint64_t() const noexcept(false) {
166  return get<uint64_t>();
167 }
168 simdjson_inline simdjson_result<dom::element>::operator int64_t() const noexcept(false) {
169  return get<int64_t>();
170 }
171 simdjson_inline simdjson_result<dom::element>::operator double() const noexcept(false) {
172  return get<double>();
173 }
174 simdjson_inline simdjson_result<dom::element>::operator dom::array() const noexcept(false) {
175  return get<dom::array>();
176 }
177 simdjson_inline simdjson_result<dom::element>::operator dom::object() const noexcept(false) {
178  return get<dom::object>();
179 }
180 
181 simdjson_inline dom::array::iterator simdjson_result<dom::element>::begin() const noexcept(false) {
182  if (error()) { throw simdjson_error(error()); }
183  return first.begin();
184 }
185 simdjson_inline dom::array::iterator simdjson_result<dom::element>::end() const noexcept(false) {
186  if (error()) { throw simdjson_error(error()); }
187  return first.end();
188 }
189 
190 #endif // SIMDJSON_EXCEPTIONS
191 
192 namespace dom {
193 
194 //
195 // element inline implementation
196 //
197 simdjson_inline element::element() noexcept : tape{} {}
198 simdjson_inline element::element(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
199 
200 inline element_type element::type() const noexcept {
201  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
202  auto tape_type = tape.tape_ref_type();
203  return tape_type == internal::tape_type::FALSE_VALUE ? element_type::BOOL : static_cast<element_type>(tape_type);
204 }
205 
206 inline simdjson_result<bool> element::get_bool() const noexcept {
207  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
208  if(tape.is_true()) {
209  return true;
210  } else if(tape.is_false()) {
211  return false;
212  }
213  return INCORRECT_TYPE;
214 }
216  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
217  switch (tape.tape_ref_type()) {
218  case internal::tape_type::STRING: {
219  return tape.get_c_str();
220  }
221  default:
222  return INCORRECT_TYPE;
223  }
224 }
226  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
227  switch (tape.tape_ref_type()) {
228  case internal::tape_type::STRING: {
229  return tape.get_string_length();
230  }
231  default:
232  return INCORRECT_TYPE;
233  }
234 }
236  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
237  switch (tape.tape_ref_type()) {
238  case internal::tape_type::STRING:
239  return tape.get_string_view();
240  default:
241  return INCORRECT_TYPE;
242  }
243 }
245  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
246  if(simdjson_unlikely(!tape.is_uint64())) { // branch rarely taken
247  if(tape.is_int64()) {
248  int64_t result = tape.next_tape_value<int64_t>();
249  if (result < 0) {
250  return NUMBER_OUT_OF_RANGE;
251  }
252  return uint64_t(result);
253  }
254  return INCORRECT_TYPE;
255  }
256  return tape.next_tape_value<int64_t>();
257 }
259  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
260  if(simdjson_unlikely(!tape.is_int64())) { // branch rarely taken
261  if(tape.is_uint64()) {
262  uint64_t result = tape.next_tape_value<uint64_t>();
263  // Wrapping max in parens to handle Windows issue: https://stackoverflow.com/questions/11544073/how-do-i-deal-with-the-max-macro-in-windows-h-colliding-with-max-in-std
264  if (result > uint64_t((std::numeric_limits<int64_t>::max)())) {
265  return NUMBER_OUT_OF_RANGE;
266  }
267  return static_cast<int64_t>(result);
268  }
269  return INCORRECT_TYPE;
270  }
271  return tape.next_tape_value<int64_t>();
272 }
274  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
275  // Performance considerations:
276  // 1. Querying tape_ref_type() implies doing a shift, it is fast to just do a straight
277  // comparison.
278  // 2. Using a switch-case relies on the compiler guessing what kind of code generation
279  // we want... But the compiler cannot know that we expect the type to be "double"
280  // most of the time.
281  // We can expect get<double> to refer to a double type almost all the time.
282  // It is important to craft the code accordingly so that the compiler can use this
283  // information. (This could also be solved with profile-guided optimization.)
284  if(simdjson_unlikely(!tape.is_double())) { // branch rarely taken
285  if(tape.is_uint64()) {
286  return double(tape.next_tape_value<uint64_t>());
287  } else if(tape.is_int64()) {
288  return double(tape.next_tape_value<int64_t>());
289  }
290  return INCORRECT_TYPE;
291  }
292  // this is common:
293  return tape.next_tape_value<double>();
294 }
296  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
297  switch (tape.tape_ref_type()) {
298  case internal::tape_type::START_ARRAY:
299  return array(tape);
300  default:
301  return INCORRECT_TYPE;
302  }
303 }
305  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
306  switch (tape.tape_ref_type()) {
307  case internal::tape_type::START_OBJECT:
308  return object(tape);
309  default:
310  return INCORRECT_TYPE;
311  }
312 }
313 
314 template<typename T>
315 simdjson_warn_unused simdjson_inline error_code element::get(T &value) const noexcept {
316  return get<T>().get(value);
317 }
318 // An element-specific version prevents recursion with simdjson_result::get<element>(value)
319 template<>
320 simdjson_warn_unused simdjson_inline error_code element::get<element>(element &value) const noexcept {
321  value = element(tape);
322  return SUCCESS;
323 }
324 template<typename T>
325 inline void element::tie(T &value, error_code &error) && noexcept {
326  error = get<T>(value);
327 }
328 
329 template<typename T>
330 simdjson_inline bool element::is() const noexcept {
331  auto result = get<T>();
332  return !result.error();
333 }
334 
335 template<> inline simdjson_result<array> element::get<array>() const noexcept { return get_array(); }
336 template<> inline simdjson_result<object> element::get<object>() const noexcept { return get_object(); }
337 template<> inline simdjson_result<const char *> element::get<const char *>() const noexcept { return get_c_str(); }
338 template<> inline simdjson_result<std::string_view> element::get<std::string_view>() const noexcept { return get_string(); }
339 template<> inline simdjson_result<int64_t> element::get<int64_t>() const noexcept { return get_int64(); }
340 template<> inline simdjson_result<uint64_t> element::get<uint64_t>() const noexcept { return get_uint64(); }
341 template<> inline simdjson_result<double> element::get<double>() const noexcept { return get_double(); }
342 template<> inline simdjson_result<bool> element::get<bool>() const noexcept { return get_bool(); }
343 
344 inline bool element::is_array() const noexcept { return is<array>(); }
345 inline bool element::is_object() const noexcept { return is<object>(); }
346 inline bool element::is_string() const noexcept { return is<std::string_view>(); }
347 inline bool element::is_int64() const noexcept { return is<int64_t>(); }
348 inline bool element::is_uint64() const noexcept { return is<uint64_t>(); }
349 inline bool element::is_double() const noexcept { return is<double>(); }
350 inline bool element::is_bool() const noexcept { return is<bool>(); }
351 inline bool element::is_number() const noexcept { return is_int64() || is_uint64() || is_double(); }
352 
353 inline bool element::is_null() const noexcept {
354  return tape.is_null_on_tape();
355 }
356 
357 #if SIMDJSON_EXCEPTIONS
358 
359 inline element::operator bool() const noexcept(false) { return get<bool>(); }
360 inline element::operator const char*() const noexcept(false) { return get<const char *>(); }
361 inline element::operator std::string_view() const noexcept(false) { return get<std::string_view>(); }
362 inline element::operator uint64_t() const noexcept(false) { return get<uint64_t>(); }
363 inline element::operator int64_t() const noexcept(false) { return get<int64_t>(); }
364 inline element::operator double() const noexcept(false) { return get<double>(); }
365 inline element::operator array() const noexcept(false) { return get<array>(); }
366 inline element::operator object() const noexcept(false) { return get<object>(); }
367 
368 inline array::iterator element::begin() const noexcept(false) {
369  return get<array>().begin();
370 }
371 inline array::iterator element::end() const noexcept(false) {
372  return get<array>().end();
373 }
374 
375 #endif // SIMDJSON_EXCEPTIONS
376 
377 inline simdjson_result<element> element::operator[](std::string_view key) const noexcept {
378  return at_key(key);
379 }
380 inline simdjson_result<element> element::operator[](const char *key) const noexcept {
381  return at_key(key);
382 }
383 
384 inline bool is_pointer_well_formed(std::string_view json_pointer) noexcept {
385  if (simdjson_unlikely(json_pointer[0] != '/')) {
386  return false;
387  }
388  size_t escape = json_pointer.find('~');
389  if (escape == std::string_view::npos) {
390  return true;
391  }
392  if (escape == json_pointer.size() - 1) {
393  return false;
394  }
395  if (json_pointer[escape + 1] != '0' && json_pointer[escape + 1] != '1') {
396  return false;
397  }
398  return true;
399 }
400 
401 inline simdjson_result<element> element::at_pointer(std::string_view json_pointer) const noexcept {
402  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
403  switch (tape.tape_ref_type()) {
404  case internal::tape_type::START_OBJECT:
405  return object(tape).at_pointer(json_pointer);
406  case internal::tape_type::START_ARRAY:
407  return array(tape).at_pointer(json_pointer);
408  default: {
409  if (!json_pointer.empty()) { // a non-empty string can be invalid, or accessing a primitive (issue 2154)
410  if (is_pointer_well_formed(json_pointer)) {
411  return NO_SUCH_FIELD;
412  }
413  return INVALID_JSON_POINTER;
414  }
415  // an empty string means that we return the current node
416  dom::element copy(*this);
417  return simdjson_result<element>(std::move(copy));
418  }
419  }
420 }
421 inline simdjson_result<element> element::at_path(std::string_view json_path) const noexcept {
422  auto json_pointer = json_path_to_pointer_conversion(json_path);
423  if (json_pointer == "-1") { return INVALID_JSON_POINTER; }
424  return at_pointer(json_pointer);
425 }
426 #ifndef SIMDJSON_DISABLE_DEPRECATED_API
427 [[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
428 inline simdjson_result<element> element::at(std::string_view json_pointer) const noexcept {
429  // version 0.4 of simdjson allowed non-compliant pointers
430  auto std_pointer = (json_pointer.empty() ? "" : "/") + std::string(json_pointer.begin(), json_pointer.end());
431  return at_pointer(std_pointer);
432 }
433 #endif // SIMDJSON_DISABLE_DEPRECATED_API
434 
435 inline simdjson_result<element> element::at(size_t index) const noexcept {
436  return get<array>().at(index);
437 }
438 inline simdjson_result<element> element::at_key(std::string_view key) const noexcept {
439  return get<object>().at_key(key);
440 }
441 inline simdjson_result<element> element::at_key_case_insensitive(std::string_view key) const noexcept {
442  return get<object>().at_key_case_insensitive(key);
443 }
444 inline bool element::operator<(const element &other) const noexcept {
445  return tape.json_index < other.tape.json_index;
446 }
447 inline bool element::operator==(const element &other) const noexcept {
448  return tape.json_index == other.tape.json_index;
449 }
450 
451 inline bool element::dump_raw_tape(std::ostream &out) const noexcept {
452  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
453  return tape.doc->dump_raw_tape(out);
454 }
455 
456 
457 inline std::ostream& operator<<(std::ostream& out, element_type type) {
458  switch (type) {
459  case element_type::ARRAY:
460  return out << "array";
462  return out << "object";
463  case element_type::INT64:
464  return out << "int64_t";
466  return out << "uint64_t";
468  return out << "double";
470  return out << "string";
471  case element_type::BOOL:
472  return out << "bool";
474  return out << "null";
475  default:
476  return out << "unexpected content!!!"; // abort() usage is forbidden in the library
477  }
478 }
479 
480 } // namespace dom
481 
482 } // namespace simdjson
483 
484 #endif // SIMDJSON_ELEMENT_INL_H
JSON array.
Definition: array.h:13
simdjson_result< element > at_pointer(std::string_view json_pointer) const noexcept
Get the value associated with the given JSON pointer.
Definition: array-inl.h:83
A JSON element.
Definition: element.h:31
bool is_object() const noexcept
Whether this element is a json object.
Definition: element-inl.h:345
bool is_double() const noexcept
Whether this element is a json number that fits in a double.
Definition: element-inl.h:349
simdjson_inline element_type type() const noexcept
The type of this element.
Definition: element-inl.h:200
bool is_number() const noexcept
Whether this element is a json number.
Definition: element-inl.h:351
simdjson_result< const char * > get_c_str() const noexcept
Cast this element to a null-terminated C string.
Definition: element-inl.h:215
bool operator<(const element &other) const noexcept
operator< defines a total order for element allowing to use them in ordered C++ STL containers
Definition: element-inl.h:444
simdjson_result< element > at_pointer(const std::string_view json_pointer) const noexcept
Get the value associated with the given JSON pointer.
Definition: element-inl.h:401
simdjson_result< double > get_double() const noexcept
Cast this element to a double floating-point.
Definition: element-inl.h:273
simdjson_result< T > get() const noexcept
Get the value as the provided type (T).
Definition: element.h:211
simdjson_inline bool is() const noexcept
Tell whether the value can be cast to provided type (T).
Definition: element-inl.h:330
simdjson_result< element > at_key_case_insensitive(std::string_view key) const noexcept
Get the value associated with the given key in a case-insensitive manner.
Definition: element-inl.h:441
void tie(T &value, error_code &error) &&noexcept
Get the value as the provided type (T), setting error if it's not the given type.
simdjson_result< bool > get_bool() const noexcept
Cast this element to a bool.
Definition: element-inl.h:206
bool is_string() const noexcept
Whether this element is a json string.
Definition: element-inl.h:346
simdjson_result< element > at_key(std::string_view key) const noexcept
Get the value associated with the given key.
Definition: element-inl.h:438
dom::array::iterator end() const noexcept(false)
Iterate over each element in this array.
Definition: element-inl.h:371
simdjson_result< array > get_array() const noexcept
Cast this element to an array.
Definition: element-inl.h:295
simdjson_result< size_t > get_string_length() const noexcept
Gives the length in bytes of the string.
Definition: element-inl.h:225
simdjson_inline element() noexcept
Create a new, invalid element.
Definition: element-inl.h:197
simdjson_result< uint64_t > get_uint64() const noexcept
Cast this element to an unsigned integer.
Definition: element-inl.h:244
dom::array::iterator begin() const noexcept(false)
Iterate over each element in this array.
Definition: element-inl.h:368
simdjson_result< element > at(const std::string_view json_pointer) const noexcept
Version 0.4 of simdjson used an incorrect interpretation of the JSON Pointer standard and allowed the...
Definition: element-inl.h:428
simdjson_result< int64_t > get_int64() const noexcept
Cast this element to a signed integer.
Definition: element-inl.h:258
simdjson_result< object > get_object() const noexcept
Cast this element to an object.
Definition: element-inl.h:304
bool is_uint64() const noexcept
Whether this element is a json number that fits in an unsigned 64-bit integer.
Definition: element-inl.h:348
simdjson_result< element > operator[](std::string_view key) const noexcept
Get the value associated with the given key.
Definition: element-inl.h:377
bool is_int64() const noexcept
Whether this element is a json number that fits in a signed 64-bit integer.
Definition: element-inl.h:347
bool is_null() const noexcept
Whether this element is a json null.
Definition: element-inl.h:353
simdjson_result< element > at_path(std::string_view json_path) const noexcept
Get the value associated with the given JSONPath expression.
Definition: element-inl.h:421
simdjson_result< std::string_view > get_string() const noexcept
Cast this element to a string.
Definition: element-inl.h:235
bool is_array() const noexcept
Whether this element is a json array.
Definition: element-inl.h:344
bool operator==(const element &other) const noexcept
operator== allows to verify if two element values reference the same JSON item
Definition: element-inl.h:447
bool is_bool() const noexcept
Whether this element is a json true or false.
Definition: element-inl.h:350
JSON object.
Definition: object.h:14
simdjson_result< element > at_pointer(std::string_view json_pointer) const noexcept
Get the value associated with the given JSON pointer.
Definition: object-inl.h:95
element_type
The actual concrete type of a JSON element This is the type it is most easily cast to with get<>.
Definition: element.h:14
@ STRING
std::string_view
@ UINT64
uint64_t: any integer that fits in uint64_t but not int64_t
@ DOUBLE
double: Any number with a "." or "e" that fits in double.
The top level simdjson namespace, containing everything the library provides.
Definition: base.h:8
error_code
All possible errors returned by simdjson.
Definition: error.h:19
@ INCORRECT_TYPE
JSON element has a different type than user expected.
Definition: error.h:37
@ NO_SUCH_FIELD
JSON field not found in object.
Definition: error.h:40
@ NUMBER_OUT_OF_RANGE
JSON number does not fit in 64 bits.
Definition: error.h:38
@ SUCCESS
No error.
Definition: error.h:20
@ INVALID_JSON_POINTER
Invalid JSON pointer syntax.
Definition: error.h:42
std::string json_path_to_pointer_conversion(std::string_view json_path)
Converts JSONPath to JSON Pointer.
Definition: jsonpathutil.h:13
The result of a simdjson operation that could fail.
Definition: error.h:215
simdjson_inline error_code error() const noexcept
The error.
Definition: error-inl.h:131
simdjson_warn_unused simdjson_inline error_code get(T &value) &&noexcept
Move the value to the provided variable.
Definition: error-inl.h:126