24 template<
typename T,
typename U,
typename A = T[1]>
28template<
typename... Types>
29requires(
sizeof...(Types) > 0)
44 template<
typename U,
typename T>
46 auto operator()(T)
const -> T
51 struct Selector : SelectorImpl<U, Types>... {
52 using SelectorImpl<U, Types>::operator()...;
58 requires(trivially_copy_constructible)
61 requires(trivially_move_constructible)
64 requires(trivially_destructible)
76 requires(copyable && !trivially_copy_constructible)
87 requires(movable && !trivially_move_constructible)
94 *
this, util::move(other));
107 do_emplace(
c_<index>, util::forward<Args>(args)...);
113 do_emplace(
c_<index>, list, util::forward<Args>(args)...);
116 template<
typename T,
typename... Args,
auto index = meta::Lookup<T, List>>
119 do_emplace(
c_<index>, util::forward<Args>(args)...);
122 template<
typename T,
typename U,
typename... Args,
auto index = meta::Lookup<T, List>>
125 do_emplace(
c_<index>, list, util::forward<Args>(args)...);
128 template<
typename... Other>
129 requires(
sizeof...(Types) ==
sizeof...(Other) &&
133 do_emplace(c_<index>, util::get<index>(other));
137 template<
typename... Other>
138 requires(
sizeof...(Types) ==
sizeof...(Other) &&
142 do_emplace(c_<index>, util::get<index>(util::move(other)));
151 do_emplace(c_<index>, util::get<index>(other));
159 do_emplace(c_<index>, util::get<index>(util::move(other)));
168 constexpr auto operator=(U&& value) ->
Variant& {
173 constexpr auto index() const ->
size_t {
return m_index; }
177 constexpr auto emplace(Args&&... args) -> T& {
179 return do_emplace(
c_<index>, util::forward<Args>(args)...);
184 constexpr auto emplace(std::initializer_list<U> list, Args&&... args) -> T& {
186 return do_emplace(
c_<index>, list, util::forward<Args>(args)...);
189 template<
typename T,
typename... Args,
auto index = meta::Lookup<T, List>>
191 constexpr auto emplace(Args&&... args) -> T& {
193 return do_emplace(
c_<index>, util::forward<Args>(args)...);
196 template<
typename T,
typename U,
typename... Args,
auto index = meta::Lookup<T, List>>
198 constexpr auto emplace(std::initializer_list<U> list, Args&&... args) -> T& {
200 return do_emplace(
c_<index>, list, util::forward<Args>(args)...);
204 template<
typename... Other>
205 requires(
sizeof...(Types) ==
sizeof...(Other) &&
212 return util::get<index>(a) == util::get<index>(b);
216 template<
typename... Other>
217 requires(
sizeof...(Types) ==
sizeof...(Other) &&
221 if (
auto result = a.
index() <=> b.
index(); result != 0) {
226 return util::get<index>(a) <=> util::get<index>(b);
230 template<
size_t index, concepts::DerivedFrom<Variant> Self = Variant>
236 template<
size_t index, concepts::DerivedFrom<Variant> Self = Variant>
243 template<concepts::DerivedFrom<Variant> Self = Variant>
248 template<
size_t index,
typename Self = Variant>
253 return Impl::static_get(
c_<index>, util::forward<Self>(self).m_impl);
256 template<
typename T,
typename Self = Variant>
260 constexpr auto index = meta::Lookup<T, List>;
262 return Impl::static_get(
c_<index>, util::forward<Self>(self).m_impl);
265 template<concepts::DerivedFrom<Variant> Self = Variant>
271 requires(trivially_destructible)
283 template<
size_t index,
typename... Args>
284 constexpr auto do_emplace(Constexpr<index>, Args&&... args) ->
decltype(
auto) {
286 return m_impl.emplace_impl(
c_<index>, util::forward<Args>(args)...);
289 template<
size_t index,
typename U,
typename... Args>
290 constexpr auto do_emplace(Constexpr<index>, std::initializer_list<U> list, Args&&... args) ->
decltype(
auto) {
292 return m_impl.emplace_impl(
c_<index>, list, util::forward<Args>(args)...);
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition variant_forward_declaration.h:6
constexpr friend auto tag_invoke(types::Tag< util::get_in_place >, Constexpr< index >, Self &&self) -> meta::Like< Self, meta::At< List, index > > &&
Definition variant.h:250
constexpr Variant(U &&value)
Definition variant.h:101
constexpr Variant(Variant const &other)
Definition variant.h:75
auto operator=(Variant &&) -> Variant &requires(trivially_move_assignable)=default
constexpr friend auto tag_invoke(types::Tag< variant_alternative >, InPlaceType< Self >, Constexpr< index >) -> meta::At< List, index >
Definition variant.h:231
constexpr Variant(Constexpr< index >, Args &&... args)
Definition variant.h:106
constexpr ~Variant()
Definition variant.h:146
constexpr friend auto tag_invoke(types::Tag< util::get_in_place >, InPlaceType< T >, Self &&self) -> meta::Like< Self, T > &&
Definition variant.h:258
constexpr auto operator=(Variant &&other) -> Variant &requires(!trivially_move_assignable &&movable)
Definition variant.h:156
constexpr Variant()
Definition variant.h:69
constexpr auto emplace(std::initializer_list< U > list, Args &&... args) -> T &
Definition variant.h:198
constexpr friend auto tag_invoke(types::Tag< variant_types >, InPlaceType< Self >) -> List
Definition variant.h:266
Variant(Variant &&)=default
constexpr Variant(Constexpr< index >, std::initializer_list< U > list, Args &&... args)
Definition variant.h:112
constexpr auto emplace(Args &&... args) -> T &
Definition variant.h:177
constexpr Variant(InPlaceType< T >, std::initializer_list< U > list, Args &&... args)
Definition variant.h:124
constexpr friend auto tag_invoke(types::Tag< variant_size >, InPlaceType< Self >) -> size_t
Definition variant.h:244
constexpr auto emplace(std::initializer_list< U > list, Args &&... args) -> T &
Definition variant.h:184
constexpr friend auto tag_invoke(types::Tag< variant_alternative >, InPlaceType< Self const >, Constexpr< index >) -> meta::At< List, index > const
Definition variant.h:238
constexpr Variant(InPlaceType< T >, Args &&... args)
Definition variant.h:118
Variant(Variant const &)=default
constexpr friend auto operator<=>(Variant const &a, Variant< Other... > const &b)
Definition variant.h:219
auto operator=(Variant const &) -> Variant &requires(trivially_copy_assignable)=default
constexpr Variant(Variant &&other)
Definition variant.h:86
constexpr auto emplace(Args &&... args) -> T &
Definition variant.h:191
constexpr auto operator=(Variant const &other) -> Variant &requires(!trivially_copy_assignable &©able)
Definition variant.h:148
constexpr auto index() const -> size_t
Definition variant.h:173
Definition variant_impl.h:12
Checks if T is a Constexpr instance.
Definition constexpr.h:270
Definition operations.h:11
Definition operations.h:99
Definition operations.h:34
Definition operations.h:24
Definition operations.h:114
Definition operations.h:43
constexpr auto index_dispatch
Definition index_dispatch.h:41
decltype(detail::smallest_unsigned_type_helper(c_< size >)) SmallestUnsignedType
Definition smallest_unsigned_type.h:27
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition erasure_cast.h:7
Expected< T, Error > Result
Definition result.h:8
constexpr auto destroy
Definition destroy.h:35
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto in_place_type
Definition in_place_type.h:12
Definition in_place_type.h:5