Iros
 
Loading...
Searching...
No Matches
variant_impl.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/constexpr.h"
4#include "di/meta/util.h"
5#include "di/types/prelude.h"
6#include "di/util/forward.h"
8
9namespace di::vocab::detail {
10template<typename... Types>
11requires(sizeof...(Types) > 0)
13
14template<typename T, typename... Rest>
15class VariantImpl<T, Rest...> {
16public:
17 constexpr VariantImpl() {}
18 constexpr VariantImpl(VariantImpl const&) = default;
19 constexpr VariantImpl(VariantImpl&&) = default;
20
21 constexpr auto operator=(VariantImpl const&) -> VariantImpl& = default;
22 constexpr auto operator=(VariantImpl&&) -> VariantImpl& = default;
23
24 ~VariantImpl() = default;
25
29
30 template<concepts::RemoveCVRefSameAs<VariantImpl> Self>
31 constexpr static auto static_get(Constexpr<0ZU>, Self&& self) -> meta::Like<Self, T>&& {
32 return util::forward<Self>(self).m_value.value();
33 }
34
35 template<concepts::RemoveCVRefSameAs<VariantImpl> Self, size_t index>
36 requires(index != 0)
37 constexpr static auto static_get(Constexpr<index>, Self&& self) -> decltype(auto) {
38 return VariantImpl<Rest...>::static_get(c_<index - 1>, util::forward<Self>(self).m_rest);
39 }
40
41 constexpr void destroy_impl(Constexpr<0ZU>) { util::destroy_at(util::addressof(m_value)); }
42
43 template<size_t index>
45 return m_rest.destroy_impl(c_<index - 1>);
46 }
47
48 template<typename... Args>
49 constexpr auto emplace_impl(Constexpr<0ZU>, Args&&... args) -> T& {
50 util::construct_at(util::addressof(m_value), in_place, util::forward<Args>(args)...);
51 return m_value.value();
52 }
53
54 template<size_t index, typename... Args>
55 requires(index != 0)
56 constexpr auto emplace_impl(Constexpr<index>, Args&&... args) -> decltype(auto) {
57 util::construct_at(util::addressof(m_rest));
58 return m_rest.emplace_impl(c_<index - 1>, util::forward<Args>(args)...);
59 }
60
61private:
66};
67
68template<typename T>
69class VariantImpl<T> {
70public:
71 constexpr VariantImpl() {}
72 constexpr VariantImpl(VariantImpl const&) = default;
73 constexpr VariantImpl(VariantImpl&&) = default;
74
75 constexpr auto operator=(VariantImpl const&) -> VariantImpl& = default;
76 constexpr auto operator=(VariantImpl&&) -> VariantImpl& = default;
77
78 ~VariantImpl() = default;
79
80 constexpr ~VariantImpl()
82 {}
83
84 template<concepts::RemoveCVRefSameAs<VariantImpl> Self>
85 constexpr static auto static_get(Constexpr<0ZU>, Self&& self) -> meta::Like<Self, T>&& {
86 return util::forward<Self>(self).m_value.value();
87 }
88
89 constexpr void destroy_impl(Constexpr<0ZU>) { util::destroy_at(util::addressof(m_value)); }
90
91 template<typename... Args>
92 constexpr auto emplace_impl(Constexpr<0ZU>, Args&&... args) -> T& {
93 util::construct_at(util::addressof(m_value), in_place, util::forward<Args>(args)...);
94 return m_value.value();
95 }
96
97private:
101};
102}
Definition rebindable_box.h:42
Definition variant_impl.h:12
VariantImpl< Rest... > m_rest
Definition variant_impl.h:64
static constexpr auto static_get(Constexpr< 0ZU >, Self &&self) -> meta::Like< Self, T > &&
Definition variant_impl.h:85
static constexpr auto static_get(Constexpr< 0ZU >, Self &&self) -> meta::Like< Self, T > &&
Definition variant_impl.h:31
constexpr void destroy_impl(Constexpr< 0ZU >)
Definition variant_impl.h:41
constexpr auto operator=(VariantImpl &&) -> VariantImpl &=default
constexpr VariantImpl(VariantImpl const &)=default
constexpr VariantImpl()
Definition variant_impl.h:71
constexpr auto operator=(VariantImpl const &) -> VariantImpl &=default
util::RebindableBox< T > m_value
Definition variant_impl.h:99
constexpr ~VariantImpl()
Definition variant_impl.h:26
constexpr auto emplace_impl(Constexpr< 0ZU >, Args &&... args) -> T &
Definition variant_impl.h:49
constexpr auto operator=(VariantImpl &&) -> VariantImpl &=default
constexpr auto operator=(VariantImpl const &) -> VariantImpl &=default
constexpr VariantImpl(VariantImpl &&)=default
util::RebindableBox< T > m_value
Definition variant_impl.h:63
constexpr auto emplace_impl(Constexpr< 0ZU >, Args &&... args) -> T &
Definition variant_impl.h:92
constexpr auto emplace_impl(Constexpr< index >, Args &&... args) -> decltype(auto)
Definition variant_impl.h:56
constexpr VariantImpl()
Definition variant_impl.h:17
constexpr VariantImpl(VariantImpl &&)=default
constexpr void destroy_impl(Constexpr< 0ZU >)
Definition variant_impl.h:89
constexpr VariantImpl(VariantImpl const &)=default
static constexpr auto static_get(Constexpr< index >, Self &&self) -> decltype(auto)
Definition variant_impl.h:37
constexpr void destroy_impl(Constexpr< index >)
Definition variant_impl.h:44
constexpr ~VariantImpl()
Definition variant_impl.h:80
Type< detail::LikeHelper< T, U > > Like
Definition language.h:468
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 c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto in_place
Definition in_place.h:8
A wrapper for a constexpr value.
Definition core.h:77