Iros
 
Loading...
Searching...
No Matches
error.h
Go to the documentation of this file.
1#pragma once
2
5#include "dius/config.h"
6
7#include DIUS_PLATFORM_PATH(error.h)
8
9namespace di::platform {
11
12class GenericDomain;
13
15
16class GenericDomain final : public vocab::StatusCodeDomain {
17private:
18 using Base = vocab::StatusCodeDomain;
19
20public:
23
24 constexpr explicit GenericDomain(UniqueId id = 0xff261d32b71e0a8a) : Base(id) {}
25
26 GenericDomain(GenericDomain const&) = default;
28
29 auto operator=(GenericDomain const&) -> GenericDomain& = default;
30 auto operator=(GenericDomain&&) -> GenericDomain& = default;
31
32 constexpr static auto get() -> GenericDomain const&;
33
34 auto name() const -> di::container::ErasedString override { return container::ErasedString(u8"Posix) Domain"); }
35
36 auto payload_info() const -> PayloadInfo override {
37 return { sizeof(Value), sizeof(Value) + sizeof(StatusCodeDomain const*),
38 di::container::max(alignof(Value), alignof(StatusCodeDomain const*)) };
39 }
40
41protected:
42 constexpr auto do_failure(vocab::StatusCode<void> const& code) const -> bool override {
43 return down_cast(code).value() != BasicError::Success;
44 }
45
46 constexpr auto do_equivalent(vocab::StatusCode<void> const& a, vocab::StatusCode<void> const& b) const
47 -> bool override {
48 DI_ASSERT(a.domain() == *this);
49 return b.domain() == *this && down_cast(a).value() == down_cast(b).value();
50 }
51
52 constexpr auto do_convert_to_generic(vocab::StatusCode<void> const& a) const -> vocab::GenericCode override {
53 DI_ASSERT(a.domain() == *this);
54 return vocab::GenericCode(di::in_place, down_cast(a).value());
55 }
56
57 // NOLINTNEXTLINE(readability-function-cognitive-complexity)
58 constexpr auto do_message(vocab::StatusCode<void> const& code) const -> di::container::ErasedString override {
59 auto value = down_cast(code).value();
60 if (value == BasicError::Success) {
61 return container::ErasedString(u8"Success");
62 }
63 if (value == BasicError::AddressFamilyNotSupported) {
64 return container::ErasedString(u8"Address familty not supported");
65 }
66 if (value == BasicError::AddressInUse) {
67 return container::ErasedString(u8"Address in use");
68 }
69 if (value == BasicError::AddressNotAvailable) {
70 return container::ErasedString(u8"Address not available");
71 }
72 if (value == BasicError::AlreadyConnected) {
73 return container::ErasedString(u8"Already connected");
74 }
75 if (value == BasicError::ArgumentListTooLong) {
76 return container::ErasedString(u8"Argument list too long");
77 }
78 if (value == BasicError::ArgumentOutOfDomain) {
79 return container::ErasedString(u8"Argument out of domain");
80 }
81 if (value == BasicError::BadAddress) {
82 return container::ErasedString(u8"Bad address");
83 }
84 if (value == BasicError::BadFileDescriptor) {
85 return container::ErasedString(u8"Bad file descriptor");
86 }
87 if (value == BasicError::BadMessage) {
88 return container::ErasedString(u8"Bad message");
89 }
90 if (value == BasicError::BrokenPipe) {
91 return container::ErasedString(u8"Broken pipe");
92 }
93 if (value == BasicError::ConnectionAborted) {
94 return container::ErasedString(u8"Connect aborted");
95 }
96 if (value == BasicError::ConnectionAlreadyInProgress) {
97 return container::ErasedString(u8"Connection already in progress");
98 }
99 if (value == BasicError::ConnectionRefused) {
100 return container::ErasedString(u8"Connection refused");
101 }
102 if (value == BasicError::ConnectionReset) {
103 return container::ErasedString(u8"Connection reset");
104 }
105 if (value == BasicError::CrossDeviceLink) {
106 return container::ErasedString(u8"Cross device link");
107 }
108 if (value == BasicError::DestinationAddressRequired) {
109 return container::ErasedString(u8"Destination address required");
110 }
111 if (value == BasicError::DeviceOrResourceBusy) {
112 return container::ErasedString(u8"Device or resource busy");
113 }
114 if (value == BasicError::DirectoryNotEmpty) {
115 return container::ErasedString(u8"Directory not empty");
116 }
117 if (value == BasicError::ExecutableFormatError) {
118 return container::ErasedString(u8"Executable format error");
119 }
120 if (value == BasicError::FileExists) {
121 return container::ErasedString(u8"File exists");
122 }
123 if (value == BasicError::FileTooLarge) {
124 return container::ErasedString(u8"File too large");
125 }
126 if (value == BasicError::FilenameTooLong) {
127 return container::ErasedString(u8"Filename too long");
128 }
129 if (value == BasicError::FunctionNotSupported) {
130 return container::ErasedString(u8"Function not supported");
131 }
132 if (value == BasicError::HostUnreachable) {
133 return container::ErasedString(u8"Host unreachable");
134 }
135 if (value == BasicError::IdentifierRemoved) {
136 return container::ErasedString(u8"Identifier removed");
137 }
138 if (value == BasicError::IllegalByteSequence) {
139 return container::ErasedString(u8"Illegal byte sequence");
140 }
141 if (value == BasicError::InappropriateIoControlOperation) {
142 return container::ErasedString(u8"Inappropriate io control operation");
143 }
144 if (value == BasicError::Interrupted) {
145 return container::ErasedString(u8"Interrupted");
146 }
147 if (value == BasicError::InvalidArgument) {
148 return container::ErasedString(u8"Invalid argument");
149 }
150 if (value == BasicError::InvalidSeek) {
151 return container::ErasedString(u8"Invalid seek");
152 }
153 if (value == BasicError::IoError) {
154 return container::ErasedString(u8"IO error");
155 }
156 if (value == BasicError::IsADirectory) {
157 return container::ErasedString(u8"Is a directory");
158 }
159 if (value == BasicError::MessageSize) {
160 return container::ErasedString(u8"Message size");
161 }
162 if (value == BasicError::NetworkDown) {
163 return container::ErasedString(u8"Network down");
164 }
165 if (value == BasicError::NetworkReset) {
166 return container::ErasedString(u8"Network reset");
167 }
168 if (value == BasicError::NetworkUnreachable) {
169 return container::ErasedString(u8"Network unreachable");
170 }
171 if (value == BasicError::NoBufferSpace) {
172 return container::ErasedString(u8"No buffer space");
173 }
174 if (value == BasicError::NoChildProcess) {
175 return container::ErasedString(u8"No child process");
176 }
177 if (value == BasicError::NoLink) {
178 return container::ErasedString(u8"No link");
179 }
180 if (value == BasicError::NoLockAvailable) {
181 return container::ErasedString(u8"No lock available");
182 }
183 if (value == BasicError::NoMessageAvailable) {
184 return container::ErasedString(u8"No message available");
185 }
186 if (value == BasicError::NoMessage) {
187 return container::ErasedString(u8"No message");
188 }
189 if (value == BasicError::NoProtocolOption) {
190 return container::ErasedString(u8"No protocol option");
191 }
192 if (value == BasicError::NoSpaceOnDevice) {
193 return container::ErasedString(u8"No space on device");
194 }
195 if (value == BasicError::NoStreamResources) {
196 return container::ErasedString(u8"No stream resources");
197 }
198 if (value == BasicError::NoSuchDeviceOrAddress) {
199 return container::ErasedString(u8"No such device or address");
200 }
201 if (value == BasicError::NoSuchDevice) {
202 return container::ErasedString(u8"No such device");
203 }
204 if (value == BasicError::NoSuchFileOrDirectory) {
205 return container::ErasedString(u8"No such file or directory");
206 }
207 if (value == BasicError::NoSuchProcess) {
208 return container::ErasedString(u8"No such process");
209 }
210 if (value == BasicError::NotADirectory) {
211 return container::ErasedString(u8"Not a directory");
212 }
213 if (value == BasicError::NotASocket) {
214 return container::ErasedString(u8"Not a socket");
215 }
216 if (value == BasicError::NotAStream) {
217 return container::ErasedString(u8"Not a stream");
218 }
219 if (value == BasicError::NotConnected) {
220 return container::ErasedString(u8"Not connected");
221 }
222 if (value == BasicError::NotEnoughMemory) {
223 return container::ErasedString(u8"Not enough memory");
224 }
225 if (value == BasicError::OperationCanceled) {
226 return container::ErasedString(u8"Operation cancelled");
227 }
228 if (value == BasicError::OperationInProgress) {
229 return container::ErasedString(u8"Operation in progress");
230 }
231 if (value == BasicError::OperationNotPermitted) {
232 return container::ErasedString(u8"Operation not permitted");
233 }
234 if (value == BasicError::NotSupported) {
235 return container::ErasedString(u8"Not supported");
236 }
237 if (value == BasicError::OperationNotSupported) {
238 return container::ErasedString(u8"Operation not supported");
239 }
240 if (value == BasicError::OperationWouldBlock) {
241 return container::ErasedString(u8"Operation would block");
242 }
243 if (value == BasicError::OwnerDead) {
244 return container::ErasedString(u8"Owner dead");
245 }
246 if (value == BasicError::PermissionDenied) {
247 return container::ErasedString(u8"Permission denied");
248 }
249 if (value == BasicError::ProtocolError) {
250 return container::ErasedString(u8"Protocol error");
251 }
252 if (value == BasicError::ProtocolNotSupported) {
253 return container::ErasedString(u8"Protocol not supported");
254 }
255 if (value == BasicError::ReadOnlyFileSystem) {
256 return container::ErasedString(u8"Read only file system");
257 }
258 if (value == BasicError::ResourceDeadlockWouldOccur) {
259 return container::ErasedString(u8"Resource deadlock would occur");
260 }
261 if (value == BasicError::ResourceUnavailableTryAgain) {
262 return container::ErasedString(u8"Resource unavailable try again");
263 }
264 if (value == BasicError::ResultOutOfRange) {
265 return container::ErasedString(u8"Result out of range");
266 }
267 if (value == BasicError::StateNotRecoverable) {
268 return container::ErasedString(u8"State not recoverable");
269 }
270 if (value == BasicError::StreamTimeout) {
271 return container::ErasedString(u8"Stream timeout");
272 }
273 if (value == BasicError::TextFileBusy) {
274 return container::ErasedString(u8"Text file busy");
275 }
276 if (value == BasicError::TimedOut) {
277 return container::ErasedString(u8"Timed out");
278 }
279 if (value == BasicError::TooManyFilesOpenInSystem) {
280 return container::ErasedString(u8"Too many files open in system");
281 }
282 if (value == BasicError::TooManyFilesOpen) {
283 return container::ErasedString(u8"Too many files open");
284 }
285 if (value == BasicError::TooManyLinks) {
286 return container::ErasedString(u8"Too many links");
287 }
288 if (value == BasicError::TooManySymbolicLinkLevels) {
289 return container::ErasedString(u8"Too many symbolic link levels");
290 }
291 if (value == BasicError::ValueTooLarge) {
292 return container::ErasedString(u8"Value too large");
293 }
294 if (value == BasicError::WrongProtocolType) {
295 return container::ErasedString(u8"Wrong protocol type");
296 }
297 return container::ErasedString(u8"(Unknown)");
298 }
299
300private:
301 template<typename Domain>
303
304 constexpr auto down_cast(vocab::StatusCode<void> const& code) const -> GenericCode const& {
305 DI_ASSERT(code.domain() == *this);
306 return static_cast<GenericCode const&>(code);
307 }
308};
309
310#ifdef DI_SANITIZER
311// When compiling with UBSAN, using the address of a constexpr inline variable fails.
312// This includes checking for nullptr. To work around this, do not declare the variable
313// as inline when compiling with a sanitizer.
314// See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71962.
315// As a side note, this means there will be multiple copies of the generic_domain object
316// in a user's program. This is perfectly fine, since we make sure to compare domains by
317// their unique id and not their address, which is necessary even for inline variables when
318// in the presence of dynamic linking.
319constexpr auto generic_domain = GenericDomain {};
320#else
321constexpr inline auto generic_domain = GenericDomain {};
322#endif
323
324constexpr auto GenericDomain::get() -> GenericDomain const& {
325 return generic_domain;
326}
327}
328
329namespace di::vocab::detail {
333}
334
335namespace di::vocab {
336constexpr auto StatusCode<void>::generic_code() const -> GenericCode {
337 if (!this->empty()) {
338 return this->domain().do_convert_to_generic(*this);
339 }
340 return GenericCode(di::in_place, platform::BasicError::InvalidArgument);
341}
342}
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition erased_string.h:21
Definition error.h:15
constexpr GenericDomain(UniqueId id=0x25657faae58bbe11)
Definition default_generic_domain.h:29
static constexpr auto get() -> GenericDomain const &
auto operator=(GenericDomain &&) -> GenericDomain &=default
Base::UniqueId UniqueId
Definition default_generic_domain.h:27
constexpr auto do_equivalent(vocab::StatusCode< void > const &a, vocab::StatusCode< void > const &b) const -> bool override
Definition error.h:46
auto payload_info() const -> PayloadInfo override
Definition error.h:36
auto operator=(GenericDomain const &) -> GenericDomain &=default
constexpr auto do_convert_to_generic(vocab::StatusCode< void > const &a) const -> vocab::GenericCode override
Definition error.h:52
auto name() const -> di::container::ErasedString override
Definition error.h:34
GenericDomain(GenericDomain const &)=default
static constexpr auto get() -> GenericDomain const &
Definition default_generic_domain.h:108
BasicError Value
Definition default_generic_domain.h:26
constexpr auto do_message(vocab::StatusCode< void > const &code) const -> di::container::ErasedString override
Definition error.h:58
constexpr auto do_failure(vocab::StatusCode< void > const &code) const -> bool override
Definition error.h:42
constexpr GenericDomain(UniqueId id=0xff261d32b71e0a8a)
Definition error.h:24
GenericDomain(GenericDomain &&)=default
Definition status_code_domain.h:8
constexpr StatusCodeDomain(UniqueId id)
Definition status_code_domain.h:29
constexpr auto id() const
Definition status_code_domain.h:12
u64 UniqueId
Definition status_code_domain.h:10
Definition status_code_forward_declaration.h:11
Definition sequence.h:12
constexpr auto max
Definition max.h:47
BasicError
Definition default_generic_domain.h:10
Definition custom.h:30
constexpr auto generic_domain
Definition default_generic_domain.h:105
vocab::StatusCode< GenericDomain > GenericCode
Definition error.h:14
__UINT8_TYPE__ u8
Definition integers.h:9
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition erasure_cast.h:7
Definition lazy.h:165
StatusCode< platform::GenericDomain > GenericCode
Definition status_code_forward_declaration.h:13
Definition zstring_parser.h:9
constexpr auto empty
Definition empty.h:45
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto in_place
Definition in_place.h:8
PosixError
Definition error.h:7
Definition status_code_domain.h:16