9namespace di::vocab::detail {
10template<
typename... Types>
11requires(
sizeof...(Types) > 0)
14template<
typename T,
typename... Rest>
15class VariantImpl<T, Rest...> {
17 constexpr VariantImpl() {}
18 constexpr VariantImpl(VariantImpl
const&) =
default;
19 constexpr VariantImpl(VariantImpl&&) =
default;
21 constexpr auto operator=(VariantImpl
const&) -> VariantImpl& =
default;
22 constexpr auto operator=(VariantImpl&&) -> VariantImpl& =
default;
24 ~VariantImpl() =
default;
26 constexpr ~VariantImpl()
27 requires(!concepts::TriviallyDestructible<T> || (!concepts::TriviallyDestructible<Rest> || ...))
30 template<concepts::RemoveCVRefSameAs<VariantImpl> Self>
32 return util::forward<Self>(self).m_value.value();
35 template<concepts::RemoveCVRefSameAs<VariantImpl> Self,
size_t index>
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);
41 constexpr void destroy_impl(Constexpr<0ZU>) {
util::destroy_at(util::addressof(m_value)); }
43 template<
size_t index>
44 constexpr void destroy_impl(Constexpr<index>) {
48 template<
typename... Args>
49 constexpr auto emplace_impl(Constexpr<0ZU>, Args&&... args) -> T& {
51 return m_value.value();
54 template<
size_t index,
typename... Args>
56 constexpr auto emplace_impl(Constexpr<index>, Args&&... args) ->
decltype(
auto) {
58 return m_rest.emplace_impl(
c_<index - 1>, util::forward<Args>(args)...);
64 VariantImpl<Rest...> m_rest;
71 constexpr VariantImpl() {}
72 constexpr VariantImpl(VariantImpl
const&) =
default;
73 constexpr VariantImpl(VariantImpl&&) =
default;
75 constexpr auto operator=(VariantImpl
const&) -> VariantImpl& =
default;
76 constexpr auto operator=(VariantImpl&&) -> VariantImpl& =
default;
78 ~VariantImpl() =
default;
80 constexpr ~VariantImpl()
81 requires(!concepts::TriviallyDestructible<T>)
84 template<concepts::RemoveCVRefSameAs<VariantImpl> Self>
86 return util::forward<Self>(self).m_value.value();
89 constexpr void destroy_impl(Constexpr<0ZU>) {
util::destroy_at(util::addressof(m_value)); }
91 template<
typename... Args>
92 constexpr auto emplace_impl(Constexpr<0ZU>, Args&&... args) -> T& {
94 return m_value.value();
RebindableBox(T &&) -> RebindableBox< meta::UnwrapRefDecay< T > >
constexpr auto destroy_at
Definition destroy_at.h:24
constexpr auto construct_at
Definition construct_at.h:27
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto in_place
Definition in_place.h:8