simdjson 4.2.3
Ridiculously Fast JSON
Loading...
Searching...
No Matches
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#include <vector>
10#endif // SIMDJSON_CONDITIONAL_INCLUDE
11
12#include <type_traits>
13
14namespace simdjson {
15
16namespace SIMDJSON_IMPLEMENTATION {
17namespace ondemand {
22class value {
23public:
29 simdjson_inline value() noexcept = default;
30
43 template <typename T>
44 simdjson_inline simdjson_result<T> get()
45#if SIMDJSON_SUPPORTS_CONCEPTS
46 noexcept(custom_deserializable<T, value> ? nothrow_custom_deserializable<T, value> : true)
47#else
48 noexcept
49#endif
50 {
51 static_assert(std::is_default_constructible<T>::value, "The specified type is not default constructible.");
52 T out{};
53 SIMDJSON_TRY(get<T>(out));
54 return out;
55 }
56
57
68 template <typename T>
69 simdjson_warn_unused simdjson_inline error_code get(T &out)
70#if SIMDJSON_SUPPORTS_CONCEPTS
71 noexcept(custom_deserializable<T, value> ? nothrow_custom_deserializable<T, value> : true)
72#else
73 noexcept
74#endif
75 {
76 #if SIMDJSON_SUPPORTS_CONCEPTS
77 if constexpr (custom_deserializable<T, value>) {
78 return deserialize(*this, out);
79 } else if constexpr (concepts::optional_type<T>) {
80 using value_type = typename std::remove_cvref_t<T>::value_type;
81
82 // Check if the value is null
83 bool is_null_value;
84 SIMDJSON_TRY( is_null().get(is_null_value) );
85 if (is_null_value) {
86 out.reset(); // Set to nullopt
87 return SUCCESS;
88 }
89
90 if (!out) {
91 out.emplace();
92 }
93 return get<value_type>(out.value());
94 } else {
95 static_assert(!sizeof(T), "The get<T> method with type T is not implemented by the simdjson library. "
96 "And you do not seem to have added support for it. Indeed, we have that "
97 "simdjson::custom_deserializable<T> is false and the type T is not a default type "
98 "such as ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
99 "int64_t, double, or bool.");
100 static_cast<void>(out); // to get rid of unused errors
101 return UNINITIALIZED;
102 }
103#else // SIMDJSON_SUPPORTS_CONCEPTS
104 // Unless the simdjson library or the user provides an inline implementation, calling this method should
105 // immediately fail.
106 static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
107 "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
108 "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
109 " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template."
110 " You may also add support for custom types, see our documentation.");
111 static_cast<void>(out); // to get rid of unused errors
112 return UNINITIALIZED;
113#endif
114 }
115
122 simdjson_inline simdjson_result<array> get_array() noexcept;
123
130 simdjson_inline simdjson_result<object> get_object() noexcept;
131
138 simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
139
146 simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
147
154 simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
155
162 simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
163
170 simdjson_inline simdjson_result<double> get_double() noexcept;
171
178 simdjson_inline simdjson_result<double> get_double_in_string() noexcept;
179
205 simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept;
206
220 template <typename string_type>
221 simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
222
236 simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept;
245 simdjson_inline simdjson_result<raw_json_string> get_raw_json_string() noexcept;
246
253 simdjson_inline simdjson_result<bool> get_bool() noexcept;
254
263 simdjson_inline simdjson_result<bool> is_null() noexcept;
264
265#if SIMDJSON_EXCEPTIONS
275 template <class T>
276 explicit simdjson_inline operator T() noexcept(false);
283 simdjson_inline operator array() noexcept(false);
290 simdjson_inline operator object() noexcept(false);
297 simdjson_inline operator uint64_t() noexcept(false);
304 simdjson_inline operator int64_t() noexcept(false);
311 simdjson_inline operator double() noexcept(false);
323 simdjson_inline operator std::string_view() noexcept(false);
332 simdjson_inline operator raw_json_string() noexcept(false);
339 simdjson_inline operator bool() noexcept(false);
340#endif
341
349 simdjson_inline simdjson_result<array_iterator> begin() & noexcept;
355 simdjson_inline simdjson_result<array_iterator> end() & noexcept;
370 simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
388 simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
396 simdjson_inline simdjson_result<value> at(size_t index) noexcept;
419 simdjson_inline simdjson_result<value> find_field(std::string_view key) noexcept;
421 simdjson_inline simdjson_result<value> find_field(const char *key) noexcept;
422
445 simdjson_inline simdjson_result<value> find_field_unordered(std::string_view key) noexcept;
447 simdjson_inline simdjson_result<value> find_field_unordered(const char *key) noexcept;
449 simdjson_inline simdjson_result<value> operator[](std::string_view key) noexcept;
451 simdjson_inline simdjson_result<value> operator[](const char *key) noexcept;
452 simdjson_result<value> operator[](int) noexcept = delete;
453
467 simdjson_inline simdjson_result<json_type> type() noexcept;
468
476 simdjson_inline simdjson_result<bool> is_scalar() noexcept;
483 simdjson_inline simdjson_result<bool> is_string() noexcept;
484
490 simdjson_inline bool is_negative() noexcept;
504 simdjson_inline simdjson_result<bool> is_integer() noexcept;
529 simdjson_inline simdjson_result<number_type> get_number_type() noexcept;
530
563 simdjson_warn_unused simdjson_inline simdjson_result<number> get_number() noexcept;
564
590 simdjson_inline std::string_view raw_json_token() noexcept;
591
600 simdjson_inline simdjson_result<std::string_view> raw_json() noexcept;
601
605 simdjson_inline simdjson_result<const char *> current_location() noexcept;
606
616 simdjson_inline int32_t current_depth() const noexcept;
617
660 simdjson_inline simdjson_result<value> at_pointer(std::string_view json_pointer) noexcept;
661
673 simdjson_inline simdjson_result<value> at_path(std::string_view at_path) noexcept;
674
682 simdjson_inline simdjson_result<std::vector<value>> at_path_with_wildcard(std::string_view json_path) noexcept;
683
684protected:
688 simdjson_inline value(const value_iterator &iter) noexcept;
689
693 simdjson_inline void skip() noexcept;
694
700 static simdjson_inline value start(const value_iterator &iter) noexcept;
701
705 static simdjson_inline value resume(const value_iterator &iter) noexcept;
706
710 simdjson_inline simdjson_result<object> start_or_resume_object() noexcept;
711
712 // simdjson_inline void log_value(const char *type) const noexcept;
713 // simdjson_inline void log_error(const char *message) const noexcept;
714
715 value_iterator iter{};
716
717 friend class document;
718 friend class array_iterator;
719 friend class field;
720 friend class object;
721 friend struct simdjson_result<value>;
722 friend struct simdjson_result<field>;
723 friend class field;
724};
725
726} // namespace ondemand
727} // namespace SIMDJSON_IMPLEMENTATION
728} // namespace simdjson
729
730namespace simdjson {
731
732template<>
733struct simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> : public SIMDJSON_IMPLEMENTATION::implementation_simdjson_result_base<SIMDJSON_IMPLEMENTATION::ondemand::value> {
734public:
735 simdjson_inline simdjson_result(SIMDJSON_IMPLEMENTATION::ondemand::value &&value) noexcept;
736 simdjson_inline simdjson_result(error_code error) noexcept;
737 simdjson_inline simdjson_result() noexcept = default;
738
739 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::array> get_array() noexcept;
740 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::object> get_object() noexcept;
741
742 simdjson_inline simdjson_result<uint64_t> get_uint64() noexcept;
743 simdjson_inline simdjson_result<uint64_t> get_uint64_in_string() noexcept;
744 simdjson_inline simdjson_result<int64_t> get_int64() noexcept;
745 simdjson_inline simdjson_result<int64_t> get_int64_in_string() noexcept;
746 simdjson_inline simdjson_result<double> get_double() noexcept;
747 simdjson_inline simdjson_result<double> get_double_in_string() noexcept;
748 simdjson_inline simdjson_result<std::string_view> get_string(bool allow_replacement = false) noexcept;
749 template <typename string_type>
750 simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
751 simdjson_inline simdjson_result<std::string_view> get_wobbly_string() noexcept;
752 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string> get_raw_json_string() noexcept;
753 simdjson_inline simdjson_result<bool> get_bool() noexcept;
754 simdjson_inline simdjson_result<bool> is_null() noexcept;
755
756 template<typename T> simdjson_inline simdjson_result<T> get() noexcept;
757
758 template<typename T> simdjson_inline error_code get(T &out) noexcept;
759
760#if SIMDJSON_EXCEPTIONS
761 template <class T>
762 explicit simdjson_inline operator T() noexcept(false);
763 simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::array() noexcept(false);
764 simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::object() noexcept(false);
765 simdjson_inline operator uint64_t() noexcept(false);
766 simdjson_inline operator int64_t() noexcept(false);
767 simdjson_inline operator double() noexcept(false);
768 simdjson_inline operator std::string_view() noexcept(false);
769 simdjson_inline operator SIMDJSON_IMPLEMENTATION::ondemand::raw_json_string() noexcept(false);
770 simdjson_inline operator bool() noexcept(false);
771#endif
772 simdjson_inline simdjson_result<size_t> count_elements() & noexcept;
773 simdjson_inline simdjson_result<size_t> count_fields() & noexcept;
774 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at(size_t index) noexcept;
777
798 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(std::string_view key) noexcept;
800 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field(const char *key) noexcept;
801
821 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(std::string_view key) noexcept;
823 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> find_field_unordered(const char *key) noexcept;
825 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](std::string_view key) noexcept;
827 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](const char *key) noexcept;
828 simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> operator[](int) noexcept = delete;
829
853 simdjson_inline simdjson_result<bool> is_scalar() noexcept;
854 simdjson_inline simdjson_result<bool> is_string() noexcept;
855 simdjson_inline simdjson_result<bool> is_negative() noexcept;
856 simdjson_inline simdjson_result<bool> is_integer() noexcept;
857 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::number_type> get_number_type() noexcept;
858 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::number> get_number() noexcept;
859
861 simdjson_inline simdjson_result<std::string_view> raw_json_token() noexcept;
862 simdjson_inline simdjson_result<std::string_view> raw_json() noexcept;
863
865 simdjson_inline simdjson_result<const char *> current_location() noexcept;
867 simdjson_inline simdjson_result<int32_t> current_depth() const noexcept;
868 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_pointer(std::string_view json_pointer) noexcept;
869 simdjson_inline simdjson_result<SIMDJSON_IMPLEMENTATION::ondemand::value> at_path(std::string_view json_path) noexcept;
870 simdjson_inline simdjson_result<std::vector<SIMDJSON_IMPLEMENTATION::ondemand::value>> at_path_with_wildcard(std::string_view json_path) noexcept;
871};
872
873} // namespace simdjson
874
875#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:21
A string escaped per JSON rules, terminated with quote (").
An ephemeral JSON value returned during iteration.
Definition value.h:22
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 simdjson_result< T > get() noexcept
Get this value as the given type.
Definition value.h:44
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 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.
Definition value-inl.h:299
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 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 operator std::string_view() noexcept(false)
Cast this JSON value to a string.
Definition value-inl.h:123
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_warn_unused simdjson_inline error_code get(T &out) noexcept
Get this value as the given type.
Definition value.h:69
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
@ SUCCESS
No error.
Definition error.h:20
@ UNINITIALIZED
unknown error, or uninitialized document
Definition error.h:32
A type representing a JSON number.
Definition json_type.h:33
The result of a simdjson operation that could fail.
Definition error.h:280
simdjson_inline error_code error() const noexcept
The error.
Definition error-inl.h:168
simdjson_warn_unused simdjson_inline error_code get(T &value) &&noexcept
Move the value to the provided variable.
Definition error-inl.h:163