Iros
 
Loading...
Searching...
No Matches
visit.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/algorithm.h"
6#include "di/meta/constexpr.h"
12
13namespace di::vocab {
14namespace detail {
15 template<typename Idx, typename R, typename Vis, typename... Vars>
16 struct VisitHelper {};
17
18 template<size_t... indices, typename R, typename Vis, typename... Vars>
19 requires(requires {
20 {
23 })
24 struct VisitHelper<meta::List<Constexpr<indices>...>, R, Vis, Vars...> {
25 constexpr static auto call(Vis&& visitor, Vars&&... variants) -> R {
26 return function::invoke_r<R>(util::forward<Vis>(visitor),
27 util::get<indices>(util::forward<Vars>(variants))...);
28 }
29 };
30}
31
32template<typename R, typename Vis, concepts::VariantLike... Vars,
34requires(requires {
35 []<concepts::TypeList... Idx>(meta::List<Idx...>) {
36 return Array { (&detail::VisitHelper<Idx, R, Vis, Vars...>::call)... };
37 }(Indices {});
38})
39constexpr auto visit(Vis&& visitor, Vars&&... variants) -> R {
40 auto table = []<concepts::TypeList... Idx>(meta::List<Idx...>) {
41 return Array { (&detail::VisitHelper<Idx, R, Vis, Vars...>::call)... };
42 }(Indices {});
43
44 auto span = MDSpan { table.data(), Extents<size_t, meta::VariantSize<Vars>...> {} };
45
46#ifdef DI_GCC
47#pragma GCC diagnostic push
48#pragma GCC diagnostic ignored "-Warray-bounds"
49#endif
50 auto f = span(vocab::variant_index(variants)...);
51#ifdef DI_GCC
52#pragma GCC diagnostic pop
53#endif
54
55 return f(util::forward<Vis>(visitor), util::forward<Vars>(variants)...);
56}
57
58template<typename Vis, concepts::VariantLike... Vars,
60constexpr auto visit(Vis&& visitor, Vars&&... variants) -> decltype(auto)
61requires(requires { visit<R>(util::forward<Vis>(visitor), util::forward<Vars>(variants)...); })
62{
63 return visit<R>(util::forward<Vis>(visitor), util::forward<Vars>(variants)...);
64}
65}
66
67namespace di {
68using vocab::visit;
69}
Definition extents_forward_declaration.h:11
Definition mdspan.h:18
Implicit conversion for this test refers to the ability to return a value of function from a type.
Definition operations.h:89
Definition core.h:164
Definition variant_like.h:37
constexpr auto invoke
Definition invoke.h:100
constexpr auto invoke_r
Definition invoke.h:103
Type< detail::CartesianProductHelper< Types... > > CartesianProduct
Definition algorithm.h:253
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
Definition lazy.h:165
constexpr auto variant_index
Definition variant_index.h:27
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
Definition zstring_parser.h:9
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
@ R
Definition key.h:27
A wrapper for a constexpr value.
Definition core.h:77
Definition core.h:5
Definition span_fixed_size.h:37
Definition visit.h:16
static constexpr auto call(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:25