1#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
3#ifndef SIMDJSON_CONDITIONAL_INCLUDE
4#define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
5#include "simdjson/generic/ondemand/base.h"
6#include "simdjson/generic/ondemand/json_iterator.h"
7#include "simdjson/generic/ondemand/deserialize.h"
8#include "simdjson/generic/ondemand/value.h"
14namespace SIMDJSON_IMPLEMENTATION {
34 simdjson_inline
document &operator=(const
document &other) noexcept = delete;
120 template <typename string_type>
121 simdjson_warn_unused simdjson_inline
error_code get_string(string_type& receiver,
bool allow_replacement = false) noexcept;
185 template <typename T>
187#if SIMDJSON_SUPPORTS_CONCEPTS
188 noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> :
true)
193 static_assert(std::is_default_constructible<T>::value,
"Cannot initialize the specified type.");
195 SIMDJSON_TRY(get<T>(out));
210#if SIMDJSON_SUPPORTS_CONCEPTS
211 noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> :
true)
216 static_assert(!std::is_same<T, array>::value && !std::is_same<T, object>::value,
"You should never hold either an ondemand::array or ondemand::object without a corresponding ondemand::document being alive; that would be Undefined Behaviour.");
233#if SIMDJSON_SUPPORTS_CONCEPTS
234 noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> :
true)
239#if SIMDJSON_SUPPORTS_CONCEPTS
240 if constexpr (custom_deserializable<T, document>) {
241 return deserialize(*
this, out);
243 static_assert(!
sizeof(T),
"The get<T> method with type T is not implemented by the simdjson library. "
244 "And you do not seem to have added support for it. Indeed, we have that "
245 "simdjson::custom_deserializable<T> is false and the type T is not a default type "
246 "such as ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
247 "int64_t, double, or bool.");
248 static_cast<void>(out);
254 static_assert(!
sizeof(T),
"The get method with given type is not implemented by the simdjson library. "
255 "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
256 "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
257 " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template."
258 " You may also add support for custom types, see our documentation.");
259 static_cast<void>(out);
265 template<
typename T> simdjson_deprecated simdjson_inline
error_code get(T &out) &&
noexcept;
267#if SIMDJSON_EXCEPTIONS
278 explicit simdjson_inline
operator T() &
noexcept(
false);
280 explicit simdjson_deprecated simdjson_inline
operator T() &&
noexcept(
false);
288 simdjson_inline
operator array() &
noexcept(
false);
295 simdjson_inline
operator object() &
noexcept(
false);
302 simdjson_inline
operator uint64_t() noexcept(false);
309 simdjson_inline operator int64_t() noexcept(false);
316 simdjson_inline operator
double() noexcept(false);
326 simdjson_inline operator std::
string_view() noexcept(false) simdjson_lifetime_bound;
335 simdjson_inline operator
raw_json_string() noexcept(false) simdjson_lifetime_bound;
342 simdjson_inline operator
bool() noexcept(false);
354 simdjson_inline operator
value() noexcept(false);
625 inline
void rewind() noexcept;
646 inline
bool at_end() const noexcept;
747#if SIMDJSON_STATIC_REFLECTION
772 template<constevalutil::fixed_string... FieldNames,
typename T>
773 requires(std::is_class_v<T> && (
sizeof...(FieldNames) > 0))
774 simdjson_warn_unused simdjson_inline
error_code extract_into(T& out) &
noexcept;
782 simdjson_inline
document(ondemand::json_iterator &&
iter) noexcept;
783 simdjson_inline const uint8_t *text(uint32_t idx) const noexcept;
785 simdjson_inline value_iterator resume_value_iterator() noexcept;
786 simdjson_inline value_iterator get_root_value_iterator() noexcept;
787 simdjson_inline
simdjson_result<
object> start_or_resume_object() noexcept;
788 static simdjson_inline
document start(ondemand::json_iterator &&
iter) noexcept;
798 friend class ondemand::parser;
822 simdjson_inline
void rewind()
noexcept;
832 template <
typename string_type>
833 simdjson_warn_unused simdjson_inline
error_code get_string(string_type& receiver,
bool allow_replacement =
false)
noexcept;
840 template <
typename T>
842#if SIMDJSON_SUPPORTS_CONCEPTS
843 noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> :
true)
848 static_assert(std::is_default_constructible<T>::value,
"Cannot initialize the specified type.");
850 SIMDJSON_TRY(get<T>(out));
855#if SIMDJSON_SUPPORTS_CONCEPTS
856 noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document> :
true)
861 static_assert(!std::is_same<T, array>::value && !std::is_same<T, object>::value,
"You should never hold either an ondemand::array or ondemand::object without a corresponding ondemand::document_reference being alive; that would be Undefined Behaviour.");
878#if SIMDJSON_SUPPORTS_CONCEPTS
879 noexcept(custom_deserializable<T, document> ? nothrow_custom_deserializable<T, document_reference> :
true)
884#if SIMDJSON_SUPPORTS_CONCEPTS
885 if constexpr (custom_deserializable<T, document_reference>) {
886 return deserialize(*
this, out);
888 static_assert(!
sizeof(T),
"The get<T> method with type T is not implemented by the simdjson library. "
889 "And you do not seem to have added support for it. Indeed, we have that "
890 "simdjson::custom_deserializable<T> is false and the type T is not a default type "
891 "such as ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
892 "int64_t, double, or bool.");
893 static_cast<void>(out);
899 static_assert(!
sizeof(T),
"The get method with given type is not implemented by the simdjson library. "
900 "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
901 "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
902 " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template."
903 " You may also add support for custom types, see our documentation.");
904 static_cast<void>(out);
910 template<
typename T> simdjson_inline
error_code get(T &out) &&
noexcept;
912#if SIMDJSON_STATIC_REFLECTION
913 template<constevalutil::fixed_string... FieldNames,
typename T>
914 requires(std::is_class_v<T> && (
sizeof...(FieldNames) > 0))
915 simdjson_warn_unused simdjson_inline
error_code extract_into(T& out) &
noexcept;
917 simdjson_inline
operator document&()
const noexcept;
918#if SIMDJSON_EXCEPTIONS
920 explicit simdjson_inline
operator T() noexcept(false);
921 simdjson_inline operator
array() & noexcept(false);
922 simdjson_inline operator
object() & noexcept(false);
923 simdjson_inline operator uint64_t() noexcept(false);
924 simdjson_inline operator int64_t() noexcept(false);
925 simdjson_inline operator
double() noexcept(false);
926 simdjson_inline operator std::string_view() noexcept(false);
928 simdjson_inline operator
bool() noexcept(false);
929 simdjson_inline operator
value() noexcept(false);
948 simdjson_inline
simdjson_result<const
char *> current_location() noexcept;
949 simdjson_inline int32_t current_depth() const noexcept;
950 simdjson_inline
bool is_negative() noexcept;
952 simdjson_inline
simdjson_result<number_type> get_number_type() noexcept;
954 simdjson_inline
simdjson_result<std::string_view> raw_json_token() noexcept;
957 simdjson_inline
simdjson_result<std::vector<
value>> at_path_with_wildcard(std::string_view json_path) noexcept;
969struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::document> :
public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document> {
971 simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::document &&value)
noexcept;
973 simdjson_inline simdjson_result() noexcept = default;
976 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() & noexcept;
977 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::
object> get_object() & noexcept;
978 simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
979 simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
980 simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
981 simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
982 simdjson_inline simdjson_result<
double> get_double() noexcept;
983 simdjson_inline simdjson_result<
double> get_double_in_string() noexcept;
984 simdjson_inline simdjson_result<std::string_view> get_string(
bool allow_replacement = false) noexcept;
985 template <typename string_type>
986 simdjson_warn_unused simdjson_inline
error_code get_string(string_type& receiver,
bool allow_replacement = false) noexcept;
987 simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept;
988 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
989 simdjson_inline simdjson_result<
bool> get_bool() noexcept;
990 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> get_value() noexcept;
991 simdjson_inline simdjson_result<
bool> is_null() noexcept;
993 template<typename T> simdjson_inline simdjson_result<T>
get() & noexcept;
994 template<typename T> simdjson_deprecated simdjson_inline simdjson_result<T>
get() && noexcept;
996 template<typename T> simdjson_inline
error_code get(T &out) & noexcept;
997 template<typename T> simdjson_inline
error_code get(T &out) && noexcept;
998#if SIMDJSON_EXCEPTIONS
1000 using SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator*;
1001 using SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::document>::operator->;
1002 template <class T, typename std::enable_if<std::is_same<T, SIMDJSON_IMPLEMENTATION::ondemand::document>::value ==
false>::type>
1003 explicit simdjson_inline
operator T() noexcept(false);
1004 simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() & noexcept(false);
1005 simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::
object() & noexcept(false);
1006 simdjson_inline operator uint64_t() noexcept(false);
1007 simdjson_inline operator int64_t() noexcept(false);
1008 simdjson_inline operator
double() noexcept(false);
1009 simdjson_inline operator std::string_view() noexcept(false);
1010 simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
1011 simdjson_inline operator
bool() noexcept(false);
1012 simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::value() noexcept(false);
1014 simdjson_inline simdjson_result<size_t> count_elements() &
noexcept;
1015 simdjson_inline simdjson_result<size_t> count_fields() &
noexcept;
1016 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(
size_t index) &
noexcept;
1017 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> begin() &
noexcept;
1018 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array_iterator> end() &
noexcept;
1019 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) &
noexcept;
1020 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(
const char *key) &
noexcept;
1021 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) &
noexcept;
1022 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](
const char *key) &
noexcept;
1023 simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](
int) &
noexcept =
delete;
1024 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) &
noexcept;
1025 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(
const char *key) &
noexcept;
1026 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::json_type> type() noexcept;
1027 simdjson_inline simdjson_result<
bool> is_scalar() noexcept;
1028 simdjson_inline simdjson_result<
bool> is_string() noexcept;
1029 simdjson_inline simdjson_result<const
char *> current_location() noexcept;
1030 simdjson_inline int32_t current_depth() const noexcept;
1031 simdjson_inline
bool at_end() const noexcept;
1032 simdjson_inline
bool is_negative() noexcept;
1033 simdjson_inline simdjson_result<
bool> is_integer() noexcept;
1034 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::number_type> get_number_type() noexcept;
1035 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> get_number() noexcept;
1037 simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept;
1039 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
1040 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_path(std::string_view json_path) noexcept;
1041 simdjson_inline simdjson_result<std::vector<SIMDJSON_IMPLEMENTATION::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept;
1042#if SIMDJSON_STATIC_REFLECTION
1043 template<constevalutil::fixed_string... FieldNames,
typename T>
1044 requires(std::is_class_v<T> && (
sizeof...(FieldNames) > 0))
1045 simdjson_warn_unused simdjson_inline
error_code extract_into(T& out) &
noexcept;
1061 simdjson_inline
error_code rewind()
noexcept;
1072 template <
typename string_type>
1073 simdjson_warn_unused simdjson_inline
error_code get_string(string_type& receiver,
bool allow_replacement =
false)
noexcept;
1083 template<
typename T> simdjson_inline
error_code get(T &out) &
noexcept;
1084 template<
typename T> simdjson_inline
error_code get(T &out) &&
noexcept;
1085#if SIMDJSON_EXCEPTIONS
1087 explicit simdjson_inline
operator T()
noexcept(
false);
1090 simdjson_inline
operator uint64_t()
noexcept(
false);
1091 simdjson_inline
operator int64_t()
noexcept(
false);
1092 simdjson_inline
operator double()
noexcept(
false);
1093 simdjson_inline
operator std::string_view()
noexcept(
false);
1095 simdjson_inline
operator bool()
noexcept(
false);
1125#if SIMDJSON_STATIC_REFLECTION
1126 template<constevalutil::fixed_string... FieldNames,
typename T>
1127 requires(std::is_class_v<T> && (
sizeof...(FieldNames) > 0))
1128 simdjson_warn_unused simdjson_inline
error_code extract_into(T& out) &
noexcept;
A forward-only JSON array.
A forward-only JSON array.
A document_reference is a thin wrapper around a document reference instance.
simdjson_warn_unused simdjson_inline error_code get(T &out) &noexcept
Get this value as the given type.
simdjson_inline simdjson_result< uint64_t > get_uint64() noexcept
The document_reference instances are used primarily/solely for streams of JSON documents.
A forward-only stream of documents.
simdjson_inline simdjson_result< value > at(size_t index) &noexcept
Get the value at the given index in the array.
simdjson_warn_unused simdjson_inline error_code consume() noexcept
Consumes the document.
static constexpr depth_t DOCUMENT_DEPTH
document depth is always 0
simdjson_inline int32_t current_depth() const noexcept
Returns the current depth in the document if in bounds.
simdjson_inline simdjson_result< array_iterator > begin() &noexcept
Begin array iteration.
simdjson_inline simdjson_result< size_t > count_fields() &noexcept
This method scans the object and counts the number of key-value pairs.
simdjson_inline simdjson_result< std::string_view > get_string(bool allow_replacement=false) noexcept
Cast this JSON value to a string.
simdjson_warn_unused simdjson_inline simdjson_result< number > get_number() noexcept
Attempt to parse an ondemand::number.
simdjson_warn_unused simdjson_inline error_code get(T &out) &noexcept
Get this value as the given type.
bool is_alive() noexcept
Some unrecoverable error conditions may render the document instance unusable.
simdjson_inline simdjson_result< bool > get_bool() noexcept
Cast this JSON value to a bool.
simdjson_inline simdjson_result< object > get_object() &noexcept
Cast this JSON value to an object.
simdjson_inline simdjson_result< bool > is_string() noexcept
Checks whether the document is a string.
simdjson_inline simdjson_result< uint64_t > get_uint64() noexcept
Cast this JSON value to an unsigned integer.
simdjson_inline bool is_negative() noexcept
Checks whether the document is a negative number.
simdjson_inline document() noexcept=default
Create a new invalid document.
simdjson_inline simdjson_result< std::string_view > raw_json_token() noexcept
Get the raw JSON for this token.
simdjson_inline simdjson_result< uint64_t > get_uint64_in_string() noexcept
Cast this JSON value (inside string) to an unsigned integer.
simdjson_inline simdjson_result< bool > is_null() noexcept
Checks if this JSON value is null.
simdjson_inline simdjson_result< int64_t > get_int64() noexcept
Cast this JSON value to a signed integer.
simdjson_inline simdjson_result< value > at_pointer(std::string_view json_pointer) noexcept
Get the value associated with the given JSON pointer.
simdjson_inline simdjson_result< json_type > type() noexcept
Get the type of this JSON value.
simdjson_inline simdjson_result< array_iterator > end() &noexcept
Sentinel representing the end of the array.
simdjson_inline operator std::string_view() noexcept(false) simdjson_lifetime_bound
Cast this JSON value to a string.
simdjson_inline simdjson_result< double > get_double_in_string() noexcept
Cast this JSON value (inside string) to a double.
simdjson_inline simdjson_result< value > at_path(std::string_view json_path) noexcept
Get the value associated with the given JSONPath expression.
json_iterator iter
Current position in the document.
simdjson_inline simdjson_result< std::vector< value > > at_path_with_wildcard(std::string_view json_path) noexcept
Get all values matching the given JSONPath expression with wildcard support.
simdjson_inline simdjson_result< double > get_double() noexcept
Cast this JSON value to a double.
std::string to_debug_string() noexcept
Returns debugging information.
void rewind() noexcept
Reset the iterator inside the document instance so we are pointing back at the beginning of the docum...
simdjson_inline simdjson_result< std::string_view > raw_json() noexcept
Consumes the document and returns a string_view instance corresponding to the document as represented...
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.
simdjson_inline simdjson_result< int64_t > get_int64_in_string() noexcept
Cast this JSON value (inside string) to a signed integer.
simdjson_inline simdjson_result< size_t > count_elements() &noexcept
This method scans the array and counts the number of elements.
simdjson_inline simdjson_result< value > get_value() noexcept
Cast this JSON value to a value when the document is an object or an array.
simdjson_inline simdjson_result< value > find_field(std::string_view key) &noexcept
Look up a field by name on an object (order-sensitive).
simdjson_inline simdjson_result< number_type > get_number_type() noexcept
Determine the number type (integer or floating-point number) as quickly as possible.
simdjson_inline simdjson_result< bool > is_scalar() noexcept
Checks whether the document is a scalar (string, number, null, Boolean).
simdjson_inline simdjson_result< std::string_view > get_wobbly_string() noexcept
Cast this JSON value to a string.
bool at_end() const noexcept
Returns true if this document has been fully parsed.
simdjson_inline simdjson_result< array > get_array() &noexcept
Cast this JSON value to an array.
simdjson_inline simdjson_result< bool > is_integer() noexcept
Checks whether the document is an integer number.
simdjson_result< const char * > current_location() const noexcept
Returns the current location in the document if in bounds.
simdjson_inline simdjson_result< T > get() &noexcept
Get this value as the given type.
simdjson_inline simdjson_result< raw_json_string > get_raw_json_string() noexcept
Cast this JSON value to a raw_json_string.
A JSON field (key/value pair) in an object.
A forward-only JSON object field iterator.
A string escaped per JSON rules, terminated with quote (").
An ephemeral JSON value returned during iteration.
int32_t depth_t
Represents the depth of a JSON value (number of nested arrays/objects).
The top level simdjson namespace, containing everything the library provides.
error_code
All possible errors returned by simdjson.
@ UNINITIALIZED
unknown error, or uninitialized document
The result of a simdjson operation that could fail.
A type representing a JSON number.
The result of a simdjson operation that could fail.
simdjson_inline error_code error() const noexcept
The error.
simdjson_warn_unused simdjson_inline error_code get(T &value) &&noexcept
Move the value to the provided variable.