Iros
 
Loading...
Searching...
No Matches
default_generic_domain.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/types/prelude.h"
7
8namespace di::platform {
20
21class GenericDomain final : public vocab::StatusCodeDomain {
22private:
23 using Base = StatusCodeDomain;
24
25public:
28
29 constexpr explicit GenericDomain(UniqueId id = 0x25657faae58bbe11) : Base(id) {}
30
31 GenericDomain(GenericDomain const&) = default;
33
34 auto operator=(GenericDomain const&) -> GenericDomain& = default;
35 auto operator=(GenericDomain&&) -> GenericDomain& = default;
36
37 constexpr static auto get() -> GenericDomain const&;
38
39 auto name() const -> container::ErasedString override { return container::ErasedString(u8"Generic Domain"); }
40
41 auto payload_info() const -> PayloadInfo override {
42 return { sizeof(Value), sizeof(Value) + sizeof(StatusCodeDomain const*),
43 container::max(alignof(Value), alignof(StatusCodeDomain const*)) };
44 }
45
46protected:
47 constexpr auto do_failure(vocab::StatusCode<void> const& code) const -> bool override {
48 return down_cast(code).value() != BasicError::Success;
49 }
50
51 constexpr auto do_equivalent(vocab::StatusCode<void> const& a, vocab::StatusCode<void> const& b) const
52 -> bool override {
53 DI_ASSERT(a.domain() == *this);
54 return b.domain() == *this && down_cast(a).value() == down_cast(b).value();
55 }
56
57 constexpr auto do_convert_to_generic(vocab::StatusCode<void> const& a) const -> vocab::GenericCode override {
58 DI_ASSERT(a.domain() == *this);
59 return vocab::GenericCode(di::in_place, down_cast(a).value());
60 }
61
62 constexpr auto do_message(vocab::StatusCode<void> const& code) const -> container::ErasedString override {
63 auto value = down_cast(code).value();
64 switch (value) {
65 case BasicError::Success:
66 return container::ErasedString(u8"Success");
67 case BasicError::NotEnoughMemory:
68 return container::ErasedString(u8"Not enough memory");
69 case BasicError::ResultOutOfRange:
70 return container::ErasedString(u8"Result out of range");
71 case BasicError::InvalidArgument:
72 return container::ErasedString(u8"Invalid argument");
73 default:
74 return container::ErasedString(u8"Unknown");
75 }
76 }
77
78private:
79 template<typename Domain>
80 friend class StatusCode;
81
82 constexpr auto down_cast(vocab::StatusCode<void> const& code) const -> vocab::GenericCode const& {
83 DI_ASSERT(code.domain() == *this);
84 return static_cast<vocab::GenericCode const&>(code);
85 }
86};
87
88inline namespace generic_error {
92}
93
94#ifdef DI_SANITIZER
95// When compiling with UBSAN, using the address of a constexpr inline variable fails.
96// This includes checking for nullptr. To work around this, do not declare the variable
97// as inline when compiling with a sanitizer.
98// See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71962.
99// As a side note, this means there will be multiple copies of the generic_domain object
100// in a user's program. This is perfectly fine, since we make sure to compare domains by
101// their unique id and not their address, which is necessary even for inline variables when
102// in the presence of dynamic linking.
103constexpr auto generic_domain = GenericDomain {};
104#else
105constexpr inline auto generic_domain = GenericDomain {};
106#endif
107
108constexpr auto GenericDomain::get() -> GenericDomain const& {
109 return generic_domain;
110}
111}
112
113namespace di::vocab {
115 if (!this->empty()) {
116 return this->domain().do_convert_to_generic(*this);
117 }
118 return GenericCode(di::in_place, platform::BasicError::InvalidArgument);
119}
120}
#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
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 default_generic_domain.h:51
auto payload_info() const -> PayloadInfo override
Definition default_generic_domain.h:41
auto operator=(GenericDomain const &) -> GenericDomain &=default
constexpr auto do_convert_to_generic(vocab::StatusCode< void > const &a) const -> vocab::GenericCode override
Definition default_generic_domain.h:57
friend class StatusCode
Definition default_generic_domain.h:80
GenericDomain(GenericDomain const &)=default
constexpr auto do_message(vocab::StatusCode< void > const &code) const -> container::ErasedString override
Definition default_generic_domain.h:62
static constexpr auto get() -> GenericDomain const &
Definition default_generic_domain.h:108
BasicError Value
Definition default_generic_domain.h:26
constexpr auto do_failure(vocab::StatusCode< void > const &code) const -> bool override
Definition default_generic_domain.h:47
GenericDomain(GenericDomain &&)=default
auto name() const -> container::ErasedString override
Definition default_generic_domain.h:39
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
constexpr auto domain() const -> StatusCodeDomain const &
Definition void_status_code.h:14
friend class StatusCode
Definition void_status_code.h:62
Definition sequence.h:12
constexpr auto max
Definition max.h:47
Definition default_generic_domain.h:9
BasicError
Definition default_generic_domain.h:10
@ NotEnoughMemory
Definition default_generic_domain.h:12
@ InvalidArgument
Definition default_generic_domain.h:14
@ Success
Definition default_generic_domain.h:11
@ Cancelled
Definition default_generic_domain.h:17
@ OperationCanceled
Definition default_generic_domain.h:16
@ ResultOutOfRange
Definition default_generic_domain.h:13
@ ValueTooLarge
Definition default_generic_domain.h:15
Definition custom.h:30
constexpr auto generic_domain
Definition default_generic_domain.h:105
__UINT8_TYPE__ u8
Definition integers.h:9
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition lazy.h:165
StatusCode< platform::GenericDomain > GenericCode
Definition status_code_forward_declaration.h:13
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
Definition status_code_domain.h:16