Iros
 
Loading...
Searching...
No Matches
basic_optional_storage.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/core.h"
5#include "di/meta/util.h"
6#include "di/types/byte.h"
9#include "di/util/forward.h"
16
17namespace di::vocab {
18template<typename T>
20public:
21 constexpr explicit BasicOptionalStorage(NullOpt) {
22 // Suppress uninialized variable warnings by zero-initializing the storage.
23 for (size_t i = 0; i < sizeof(T); i++) {
24 m_array[i] = Byte(0);
25 }
26 }
27
30
33
35
39
40private:
41 constexpr friend auto tag_invoke(types::Tag<is_nullopt>, BasicOptionalStorage const& self) -> bool {
42 return !self.m_has_value;
43 }
44
45 template<typename Self>
47 constexpr friend auto tag_invoke(types::Tag<get_value>, Self&& self) -> decltype(auto) {
48 return util::forward_like<Self>(self.m_value);
49 }
50
52 if (self.m_has_value) {
54 }
55 self.m_has_value = false;
56 }
57
58 template<typename... Args>
59 requires(concepts::ConstructibleFrom<T, Args...>)
60 constexpr friend void tag_invoke(types::Tag<set_value>, BasicOptionalStorage& self, Args&&... args) {
61 util::construct_at(&self.m_value, util::forward<Args>(args)...);
62 self.m_has_value = true;
63 }
64
65 bool m_has_value { false };
66 union {
68 Byte m_array[sizeof(T)];
69 };
70};
71}
Definition basic_optional_storage.h:19
auto operator=(BasicOptionalStorage &&) -> BasicOptionalStorage &=default
constexpr friend void tag_invoke(types::Tag< set_value >, BasicOptionalStorage &self, Args &&... args)
Definition basic_optional_storage.h:60
BasicOptionalStorage(BasicOptionalStorage const &)=default
constexpr ~BasicOptionalStorage()
Definition basic_optional_storage.h:36
constexpr friend auto tag_invoke(types::Tag< get_value >, Self &&self) -> decltype(auto)
Definition basic_optional_storage.h:47
T m_value
Definition basic_optional_storage.h:67
BasicOptionalStorage(BasicOptionalStorage &&)=default
auto operator=(BasicOptionalStorage const &) -> BasicOptionalStorage &=default
Byte m_array[sizeof(T)]
Definition basic_optional_storage.h:68
constexpr friend void tag_invoke(types::Tag< set_nullopt >, BasicOptionalStorage &self)
Definition basic_optional_storage.h:51
constexpr BasicOptionalStorage(NullOpt)
Definition basic_optional_storage.h:21
constexpr friend auto tag_invoke(types::Tag< is_nullopt >, BasicOptionalStorage const &self) -> bool
Definition basic_optional_storage.h:41
Definition operations.h:11
Definition core.h:114
std::byte Byte
Definition byte.h:63
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto forward_like(U &&value) -> decltype(auto)
Definition forward_like.h:8
constexpr auto destroy_at
Definition destroy_at.h:24
constexpr auto construct_at
Definition construct_at.h:27
Definition lazy.h:165
Definition nullopt.h:6