Iros
 
Loading...
Searching...
No Matches
status_code_storage.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/util/addressof.h"
9
10namespace di::vocab::detail {
11template<typename T>
12requires(!concepts::LanguageVoid<T>)
13class StatusCodeStorage : public StatusCode<void> {
14private:
15 using Base = StatusCode<void>;
16
17public:
20
21 constexpr auto domain() const -> Domain const& {
22 DI_ASSERT(!empty());
23 return static_cast<Domain const&>(*m_domain);
24 }
25
26 constexpr void clear() {
27 util::destroy_at(util::addressof(m_value));
28 m_domain = nullptr;
29 util::construct_at(util::addressof(m_value));
30 }
31
32 constexpr auto value() & -> Value& { return m_value; }
33 constexpr auto value() const& -> Value const& { return m_value; }
34 constexpr auto value() && -> Value&& { return util::move(m_value); }
35 constexpr auto value() const&& -> Value const&& { return util::move(m_value); }
36
37protected:
38 StatusCodeStorage() = default;
40 constexpr StatusCodeStorage(StatusCodeStorage&& other) : Base(other), m_value(util::move(other.value())) {
41 other.m_domain = nullptr;
42 }
43
44 template<typename... Args>
45 requires(concepts::ConstructibleFrom<Value, Args...>)
46 constexpr StatusCodeStorage(InPlace, StatusCodeDomain const* domain, Args&&... args)
47 : Base(domain), m_value(util::forward<Args>(args)...) {}
48
49 auto operator=(StatusCodeStorage const&) -> StatusCodeStorage& = default;
50 constexpr auto operator=(StatusCodeStorage&& other) -> StatusCodeStorage& {
51 util::destroy_at(util::addressof(m_value));
52 util::construct_at(util::addressof(m_value), util::move(other).value());
53 return *this;
54 }
55
56 ~StatusCodeStorage() = default;
57
59};
60}
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition status_code_domain.h:8
friend class StatusCode
Definition void_status_code.h:62
StatusCodeDomain const * m_domain
Definition void_status_code.h:58
constexpr auto domain() const -> Domain const &
Definition status_code_storage.h:21
constexpr auto value() &-> Value &
Definition status_code_storage.h:32
constexpr auto value() const &-> Value const &
Definition status_code_storage.h:33
meta::StatusCodeDomainValue< T > Value
Definition status_code_storage.h:19
auto operator=(StatusCodeStorage const &) -> StatusCodeStorage &=default
constexpr StatusCodeStorage(StatusCodeStorage &&other)
Definition status_code_storage.h:40
StatusCodeStorage(StatusCodeStorage const &)=default
Value m_value
Definition status_code_storage.h:58
constexpr auto value() &&-> Value &&
Definition status_code_storage.h:34
constexpr void clear()
Definition status_code_storage.h:26
constexpr auto value() const &&-> Value const &&
Definition status_code_storage.h:35
constexpr auto operator=(StatusCodeStorage &&other) -> StatusCodeStorage &
Definition status_code_storage.h:50
constexpr StatusCodeStorage(InPlace, StatusCodeDomain const *domain, Args &&... args)
Definition status_code_storage.h:46
meta::StatusCodeDomain< T > Domain
Definition status_code_storage.h:18
Definition operations.h:11
detail::StatusCodeDomainValueHelper< T >::Type StatusCodeDomainValue
Definition status_code_domain_value.h:16
detail::StatusCodeDomainHelper< T >::Type StatusCodeDomain
Definition status_code_domain.h:17
Definition vocab.h:96
constexpr auto destroy_at
Definition destroy_at.h:24
constexpr auto construct_at
Definition construct_at.h:27
Definition erasure_cast.h:7
constexpr auto empty
Definition empty.h:45
Definition in_place.h:4