Iros
 
Loading...
Searching...
No Matches
variant_like.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/algorithm.h"
4#include "di/meta/core.h"
5#include "di/util/as_const.h"
6#include "di/util/forward.h"
7#include "di/util/get.h"
8#include "di/util/move.h"
13
14namespace di::concepts {
15namespace detail {
16 template<typename T, typename Indices>
18
19 template<typename T, size_t index>
21
22 template<typename T, size_t index>
23 concept HasVariantGet = requires(T variant) {
24 util::get<index>(variant);
25 util::get<index>(util::as_const(variant));
26 util::get<index>(util::move(variant));
27 util::get<index>(util::move(util::as_const(variant)));
28 };
29
30 template<typename T, size_t... indices>
31 struct VariantLikeHelper<T, meta::ListV<indices...>> {
33 };
34}
35
36template<typename T>
37concept VariantLike = requires {
38 typename meta::VariantTypes<T>;
40} && requires(T const& variant) {
41 { vocab::variant_index(variant) } -> SameAs<size_t>;
42} && detail::VariantLikeHelper<T, meta::MakeIndexSequence<meta::VariantSize<T>>>::value;
43}
Definition variant_like.h:37
Definition variant_like.h:20
Definition variant_like.h:23
Definition impl.h:7
Definition any_storable.h:9
Definition merge_interfaces.h:6
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
decltype(vocab::variant_types(in_place_type< meta::RemoveCVRef< T > >)) VariantTypes
Definition variant_types.h:24
decltype(vocab::variant_alternative(in_place_type< meta::RemoveReference< T > >, c_< index >)) VariantAlternative
Definition variant_alternative.h:25
constexpr auto in_place_type
Definition in_place_type.h:12
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto variant_index
Definition variant_index.h:27
constexpr auto variant_size
Definition variant_size.h:18
Definition variant_like.h:17
static constexpr bool value
Definition variant_like.h:32