simdjson 4.0.7
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
40
41
42
43template <typename parser_type>
44inline std::remove_pointer_t<parser_type> &auto_parser<parser_type>::parser() noexcept {
45 if constexpr (std::is_pointer_v<parser_type>) {
46 return *m_parser;
47 } else {
48 return m_parser;
49 }
50}
51
52template <typename parser_type>
53template <typename T>
54inline simdjson_result<T> auto_parser<parser_type>::result() noexcept(is_nothrow_gettable<T>) {
55 if (m_error != SUCCESS) {
56 return m_error;
57 }
58 return m_doc.get<T>();
59}
60
61template <typename parser_type>
62template <typename T>
63simdjson_warn_unused simdjson_inline error_code auto_parser<parser_type>::get(T &value) && noexcept(is_nothrow_gettable<T>) {
64 return result<T>().get(value);
65}
66
67template <typename parser_type>
68inline simdjson_result<ondemand::array> auto_parser<parser_type>::array() noexcept {
69 return result<ondemand::array>();
70}
71
72template <typename parser_type>
73inline simdjson_result<ondemand::object> auto_parser<parser_type>::object() noexcept {
74 return result<ondemand::object>();
75}
76
77template <typename parser_type>
78inline simdjson_result<ondemand::number> auto_parser<parser_type>::number() noexcept {
79 return result<ondemand::number>();
80}
81
82#if SIMDJSON_EXCEPTIONS
83template <typename parser_type>
84template <typename T>
85inline auto_parser<parser_type>::operator T() noexcept(false) {
86 if (m_error != SUCCESS) {
87 throw simdjson_error(m_error);
88 }
89 return m_doc.get<T>();
90}
91#endif // SIMDJSON_EXCEPTIONS
92
93template <typename parser_type>
94template <typename T>
95inline std::optional<T> auto_parser<parser_type>::optional() noexcept(is_nothrow_gettable<T>) {
96 if (m_error != SUCCESS) {
97 return std::nullopt;
98 }
99 T value;
100 if (m_doc.get<T>().get(value)) [[unlikely]] {
101 return std::nullopt;
102 }
103 return {std::move(value)};
104}
105
106// to_adaptor method definitions
107template <typename T>
108inline T to_adaptor<T>::operator()(simdjson_result<ondemand::value> &val) const noexcept {
109 return val.get<T>();
110}
111
112template <typename T>
113inline auto to_adaptor<T>::operator()(padded_string_view const str) const noexcept {
114 return auto_parser<ondemand::parser *>{str};
115}
116
117template <typename T>
118inline auto to_adaptor<T>::operator()(ondemand::parser &parser, padded_string_view const str) const noexcept {
119 return auto_parser<ondemand::parser *>{parser, str};
120}
121
122template <typename T>
123inline auto to_adaptor<T>::operator()(std::string str) const noexcept {
124 return auto_parser<ondemand::parser *>{pad_with_reserve(str)};
125}
126
127template <typename T>
128inline auto to_adaptor<T>::operator()(ondemand::parser &parser, std::string str) const noexcept {
129 return auto_parser<ondemand::parser *>{parser, pad_with_reserve(str)};
130}
131} // namespace internal
132} // namespace convert
133} // namespace simdjson
134#endif // SIMDJSON_SUPPORTS_CONCEPTS
135#endif // SIMDJSON_CONVERT_INL_H
The top level simdjson namespace, containing everything the library provides.
Definition base.h:8
padded_string_view pad_with_reserve(std::string &s) noexcept
Create a padded_string_view from a string.
error_code
All possible errors returned by simdjson.
Definition error.h:19
@ SUCCESS
No error.
Definition error.h:20