capydi
Loading...
Searching...
No Matches
Trait.hpp
Go to the documentation of this file.
1#ifndef FUNCTOR_CONCEPTS_HPP_
2#define FUNCTOR_CONCEPTS_HPP_
3
6
7#include <algorithm>
8
9namespace capy::meta
10{
11
17
19{
20 template<
21 template<typename...> typename Callable
22 >
23 struct MetaCallable{};
24
25 template<typename MetaFunctor_, typename... Args>
26 using functor_call_t = MetaFunctor_::template Functor<Args...>;
27
28 template<typename T, MetaCallableTag TAG>
29 concept tagged_with =
30 std::ranges::any_of(T::META_CALLABLE_TAGS, [](MetaCallableTag tag) {
31 return tag == TAG;
32 });
33
34 template<typename T, MetaArity ARITY>
35 concept of_arity
36 = requires {
37 T::META_CALLABLE_ARITIES;
38 }
39 && std::ranges::any_of(T::META_CALLABLE_ARITIES, [](MetaArity arity) {
40 return arity == ARITY;
41 });
42}
43
44template<typename T>
45concept MetaCallable = requires {
47 T::META_CALLABLE_TAGS;
48};
49
50template<
51 typename T,
52 MetaArity HEAD_ARITY,
53 MetaArity... TAIL_ARITIES
54>
55concept t_trait
60
61template<
62 typename T,
63 MetaArity HEAD_ARITY,
64 MetaArity... TAIL_ARITIES
65>
66concept v_trait
71
72template<typename MetaFunctor, typename... Args>
73 requires t_trait<MetaFunctor, meta_arity_from_args_v<Args...>>
74using call_t = typename implementation_details_::functor_call_t<MetaFunctor, Args...>::type;
75
76template<typename MetaFunctor, typename... Args>
77 requires v_trait<MetaFunctor, meta_arity_from_args_v<Args...>>
78constexpr auto call_v = implementation_details_::functor_call_t<MetaFunctor, Args...>::value;
79
80template<typename MetaFunctor, MetaArity ARITY>
83
84template<typename MetaFunctor, MetaArity ARITY>
87
88template<typename MetaFunctor>
91
92template<typename MetaFunctor>
95
96
97}
98
99#endif // !FUNCTOR_CONCEPTS_HPP_
Definition Trait.hpp:45
Definition Trait.hpp:56
Definition Trait.hpp:67
MetaFunctor_::template Functor< Args... > functor_call_t
Definition Trait.hpp:26
Definition Rebind.hpp:7
as_nary_ft< MetaFunctor, MetaArity::N1 > as_unary_ft
Definition Trait.hpp:90
fix_template_arity_ft< ARITY, MetaFunctor::template Functor > as_nary_ft
Definition Trait.hpp:82
as_nary_fv< MetaFunctor, MetaArity::N1 > as_unary_fv
Definition Trait.hpp:94
typename implementation_details_::FixTemplateArityValued< ARITY, Template > fix_template_arity_fv
Definition FixTemplateMetaArity.hpp:87
typename implementation_details_::functor_call_t< MetaFunctor, Args... >::type call_t
Definition Trait.hpp:74
typename implementation_details_::FixTemplateArityTyped< ARITY, Template > fix_template_arity_ft
Definition FixTemplateMetaArity.hpp:81
constexpr auto call_v
Definition Trait.hpp:78
MetaArity
Definition MetaArity.hpp:11
constexpr MetaArity meta_arity_from_args_v
Definition MetaArity.hpp:52
fix_template_arity_fv< ARITY, MetaFunctor::template Functor > as_nary_fv
Definition Trait.hpp:86
MetaCallableTag
Definition Trait.hpp:13
@ VALUE_CALLABLE
Definition Trait.hpp:15
@ TYPE_CALLABLE
Definition Trait.hpp:14