Iros
 
Loading...
Searching...
No Matches
dispatcher.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/meta/algorithm.h"
7#include "di/meta/constexpr.h"
8#include "di/meta/util.h"
10
11namespace di::any {
12namespace detail {
13 template<typename Tag, typename Sig, typename... Tags>
15
16 template<typename Tag, typename R, concepts::DecaysTo<This> Self, typename... Args, typename... Tags>
17 struct DispatcherImpl<Tag, R(Self, Args...), Tags...> {
18 using Type = Method<Tag, R(Self, Args...)>;
19
20 template<typename T, typename F>
22
23 template<typename T>
24 struct Invocable {
25 template<typename F>
27 };
28
29 template<typename T>
32 constexpr auto operator()(T&& self, Args... args) const -> R {
34 auto const tag = Tag {};
35 return function::tag_invoke(tag, util::forward_like<Self>(self), util::forward<Args>(args)...);
36 } else {
37 using Matching = meta::Filter<meta::List<Tags...>, Invocable<T>>;
38 using Choice = meta::Front<Matching>;
39 auto const tag = Choice {};
40 return function::invoke_r<R>(tag, util::forward_like<Self>(self), util::forward<Args>(args)...);
41 }
42 }
43 };
44}
45
46template<typename Self, concepts::LanguageFunction Sig, typename... Tags>
47using Dispatcher = detail::DispatcherImpl<Self, Sig, Tags...>;
48}
49
50namespace di {
51using any::Dispatcher;
52}
Definition invoke.h:69
Definition language.h:64
Definition tag_invoke.h:45
Definition any.h:19
Definition any.h:18
detail::DispatcherImpl< Self, Sig, Tags... > Dispatcher
Definition dispatcher.h:47
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto invoke_r
Definition invoke.h:103
Fold< List, meta::List<>, detail::FilterReducer< Pred > > Filter
Definition algorithm.h:152
T::Front Front
Definition list.h:100
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto forward_like(U &&value) -> decltype(auto)
Definition forward_like.h:8
Definition zstring_parser.h:9
Definition dispatcher.h:14
Constexpr< is_invocable< T, F > > Invoke
Definition dispatcher.h:26
Method< Tag, R(Self, Args...)> Type
Definition dispatcher.h:18
static constexpr bool is_invocable
Definition dispatcher.h:21
constexpr auto operator()(T &&self, Args... args) const -> R
Definition dispatcher.h:32
A wrapper for a constexpr value.
Definition core.h:77
Definition core.h:5
Definition method.h:7