di 0.1.0
Loading...
Searching...
No Matches
void_status_code.h
Go to the documentation of this file.
1#pragma once
2
6
7namespace di::vocab {
8template<>
9class StatusCode<void> {
10public:
11 using Domain = void;
12 using Value = void;
13
14 constexpr auto domain() const -> StatusCodeDomain const& {
15 DI_ASSERT(!empty());
16 return *m_domain;
17 }
18
19 [[nodiscard]] constexpr auto empty() const -> bool { return m_domain == nullptr; }
20
21 constexpr auto message() const {
22 if (!empty()) {
23 return domain().do_message(*this);
24 }
25 return container::ErasedString(u8"[invalid status code]");
26 }
27
28 constexpr auto to_string() const { return message(); }
29
30 constexpr auto success() const -> bool { return !empty() && !domain().do_failure(*this); }
31 constexpr auto failure() const -> bool { return !empty() && domain().do_failure(*this); }
32
33 template<typename Domain>
34 constexpr auto strictly_equivalent(StatusCode<Domain> const& other) const -> bool {
35 if (this->empty() || other.empty()) {
36 return this->empty() == other.empty();
37 }
38 return domain().do_equivalent(*this, other);
39 }
40
41 template<typename Domain>
42 constexpr auto equivalent(StatusCode<Domain> const& other) const -> bool {
43 return this->strictly_equivalent(other) || other.strictly_equivalent(*this);
44 }
45
46 constexpr auto generic_code() const -> GenericCode;
47
48 constexpr auto operator==(StatusCode const& other) const -> bool { return strictly_equivalent(other); }
49
50protected:
51 constexpr explicit StatusCode(StatusCodeDomain const* domain) : m_domain(domain) {}
52
53 StatusCode() = default;
54 StatusCode(StatusCode const&) = default;
55 StatusCode(StatusCode&&) = default;
56
57 auto operator=(StatusCode const&) -> StatusCode& = default;
58 auto operator=(StatusCode&&) -> StatusCode& = default;
59
60 ~StatusCode() = default;
61
62 StatusCodeDomain const* m_domain { nullptr };
63
64private:
65 template<typename Domain>
66 friend class StatusCode;
67};
68}
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition erased_string.h:21
Definition status_code_domain.h:8
constexpr StatusCode(StatusCodeDomain const *domain)
Definition void_status_code.h:51
constexpr auto to_string() const
Definition void_status_code.h:28
constexpr auto empty() const -> bool
Definition void_status_code.h:19
constexpr auto equivalent(StatusCode< Domain > const &other) const -> bool
Definition void_status_code.h:42
constexpr auto strictly_equivalent(StatusCode< Domain > const &other) const -> bool
Definition void_status_code.h:34
constexpr auto domain() const -> StatusCodeDomain const &
Definition void_status_code.h:14
void Domain
Definition void_status_code.h:11
constexpr auto message() const
Definition void_status_code.h:21
StatusCode(StatusCode const &)=default
StatusCode(StatusCode &&)=default
friend class StatusCode
Definition void_status_code.h:66
StatusCodeDomain const * m_domain
Definition void_status_code.h:62
constexpr auto failure() const -> bool
Definition void_status_code.h:31
auto operator=(StatusCode const &) -> StatusCode &=default
auto operator=(StatusCode &&) -> StatusCode &=default
void Value
Definition void_status_code.h:12
constexpr auto success() const -> bool
Definition void_status_code.h:30
__UINT8_TYPE__ u8
Definition integers.h:9
Definition lazy.h:165
StatusCode< platform::GenericDomain > GenericCode
Definition status_code_forward_declaration.h:13
constexpr auto empty
Definition empty.h:45