3#ifndef TETL_VARIANT_VISIT_HPP
4#define TETL_VARIANT_VISIT_HPP
25template <
typename... Ts>
26auto variant_access(variant<Ts...>
const* v) -> variant<Ts...>;
29using variant_access_t =
decltype(variant_access(
static_cast<decay_t<T>*
>(
nullptr)));
31template <
template <
typename...>
typename,
typename = void,
typename...>
34template <
template <
typename...>
typename D,
typename... Ts>
37template <
template <
typename...>
typename D,
typename... Ts>
38using is_detected =
typename is_detected_impl<D, void, Ts...>::type;
40template <
template <
typename...>
typename D,
typename... Ts>
41constexpr bool is_detected_v = is_detected<D, Ts...>::value;
44constexpr bool is_variant_v = is_detected_v<variant_access_t, T>;
52template <
size_t I,
size_t... Is>
60template <
size_t I,
size_t... Is,
size_t J,
size_t... Js>
63 if constexpr (I + 1 == J) {
71consteval auto variant_size() ->
size_t
73 if constexpr (is_variant_v<V>) {
80template <
size_t I,
typename T>
81constexpr auto get(T&& t) ->
decltype(
auto)
83 if constexpr (is_variant_v<T>) {
86 static_assert(I == 0);
92constexpr auto index(V
const& v) ->
size_t
94 if constexpr (is_variant_v<V>) {
101template <
typename T,
size_t I>
102struct indexed_value {
105 constexpr explicit indexed_value(T value)
106 : _value(etl::
forward<T>(value))
110 [[nodiscard]]
constexpr auto value() const& -> auto& {
return _value; }
112 [[nodiscard]]
constexpr auto value() && ->
auto&& {
return etl::forward<T>(_value); }
118template <
size_t... Is,
size_t... Ms,
typename F,
typename... Vs>
121 constexpr auto n = next_seq(i, m);
122 if constexpr (sum(n) == 0) {
125 if (etl::tuple(index(vs)...) == etl::tuple(Is...)) {
133inline constexpr size_t zero = 0;
148template <
typename F,
typename... Vs>
151 if constexpr (((detail::variant_size<Vs>() == 1) and ...)) {
152 return f(detail::indexed_value<
decltype(detail::get<0>(
etl::forward<Vs>(vs))), 0>(
156 return detail::visit_with_index(
176template <
typename F,
typename... Vs>
177constexpr auto visit(F&& f, Vs&&... vs)
constexpr auto move(InputIt first, InputIt last, OutputIt destination) -> OutputIt
Moves the elements in the range [first, last), to another range beginning at destination,...
Definition move.hpp:26
void void_t
Definition void_t.hpp:10
constexpr auto visit(F &&f, Vs &&... vs)
Applies the visitor vis (Callable that can be called with any combination of types from variants) to ...
Definition visit.hpp:177
constexpr auto visit_with_index(F &&f, Vs &&... vs)
Applies the visitor vis (Callable that can be called with any combination of types from variants) to ...
Definition visit.hpp:149
Definition adjacent_find.hpp:8
constexpr auto variant_size_v
Definition variant_size.hpp:25
typename etl::decay< T >::type decay_t
Definition decay.hpp:32
constexpr auto index_v
Definition index_constant.hpp:15
etl::integer_sequence< etl::size_t, Ints... > index_sequence
Definition index_sequence.hpp:12
constexpr auto unchecked_get(variant< Ts... > &v) -> auto &
bool_constant< true > true_type
Definition bool_constant.hpp:13
bool_constant< false > false_type
Definition bool_constant.hpp:14
constexpr auto forward(remove_reference_t< T > ¶m) noexcept -> T &&
Forwards lvalues as either lvalues or as rvalues, depending on T. When t is a forwarding reference (a...
Definition forward.hpp:18