simdjson 4.2.2
Ridiculously Fast JSON
Loading...
Searching...
No Matches
error-inl.h
1#ifndef SIMDJSON_ERROR_INL_H
2#define SIMDJSON_ERROR_INL_H
3
4#include "simdjson/error.h"
5
6#include <iostream>
7
8namespace simdjson {
9
10inline bool is_fatal(error_code error) noexcept {
11 return error == TAPE_ERROR || error == INCOMPLETE_ARRAY_OR_OBJECT;
12}
13
14namespace internal {
15 // We store the error code so we can validate the error message is associated with the right code
16 struct error_code_info {
17 error_code code;
18 const char* message; // do not use a fancy std::string where a simple C string will do (no alloc, no destructor)
19 };
20 // These MUST match the codes in error_code. We check this constraint in basictests.
21 extern SIMDJSON_DLLIMPORTEXPORT const error_code_info error_codes[];
22} // namespace internal
23
24
25inline const char *error_message(error_code error) noexcept {
26 // If you're using error_code, we're trusting you got it from the enum.
27 return internal::error_codes[int(error)].message;
28}
29
30// deprecated function
31#ifndef SIMDJSON_DISABLE_DEPRECATED_API
32inline const std::string error_message(int error) noexcept {
33 if (error < 0 || error >= error_code::NUM_ERROR_CODES) {
34 return internal::error_codes[UNEXPECTED_ERROR].message;
35 }
36 return internal::error_codes[error].message;
37}
38#endif // SIMDJSON_DISABLE_DEPRECATED_API
39
40inline std::ostream& operator<<(std::ostream& out, error_code error) noexcept {
41 return out << error_message(error);
42}
43
44namespace internal {
45
46//
47// internal::simdjson_result_base<T> inline implementation
48//
49
50template<typename T>
51simdjson_inline void simdjson_result_base<T>::tie(T &value, error_code &error) && noexcept {
52 error = this->second;
53 if (!error) {
54 value = std::forward<simdjson_result_base<T>>(*this).first;
55 }
56}
57
58template<typename T>
59simdjson_warn_unused simdjson_inline error_code simdjson_result_base<T>::get(T &value) && noexcept {
60 error_code error;
61 std::forward<simdjson_result_base<T>>(*this).tie(value, error);
62 return error;
63}
64
65template<typename T>
66simdjson_inline error_code simdjson_result_base<T>::error() const noexcept {
67 return this->second;
68}
69
70
71template<typename T>
72simdjson_inline bool simdjson_result_base<T>::has_value() const noexcept {
73 return this->error() == SUCCESS;
74}
75
76#if SIMDJSON_EXCEPTIONS
77
78
79template<typename T>
80simdjson_inline T& simdjson_result_base<T>::operator*() & noexcept(false) {
81 return this->value();
82}
83
84template<typename T>
85simdjson_inline T&& simdjson_result_base<T>::operator*() && noexcept(false) {
86 return std::forward<internal::simdjson_result_base<T>>(*this).value();
87}
88
89template<typename T>
90simdjson_inline T* simdjson_result_base<T>::operator->() noexcept(false) {
91 if (this->error()) { throw simdjson_error(this->error()); }
92 return &this->first;
93}
94
95
96template<typename T>
97simdjson_inline const T* simdjson_result_base<T>::operator->() const noexcept(false) {
98 if (this->error()) { throw simdjson_error(this->error()); }
99 return &this->first;
100}
101
102template<typename T>
103simdjson_inline T& simdjson_result_base<T>::value() & noexcept(false) {
104 if (error()) { throw simdjson_error(error()); }
105 return this->first;
106}
107
108template<typename T>
109simdjson_inline T&& simdjson_result_base<T>::value() && noexcept(false) {
110 return std::forward<simdjson_result_base<T>>(*this).take_value();
111}
112
113template<typename T>
114simdjson_inline T&& simdjson_result_base<T>::take_value() && noexcept(false) {
115 if (error()) { throw simdjson_error(error()); }
116 return std::forward<T>(this->first);
117}
118
119template<typename T>
120simdjson_inline simdjson_result_base<T>::operator T&&() && noexcept(false) {
121 return std::forward<simdjson_result_base<T>>(*this).take_value();
122}
123
124#endif // SIMDJSON_EXCEPTIONS
125
126
127template<typename T>
128simdjson_inline const T& simdjson_result_base<T>::value_unsafe() const& noexcept {
129 return this->first;
130}
131
132template<typename T>
133simdjson_inline T&& simdjson_result_base<T>::value_unsafe() && noexcept {
134 return std::forward<T>(this->first);
135}
136
137template<typename T>
138simdjson_inline simdjson_result_base<T>::simdjson_result_base(T &&value, error_code error) noexcept
139 : std::pair<T, error_code>(std::forward<T>(value), error) {}
140template<typename T>
141simdjson_inline simdjson_result_base<T>::simdjson_result_base(error_code error) noexcept
142 : simdjson_result_base(T{}, error) {}
143template<typename T>
144simdjson_inline simdjson_result_base<T>::simdjson_result_base(T &&value) noexcept
145 : simdjson_result_base(std::forward<T>(value), SUCCESS) {}
146template<typename T>
147simdjson_inline simdjson_result_base<T>::simdjson_result_base() noexcept
148 : simdjson_result_base(T{}, UNINITIALIZED) {}
149
150} // namespace internal
151
155
156template<typename T>
157simdjson_inline void simdjson_result<T>::tie(T &value, error_code &error) && noexcept {
158 std::forward<internal::simdjson_result_base<T>>(*this).tie(value, error);
159}
160
161template<typename T>
162simdjson_warn_unused simdjson_inline error_code
163simdjson_result<T>::get(T &value) && noexcept {
164 return std::forward<internal::simdjson_result_base<T>>(*this).get(value);
165}
166
167template<typename T>
168simdjson_inline error_code simdjson_result<T>::error() const noexcept {
169 return internal::simdjson_result_base<T>::error();
170}
171
172#if SIMDJSON_EXCEPTIONS
173
174template<typename T>
175simdjson_inline T& simdjson_result<T>::value() & noexcept(false) {
176 return internal::simdjson_result_base<T>::value();
177}
178
179template<typename T>
180simdjson_inline T&& simdjson_result<T>::value() && noexcept(false) {
181 return std::forward<internal::simdjson_result_base<T>>(*this).value();
182}
183
184template<typename T>
185simdjson_inline T&& simdjson_result<T>::take_value() && noexcept(false) {
186 return std::forward<internal::simdjson_result_base<T>>(*this).take_value();
187}
188
189template<typename T>
190simdjson_inline simdjson_result<T>::operator T&&() && noexcept(false) {
191 return std::forward<internal::simdjson_result_base<T>>(*this).take_value();
192}
193
194#endif // SIMDJSON_EXCEPTIONS
195
196template<typename T>
197simdjson_inline const T& simdjson_result<T>::value_unsafe() const& noexcept {
198 return internal::simdjson_result_base<T>::value_unsafe();
199}
200
201template<typename T>
202simdjson_inline T&& simdjson_result<T>::value_unsafe() && noexcept {
203 return std::forward<internal::simdjson_result_base<T>>(*this).value_unsafe();
204}
205
206template<typename T>
207simdjson_inline simdjson_result<T>::simdjson_result(T &&value, error_code error) noexcept
208 : internal::simdjson_result_base<T>(std::forward<T>(value), error) {}
209template<typename T>
210simdjson_inline simdjson_result<T>::simdjson_result(error_code error) noexcept
211 : internal::simdjson_result_base<T>(error) {}
212template<typename T>
213simdjson_inline simdjson_result<T>::simdjson_result(T &&value) noexcept
214 : internal::simdjson_result_base<T>(std::forward<T>(value)) {}
215template<typename T>
216simdjson_inline simdjson_result<T>::simdjson_result() noexcept
217 : internal::simdjson_result_base<T>() {}
218
219} // namespace simdjson
220
221#endif // SIMDJSON_ERROR_INL_H
The top level simdjson namespace, containing everything the library provides.
Definition base.h:8
const char * error_message(error_code error) noexcept
It is the convention throughout the code that the macro SIMDJSON_DEVELOPMENT_CHECKS determines whethe...
Definition error-inl.h:25
error_code
All possible errors returned by simdjson.
Definition error.h:19
@ TAPE_ERROR
Something went wrong, this is a generic error. Fatal/unrecoverable error.
Definition error.h:23
@ NUM_ERROR_CODES
Placeholder for end of error code list.
Definition error.h:53
@ SUCCESS
No error.
Definition error.h:20
@ INCOMPLETE_ARRAY_OR_OBJECT
The document ends early. Fatal/unrecoverable error.
Definition error.h:48
@ UNEXPECTED_ERROR
indicative of a bug in simdjson
Definition error.h:44
@ UNINITIALIZED
unknown error, or uninitialized document
Definition error.h:32
bool is_fatal(error_code error) noexcept
Some errors are fatal and invalidate the document.
Definition error-inl.h:10
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_inline T & value() &noexcept(false)
Get the result value.
Definition error-inl.h:175
simdjson_inline T && take_value() &&noexcept(false)
Take the result value (move it).
Definition error-inl.h:185
simdjson_inline void tie(T &value, error_code &error) &&noexcept
Move the value and the error to the provided variables.
Definition error-inl.h:157
simdjson_warn_unused simdjson_inline error_code get(T &value) &&noexcept
Move the value to the provided variable.
Definition error-inl.h:163
simdjson_inline const T & value_unsafe() const &noexcept
Get the result value.
Definition error-inl.h:197