simdjson  3.11.0
Ridiculously Fast JSON
value.h
1 #ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H
2 
3 #ifndef SIMDJSON_CONDITIONAL_INCLUDE
4 #define SIMDJSON_GENERIC_ONDEMAND_VALUE_H
5 #include "simdjson/generic/ondemand/base.h"
6 #include "simdjson/generic/implementation_simdjson_result_base.h"
7 #include "simdjson/generic/ondemand/value_iterator.h"
8 #include "simdjson/generic/ondemand/deserialize.h"
9 #endif // SIMDJSON_CONDITIONAL_INCLUDE
10 
11 #include <type_traits>
12 
13 namespace simdjson {
14 
15 namespace SIMDJSON_IMPLEMENTATION {
16 namespace ondemand {
21 class value {
22 public:
28  simdjson_inline value() noexcept = default;
29 
41  template <typename T>
42  simdjson_inline simdjson_result<T> get()
43 #if SIMDJSON_SUPPORTS_DESERIALIZATION
44  noexcept(custom_deserializable<T, value> ? nothrow_custom_deserializable<T, value> : true)
45 #else
46  noexcept
47 #endif
48  {
49  static_assert(std::is_default_constructible<T>::value, "The specified type is not default constructible.");
50  T out{};
51  SIMDJSON_TRY(get<T>(out));
52  return out;
53  }
54 
55 
65  template <typename T>
66  simdjson_inline error_code get(T &out)
67 #if SIMDJSON_SUPPORTS_DESERIALIZATION
68  noexcept(custom_deserializable<T, value> ? nothrow_custom_deserializable<T, value> : true)
69 #else
70  noexcept
71 #endif
72  {
73 #if SIMDJSON_SUPPORTS_DESERIALIZATION
74  if constexpr (custom_deserializable<T, value>) {
75  return deserialize(*this, out);
76  } else {
77 #endif // SIMDJSON_SUPPORTS_DESERIALIZATION
78  // Unless the simdjson library or the user provides an inline implementation, calling this method should
79  // immediately fail.
80  static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
81  "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
82  "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
83  " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template."
84  " You may also add support for custom types, see our documentation.");
85  static_cast<void>(out); // to get rid of unused errors
86  return UNINITIALIZED;
87 #if SIMDJSON_SUPPORTS_DESERIALIZATION
88  }
89 #endif
90  }
91 
98  simdjson_inline simdjson_result<array> get_array() noexcept;
99 
106  simdjson_inline simdjson_result<object> get_object() noexcept;
107 
114  simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
115 
122  simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
123 
130  simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
131 
138  simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
139 
146  simdjson_inline simdjson_result<double> get_double() noexcept;
147 
154  simdjson_inline simdjson_result<double> get_double_in_string() noexcept;
155 
181  simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept;
182 
196  template <typename string_type>
197  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
198 
212  simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept;
221  simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
222 
229  simdjson_inline simdjson_result<bool> get_bool() noexcept;
230 
239  simdjson_inline simdjson_result<bool> is_null() noexcept;
240 
241 #if SIMDJSON_EXCEPTIONS
251  template <class T>
252  explicit simdjson_inline operator T() noexcept(false);
259  simdjson_inline operator array() noexcept(false);
266  simdjson_inline operator object() noexcept(false);
273  simdjson_inline operator uint64_t() noexcept(false);
280  simdjson_inline operator int64_t() noexcept(false);
287  simdjson_inline operator double() noexcept(false);
299  simdjson_inline operator std::string_view() noexcept(false);
308  simdjson_inline operator raw_json_string() noexcept(false);
315  simdjson_inline operator bool() noexcept(false);
316 #endif
317 
325  simdjson_inline simdjson_result<array_iterator> begin() & noexcept;
331  simdjson_inline simdjson_result<array_iterator> end() & noexcept;
346  simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
364  simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
372  simdjson_inline simdjson_result<value> at(size_t index) noexcept;
395  simdjson_inline simdjson_result<value> find_field(std::string_view key) noexcept;
397  simdjson_inline simdjson_result<value> find_field(const char *key) noexcept;
398 
421  simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept;
423  simdjson_inline simdjson_result<value> find_field_unordered(const char *key) noexcept;
425  simdjson_inline simdjson_result<value> operator[](std::string_view key) noexcept;
427  simdjson_inline simdjson_result<value> operator[](const char *key) noexcept;
428  simdjson_result<value> operator[](int) noexcept = delete;
429 
443  simdjson_inline simdjson_result<json_type> type() noexcept;
444 
452  simdjson_inline simdjson_result<bool> is_scalar() noexcept;
459  simdjson_inline simdjson_result<bool> is_string() noexcept;
460 
466  simdjson_inline bool is_negative() noexcept;
480  simdjson_inline simdjson_result<bool> is_integer() noexcept;
505  simdjson_inline simdjson_result<number_type> get_number_type() noexcept;
506 
539  simdjson_warn_unused simdjson_inline simdjson_result<number> get_number() noexcept;
540 
566  simdjson_inline std::string_view raw_json_token() noexcept;
567 
576  simdjson_inline simdjson_result<std::string_view> raw_json() noexcept;
577 
581  simdjson_inline simdjson_result<const char *> current_location() noexcept;
582 
592  simdjson_inline int32_t current_depth() const noexcept;
593 
636  simdjson_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept;
637 
649  simdjson_inline simdjson_result<value> at_path(std::string_view at_path) noexcept;
650 
651 
652 protected:
656  simdjson_inline value(const value_iterator &iter) noexcept;
657 
661  simdjson_inline void skip() noexcept;
662 
668  static simdjson_inline value start(const value_iterator &iter) noexcept;
669 
673  static simdjson_inline value resume(const value_iterator &iter) noexcept;
674 
678  simdjson_inline simdjson_result<object> start_or_resume_object() noexcept;
679 
680  // simdjson_inline void log_value(const char *type) const noexcept;
681  // simdjson_inline void log_error(const char *message) const noexcept;
682 
683  value_iterator iter{};
684 
685  friend class document;
686  friend class array_iterator;
687  friend class field;
688  friend class object;
689  friend struct simdjson_result<value>;
690  friend struct simdjson_result<field>;
691  friend class field;
692 };
693 
694 } // namespace ondemand
695 } // namespace SIMDJSON_IMPLEMENTATION
696 } // namespace simdjson
697 
698 namespace simdjson {
699 
700 template<>
701 struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value> {
702 public:
704  simdjson_inline simdjson_result(error_code error) noexcept;
705  simdjson_inline simdjson_result() noexcept = default;
706 
707  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() noexcept;
708  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() noexcept;
709 
710  simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
711  simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
712  simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
713  simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
714  simdjson_inline simdjson_result<double> get_double() noexcept;
715  simdjson_inline simdjson_result<double> get_double_in_string() noexcept;
716  simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept;
717  template <typename string_type>
718  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
719  simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept;
720  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
721  simdjson_inline simdjson_result<bool> get_bool() noexcept;
722  simdjson_inline simdjson_result<bool> is_null() noexcept;
723 
724  template<typename T> simdjson_inline simdjson_result<T> get() noexcept;
725 
726  template<typename T> simdjson_inline error_code get(T &out) noexcept;
727 
728 #if SIMDJSON_EXCEPTIONS
729  template <class T>
730  explicit simdjson_inline operator T() noexcept(false);
731  simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() noexcept(false);
732  simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() noexcept(false);
733  simdjson_inline operator uint64_t() noexcept(false);
734  simdjson_inline operator int64_t() noexcept(false);
735  simdjson_inline operator double() noexcept(false);
736  simdjson_inline operator std::string_view() noexcept(false);
737  simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
738  simdjson_inline operator bool() noexcept(false);
739 #endif
740  simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
741  simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
742  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) noexcept;
745 
766  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) noexcept;
768  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(const char *key) noexcept;
769 
789  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept;
791  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(const char *key) noexcept;
793  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) noexcept;
795  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](const char *key) noexcept;
796  simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](int) noexcept = delete;
797 
806  simdjson_inline simdjson_result<bool> is_scalar() noexcept;
807  simdjson_inline simdjson_result<bool> is_string() noexcept;
808  simdjson_inline simdjson_result<bool> is_negative() noexcept;
809  simdjson_inline simdjson_result<bool> is_integer() noexcept;
810  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::number_type> get_number_type() noexcept;
811  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> get_number() noexcept;
812 
814  simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept;
815  simdjson_inline simdjson_result<std::string_view> raw_json() noexcept;
816 
818  simdjson_inline simdjson_result<const char *> current_location() noexcept;
820  simdjson_inline simdjson_result<int32_t> current_depth() const noexcept;
821  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
822  simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_path(std::string_view json_path) noexcept;
823 };
824 
825 } // namespace simdjson
826 
827 #endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H
A JSON field (key/value pair) in an object.
Definition: field.h:22
A forward-only JSON object field iterator.
Definition: object.h:17
A string escaped per JSON rules, terminated with quote (").
An ephemeral JSON value returned during iteration.
Definition: value.h:21
static simdjson_inline value start(const value_iterator &iter) noexcept
Start a value at the current position.
Definition: value-inl.h:23
simdjson_inline simdjson_result< bool > is_null() noexcept
Checks if this JSON value is null.
Definition: value-inl.h:78
simdjson_inline simdjson_result< const char * > current_location() noexcept
Returns the current location in the document if in bounds.
Definition: value-inl.h:240
simdjson_inline simdjson_result< value > find_field(std::string_view key) noexcept
Look up a field by name on an object (order-sensitive).
Definition: value-inl.h:162
simdjson_inline bool is_negative() noexcept
Checks whether the value is a negative number.
Definition: value-inl.h:202
simdjson_inline simdjson_result< number_type > get_number_type() noexcept
Determine the number type (integer or floating-point number) as quickly as possible.
Definition: value-inl.h:209
simdjson_inline simdjson_result< array > get_array() noexcept
Cast this JSON value to an array.
Definition: value-inl.h:30
simdjson_inline std::string_view raw_json_token() noexcept
Get the raw JSON for this token.
Definition: value-inl.h:216
simdjson_inline simdjson_result< object > get_object() noexcept
Cast this JSON value to an object.
Definition: value-inl.h:33
simdjson_inline error_code get(T &out) noexcept
Get this value as the given type.
Definition: value.h:66
simdjson_inline simdjson_result< size_t > count_elements() &noexcept
This method scans the array and counts the number of elements.
Definition: value-inl.h:140
simdjson_inline simdjson_result< int64_t > get_int64_in_string() noexcept
Cast this JSON value (inside string) to a signed integer.
Definition: value-inl.h:72
simdjson_inline simdjson_result< size_t > count_fields() &noexcept
This method scans the object and counts the number of key-value pairs.
Definition: value-inl.h:150
simdjson_inline simdjson_result< bool > is_integer() noexcept
Checks whether the value is an integer number.
Definition: value-inl.h:206
simdjson_inline simdjson_result< array_iterator > end() &noexcept
Sentinel representing the end of the array.
Definition: value-inl.h:137
simdjson_inline simdjson_result< value > at_path(std::string_view at_path) noexcept
Get the value associated with the given JSONPath expression.
Definition: value-inl.h:286
simdjson_inline simdjson_result< object > start_or_resume_object() noexcept
Get the object, starting or resuming it as necessary.
Definition: value-inl.h:36
simdjson_inline simdjson_result< array_iterator > begin() &noexcept
Begin array iteration.
Definition: value-inl.h:134
simdjson_inline simdjson_result< uint64_t > get_uint64_in_string() noexcept
Cast this JSON value (inside string) to a unsigned integer.
Definition: value-inl.h:66
simdjson_inline int32_t current_depth() const noexcept
Returns the current depth in the document if in bounds.
Definition: value-inl.h:244
simdjson_inline simdjson_result< bool > is_scalar() noexcept
Checks whether the value is a scalar (string, number, null, Boolean).
Definition: value-inl.h:187
simdjson_inline simdjson_result< T > get() noexcept
Get this value as the given type.
Definition: value.h:42
simdjson_inline simdjson_result< std::string_view > raw_json() noexcept
Get a string_view pointing at this value in the JSON document.
Definition: value-inl.h:220
static simdjson_inline value resume(const value_iterator &iter) noexcept
Resume a value.
Definition: value-inl.h:26
simdjson_inline simdjson_result< double > get_double() noexcept
Cast this JSON value to a double.
Definition: value-inl.h:57
simdjson_inline simdjson_result< std::string_view > get_string(bool allow_replacement=false) noexcept
Cast this JSON value to a string.
Definition: value-inl.h:47
simdjson_inline simdjson_result< bool > get_bool() noexcept
Cast this JSON value to a bool.
Definition: value-inl.h:75
simdjson_warn_unused simdjson_inline simdjson_result< number > get_number() noexcept
Attempt to parse an ondemand::number.
Definition: value-inl.h:212
simdjson_inline simdjson_result< value > at_pointer(std::string_view json_pointer) noexcept
Get the value associated with the given JSON pointer.
Definition: value-inl.h:268
simdjson_inline simdjson_result< std::string_view > get_wobbly_string() noexcept
Cast this JSON value to a "wobbly" string.
Definition: value-inl.h:54
simdjson_inline simdjson_result< int64_t > get_int64() noexcept
Cast this JSON value to a signed integer.
Definition: value-inl.h:69
simdjson_inline value() noexcept=default
Create a new invalid value.
simdjson_inline simdjson_result< json_type > type() noexcept
Get the type of this JSON value.
Definition: value-inl.h:183
simdjson_inline simdjson_result< double > get_double_in_string() noexcept
Cast this JSON value (inside string) to a double.
Definition: value-inl.h:60
simdjson_inline simdjson_result< raw_json_string > get_raw_json_string() noexcept
Cast this JSON value to a raw_json_string.
Definition: value-inl.h:44
simdjson_inline simdjson_result< value > find_field_unordered(std::string_view key) noexcept
Look up a field by name on an object, without regard to key order.
Definition: value-inl.h:169
simdjson_inline simdjson_result< value > at(size_t index) noexcept
Get the value at the given index in the array.
Definition: value-inl.h:157
simdjson_inline simdjson_result< uint64_t > get_uint64() noexcept
Cast this JSON value to an unsigned integer.
Definition: value-inl.h:63
simdjson_inline void skip() noexcept
Skip this value, allowing iteration to continue.
simdjson_inline simdjson_result< bool > is_string() noexcept
Checks whether the value is a string.
Definition: value-inl.h:194
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
@ UNINITIALIZED
unknown error, or uninitialized document
Definition: error.h:32
A type representing a JSON number.
Definition: json_type.h:32
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
simdjson_inline T & value() &noexcept(false)
Get the result value.