24 template<
typename T,
typename U,
typename A = T[1]>
28template<
typename... Types>
29requires(
sizeof...(Types) > 0)
32 using Impl = detail::VariantImpl<Types...>;
44 template<
typename U,
typename T>
46 auto operator()(T)
const -> T
47 requires(detail::VariantValidOverload<T, U>);
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)
67 requires(trivially_copy_assignable)
70 requires(trivially_move_assignable)
80 requires(copyable && !trivially_copy_constructible)
91 requires(movable && !trivially_move_constructible)
98 *
this, util::move(other));
111 do_emplace(
c_<index>, util::forward<Args>(args)...);
117 do_emplace(
c_<index>, list, util::forward<Args>(args)...);
120 template<
typename T,
typename... Args,
auto index = meta::Lookup<T, List>>
123 do_emplace(
c_<index>, util::forward<Args>(args)...);
126 template<
typename T,
typename U,
typename... Args,
auto index = meta::Lookup<T, List>>
129 do_emplace(
c_<index>, list, util::forward<Args>(args)...);
132 template<
typename... Other>
133 requires(
sizeof...(Types) ==
sizeof...(Other) &&
137 do_emplace(c_<index>, util::get<index>(other));
141 template<
typename... Other>
142 requires(
sizeof...(Types) ==
sizeof...(Other) &&
146 do_emplace(c_<index>, util::get<index>(util::move(other)));
153 requires(!trivially_copy_assignable && copyable)
157 do_emplace(c_<index>, util::get<index>(other));
163 requires(!trivially_move_assignable && movable)
167 do_emplace(c_<index>, util::get<index>(util::move(other)));
176 constexpr auto operator=(U&& value) ->
Variant& {
181 constexpr auto index() const ->
size_t {
return m_index; }
185 constexpr auto emplace(Args&&... args) -> T& {
187 return do_emplace(
c_<index>, util::forward<Args>(args)...);
192 constexpr auto emplace(std::initializer_list<U> list, Args&&... args) -> T& {
194 return do_emplace(
c_<index>, list, util::forward<Args>(args)...);
197 template<
typename T,
typename... Args,
auto index = meta::Lookup<T, List>>
199 constexpr auto emplace(Args&&... args) -> T& {
201 return do_emplace(
c_<index>, util::forward<Args>(args)...);
204 template<
typename T,
typename U,
typename... Args,
auto index = meta::Lookup<T, List>>
206 constexpr auto emplace(std::initializer_list<U> list, Args&&... args) -> T& {
208 return do_emplace(
c_<index>, list, util::forward<Args>(args)...);
212 template<
typename... Other>
213 requires(
sizeof...(Types) ==
sizeof...(Other) &&
220 return util::get<index>(a) == util::get<index>(b);
224 template<
typename... Other>
225 requires(
sizeof...(Types) ==
sizeof...(Other) &&
229 if (
auto result = a.
index() <=> b.
index(); result != 0) {
234 return util::get<index>(a) <=> util::get<index>(b);
238 template<
size_t index, concepts::DerivedFrom<Variant> Self = Variant>
244 template<
size_t index, concepts::DerivedFrom<Variant> Self = Variant>
251 template<concepts::DerivedFrom<Variant> Self = Variant>
256 template<
size_t index,
typename Self = Variant>
261 return Impl::static_get(
c_<index>, util::forward<Self>(self).m_impl);
264 template<
typename T,
typename Self = Variant>
268 constexpr auto index = meta::Lookup<T, List>;
270 return Impl::static_get(
c_<index>, util::forward<Self>(self).m_impl);
273 template<concepts::DerivedFrom<Variant> Self = Variant>
279 requires(trivially_destructible)
291 template<
size_t index,
typename... Args>
292 constexpr auto do_emplace(Constexpr<index>, Args&&... args) ->
decltype(
auto) {
294 return m_impl.emplace_impl(
c_<index>, util::forward<Args>(args)...);
297 template<
size_t index,
typename U,
typename... Args>
298 constexpr auto do_emplace(Constexpr<index>, std::initializer_list<U> list, Args&&... args) ->
decltype(
auto) {
300 return m_impl.emplace_impl(
c_<index>, list, util::forward<Args>(args)...);
#define DI_ASSERT(...)
Definition assert_bool.h:7
Variant(Variant const &)=default
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:258
constexpr Variant(U &&value)
Definition variant.h:105
constexpr Variant(Variant const &other)
Definition variant.h:79
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:239
constexpr Variant(Constexpr< index >, Args &&... args)
Definition variant.h:110
constexpr ~Variant()
Definition variant.h:150
constexpr friend auto tag_invoke(types::Tag< util::get_in_place >, InPlaceType< T >, Self &&self) -> meta::Like< Self, T > &&
Definition variant.h:266
constexpr auto operator=(Variant &&other) -> Variant &requires(!trivially_move_assignable &&movable)
Definition variant.h:162
constexpr Variant()
Definition variant.h:73
constexpr auto emplace(std::initializer_list< U > list, Args &&... args) -> T &
Definition variant.h:206
constexpr friend auto tag_invoke(types::Tag< variant_types >, InPlaceType< Self >) -> List
Definition variant.h:274
Variant(Variant &&)=default
constexpr Variant(Constexpr< index >, std::initializer_list< U > list, Args &&... args)
Definition variant.h:116
constexpr auto emplace(Args &&... args) -> T &
Definition variant.h:185
constexpr Variant(InPlaceType< T >, std::initializer_list< U > list, Args &&... args)
Definition variant.h:128
constexpr friend auto tag_invoke(types::Tag< variant_size >, InPlaceType< Self >) -> size_t
Definition variant.h:252
constexpr auto emplace(std::initializer_list< U > list, Args &&... args) -> T &
Definition variant.h:192
constexpr friend auto tag_invoke(types::Tag< variant_alternative >, InPlaceType< Self const >, Constexpr< index >) -> meta::At< List, index > const
Definition variant.h:246
constexpr Variant(InPlaceType< T >, Args &&... args)
Definition variant.h:122
Variant(Variant const &)=default
constexpr friend auto operator<=>(Variant const &a, Variant< Other... > const &b)
Definition variant.h:227
auto operator=(Variant const &) -> Variant &requires(trivially_copy_assignable)=default
constexpr Variant(Variant &&other)
Definition variant.h:90
constexpr auto emplace(Args &&... args) -> T &
Definition variant.h:199
constexpr auto operator=(Variant const &other) -> Variant &requires(!trivially_copy_assignable &©able)
Definition variant.h:152
constexpr auto index() const -> size_t
Definition variant.h:181
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
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