simdjson 5.0.2
Ridiculously Fast JSON
Loading...
Searching...
No Matches
convert-inl.h
1
2#ifndef SIMDJSON_CONVERT_INL_H
3#define SIMDJSON_CONVERT_INL_H
4
5#include "simdjson/convert.h"
6#if SIMDJSON_SUPPORTS_CONCEPTS
7namespace simdjson {
8namespace convert {
9namespace internal {
10// auto_parser method definitions
11template <typename parser_type>
12inline auto_parser<parser_type>::auto_parser(parser_type &&parser, ondemand::document &&doc) noexcept requires(!std::is_pointer_v<parser_type>)
13 : m_parser{std::move(parser)}, m_doc{std::move(doc)} {}
14
15template <typename parser_type>
16inline auto_parser<parser_type>::auto_parser(parser_type &&parser, padded_string_view const str) noexcept requires(!std::is_pointer_v<parser_type>)
17 : m_parser{std::move(parser)}, m_doc{}, m_error{SUCCESS} {
18 m_error = m_parser.iterate(str).get(m_doc);
19}
20
21template <typename parser_type>
22inline auto_parser<parser_type>::auto_parser(std::remove_pointer_t<parser_type> &parser, ondemand::document &&doc) noexcept requires(std::is_pointer_v<parser_type>)
23 : m_parser{&parser}, m_doc{std::move(doc)} {}
24
25template <typename parser_type>
26inline auto_parser<parser_type>::auto_parser(std::remove_pointer_t<parser_type> &parser, padded_string_view const str) noexcept requires(std::is_pointer_v<parser_type>)
27 : m_parser{&parser}, m_doc{}, m_error{SUCCESS} {
28 m_error = m_parser->iterate(str).get(m_doc);
29}
30
31template <typename parser_type>
32inline auto_parser<parser_type>::auto_parser(padded_string_view const str) noexcept requires(std::is_pointer_v<parser_type>)
33 : auto_parser{ondemand::parser::get_parser(), str} {}
34
35template <typename parser_type>
36inline auto_parser<parser_type>::auto_parser(parser_type parser, ondemand::document &&doc) noexcept requires(std::is_pointer_v<parser_type>)
37 : auto_parser{*parser, std::move(doc)} {}
38
39
40template <typename parser_type>
41inline std::remove_pointer_t<parser_type> &auto_parser<parser_type>::parser() noexcept {
42 if constexpr (std::is_pointer_v<parser_type>) {
43 return *m_parser;
44 } else {
45 return m_parser;
46 }
47}
48
49template <typename parser_type>
50template <typename T>
51inline simdjson_result<T> auto_parser<parser_type>::result() noexcept(is_nothrow_gettable<T>) {
52 if (m_error != SUCCESS) {
53 return m_error;
54 }
55 return m_doc.get<T>();
56}
57
58template <typename parser_type>
59template <typename T>
60simdjson_warn_unused simdjson_inline error_code auto_parser<parser_type>::get(T &value) && noexcept(is_nothrow_gettable<T>) {
61 return result<T>().get(value);
62}
63
64template <typename parser_type>
65inline simdjson_result<ondemand::array> auto_parser<parser_type>::array() noexcept {
66 return result<ondemand::array>();
67}
68
69template <typename parser_type>
70inline simdjson_result<ondemand::object> auto_parser<parser_type>::object() noexcept {
71 return result<ondemand::object>();
72}
73
74template <typename parser_type>
75inline simdjson_result<ondemand::number> auto_parser<parser_type>::number() noexcept {
76 return result<ondemand::number>();
77}
78
79#if SIMDJSON_EXCEPTIONS
80template <typename parser_type>
81template <typename T>
82inline auto_parser<parser_type>::operator T() noexcept(false) {
83 if (m_error != SUCCESS) {
84 throw simdjson_error(m_error);
85 }
86 return m_doc.get<T>();
87}
88#endif // SIMDJSON_EXCEPTIONS
89
90template <typename parser_type>
91template <typename T>
92inline std::optional<T> auto_parser<parser_type>::optional() noexcept(is_nothrow_gettable<T>) {
93 if (m_error != SUCCESS) {
94 return std::nullopt;
95 }
96 T value;
97 if (m_doc.get<T>().get(value)) [[unlikely]] {
98 return std::nullopt;
99 }
100 return {std::move(value)};
101}
102
103// to_adaptor method definitions
104template <typename T>
105inline T to_adaptor<T>::operator()(simdjson_result<ondemand::value> &val) const noexcept {
106 return val.get<T>();
107}
108
109template <typename T>
110inline auto to_adaptor<T>::operator()(padded_string_view const str) const noexcept {
111 return auto_parser<ondemand::parser *>{str};
112}
113
114template <typename T>
115inline auto to_adaptor<T>::operator()(ondemand::parser &parser, padded_string_view const str) const noexcept {
116 return auto_parser<ondemand::parser *>{parser, str};
117}
118} // namespace internal
119} // namespace convert
120} // namespace simdjson
121#endif // SIMDJSON_SUPPORTS_CONCEPTS
122#endif // SIMDJSON_CONVERT_INL_H
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