Iros
 
Loading...
Searching...
No Matches
index_dispatch.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/algorithm.h"
6#include "di/meta/language.h"
7#include "di/types/prelude.h"
8#include "di/util/forward.h"
10
11namespace di::function {
12namespace detail {
13 template<typename R, usize index, typename F, typename... Args>
15 constexpr static auto do_call(F&& function, Args&&... args) -> R {
16 if constexpr (concepts::LanguageVoid<R>) {
17 function::invoke(di::forward<F>(function), c_<index>, di::forward<Args>(args)...);
18 } else {
19 return function::invoke(di::forward<F>(function), c_<index>, di::forward<Args>(args)...);
20 }
21 }
22 };
23
24 template<typename R, usize max_index>
26 template<typename F, typename... Args>
27 constexpr static auto operator()(usize index, F&& function, Args&&... args) -> R {
28 auto function_table = []<usize... indices>(meta::ListV<indices...>) {
29 return Array<R (*)(F&&, Args&&...), max_index> { (
30 IndexDispatchImpl<R, indices, F, Args...>::do_call)... };
32
33 DI_ASSERT(index < max_index);
34 return function_table[index](di::forward<F>(function), di::forward<Args>(args)...);
35 }
36 };
37}
38
39template<typename R, usize max_index>
40requires(max_index > 0)
42}
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition core.h:128
concept F
Definition zip_transform.h:12
Definition bind_back.h:16
Definition as_bool.h:8
constexpr auto invoke
Definition invoke.h:100
constexpr auto index_dispatch
Definition index_dispatch.h:41
MakeIntegerSequence< usize, count > MakeIndexSequence
Definition algorithm.h:285
size_t usize
Definition integers.h:33
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
@ R
Definition key.h:27
Definition index_dispatch.h:14
static constexpr auto do_call(F &&function, Args &&... args) -> R
Definition index_dispatch.h:15
Definition index_dispatch.h:25
static constexpr auto operator()(usize index, F &&function, Args &&... args) -> R
Definition index_dispatch.h:27
Definition core.h:8
Definition span_fixed_size.h:37