YOrch 1.0.0
Loading...
Searching...
No Matches
traits.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <concepts> // IWYU pragma: keep
4#include <cstddef>
5#include <tuple>
6#include <type_traits>
7
8#include "../../slots/direct_out.hpp"
9
10namespace yorch::detail {
11
22template <typename T, typename = void>
24
31template <typename R, typename... Args>
32struct function_traits<R(Args...)> {
34 using result_type = R;
35
37 static constexpr std::size_t arity = sizeof...(Args);
38
40 template <std::size_t I>
41 using arg = std::tuple_element_t<I, std::tuple<Args...>>;
42};
43
44template <typename R, typename... Args>
45struct function_traits<R (*)(Args...)> : function_traits<R(Args...)> {};
46
47template <typename R, typename... Args>
49
50template <typename R, typename... Args>
51struct function_traits<R (&)(Args...)> : function_traits<R(Args...)> {};
52
53template <typename R, typename... Args>
55
56template <typename C, typename R, typename... Args>
57struct function_traits<R (C::*)(Args...)> : function_traits<R(Args...)> {};
58
59template <typename C, typename R, typename... Args>
60struct function_traits<R (C::*)(Args...) noexcept> : function_traits<R(Args...)> {};
61
62template <typename C, typename R, typename... Args>
63struct function_traits<R (C::*)(Args...) const> : function_traits<R(Args...)> {};
64
65template <typename C, typename R, typename... Args>
66struct function_traits<R (C::*)(Args...) const noexcept> : function_traits<R(Args...)> {};
67
68template <typename F>
70 F,
71 std::void_t<decltype(&std::remove_reference_t<F>::operator())>>
72 : function_traits<decltype(&std::remove_reference_t<F>::operator())> {};
73
74template <typename T>
76 : std::bool_constant<std::is_member_function_pointer_v<std::remove_cvref_t<T>>> {};
77
78template <typename T>
81
82template <typename T, typename = void>
84
85template <typename C, typename R, typename... Args>
86struct member_function_traits<R (C::*)(Args...)> {
87 using class_type = C;
89 using result_type = R;
90
91 static constexpr std::size_t arity = sizeof...(Args);
92
93 template <std::size_t I>
94 using arg = std::tuple_element_t<I, std::tuple<Args...>>;
95};
96
97template <typename C, typename R, typename... Args>
98struct member_function_traits<R (C::*)(Args...) noexcept>
99 : member_function_traits<R (C::*)(Args...)> {};
100
101template <typename C, typename R, typename... Args>
102struct member_function_traits<R (C::*)(Args...) const> {
103 using class_type = C;
104 using receiver_arg_type = const C&;
105 using result_type = R;
106
107 static constexpr std::size_t arity = sizeof...(Args);
108
109 template <std::size_t I>
110 using arg = std::tuple_element_t<I, std::tuple<Args...>>;
111};
112
113template <typename C, typename R, typename... Args>
115 : member_function_traits<R (C::*)(Args...) const> {};
116
117template <std::size_t I, typename F>
119
120template <typename F>
122
123template <typename F>
126
127template <typename F>
130
131template <typename F>
133 typename member_function_traits<std::remove_cvref_t<F>>::receiver_arg_type;
134
135template <typename F>
137 std::remove_reference_t<member_receiver_arg_t<F>>;
138
139template <std::size_t I, typename F>
142
143template <typename F>
144inline constexpr std::size_t last_arg_index_v =
146
147template <typename F>
150
151template <typename F>
152inline constexpr std::size_t member_last_arg_index_v =
154
155template <typename F>
158
159template <typename T>
160struct direct_out_arg : std::false_type {};
161
162template <typename T>
163struct direct_out_arg<direct_out<T>> : std::true_type {};
164
165template <typename T>
166inline constexpr bool direct_out_arg_v =
168
169template <typename T>
172
173template <typename T, typename = void>
175
176template <typename T>
178 using type = T;
179};
180
181template <typename T>
183
184template <typename F>
186 requires {
187 { function_traits<std::remove_cvref_t<F>>::arity } -> std::convertible_to<std::size_t>;
188 };
189
190template <typename F>
196
197template <typename F>
203
204template <typename F>
209
210template <typename F>
213
214template <typename F>
219
220template <typename F>
224
225template <typename F, typename... Specs>
228 function_traits<std::remove_cvref_t<F>>::arity == sizeof...(Specs);
229
230template <typename F, typename ReceiverSpec>
233
234template <typename F, typename... Specs>
237 member_function_traits<std::remove_cvref_t<F>>::arity == sizeof...(Specs);
238
239template <typename T, typename F, typename... Specs>
242 function_traits<std::remove_cvref_t<F>>::arity == sizeof...(Specs) + 1 &&
243 std::is_same_v<
244 std::remove_cvref_t<last_arg_t<std::remove_cvref_t<F>>>,
246
247template <typename T, typename F, typename... Specs>
250 member_function_traits<std::remove_cvref_t<F>>::arity == sizeof...(Specs) + 1 &&
251 std::is_same_v<
252 std::remove_cvref_t<member_last_arg_t<std::remove_cvref_t<F>>>,
254
255template <typename F, typename... Specs>
258 function_traits<std::remove_cvref_t<F>>::arity == sizeof...(Specs) + 1;
259
260template <typename F, typename... Specs>
263 function_traits<std::remove_cvref_t<F>>::arity == sizeof...(Specs);
264
265template <typename F, typename... Specs>
268 member_function_traits<std::remove_cvref_t<F>>::arity == sizeof...(Specs) + 1;
269
270} // namespace yorch::detail
typename member_function_traits< std::remove_cvref_t< F > >::template arg< I > member_nth_arg_t
Definition traits.hpp:141
typename function_traits< std::remove_cvref_t< F > >::template arg< I > nth_arg_t
Definition traits.hpp:118
typename member_function_traits< std::remove_cvref_t< F > >::result_type member_result_t
Definition traits.hpp:125
typename direct_out_payload< T >::type direct_out_payload_t
Definition traits.hpp:182
nth_arg_t< last_arg_index_v< F >, F > last_arg_t
Definition traits.hpp:149
constexpr std::size_t member_last_arg_index_v
Definition traits.hpp:152
constexpr bool is_member_function_pointer_callable_v
Definition traits.hpp:79
typename function_traits< std::remove_cvref_t< F > >::result_type result_t
Definition traits.hpp:121
typename member_function_traits< std::remove_cvref_t< F > >::receiver_arg_type member_receiver_arg_t
Definition traits.hpp:133
constexpr bool direct_out_arg_v
Definition traits.hpp:166
std::remove_reference_t< member_receiver_arg_t< F > > member_borrowed_receiver_t
Definition traits.hpp:137
constexpr std::size_t last_arg_index_v
Definition traits.hpp:144
typename member_function_traits< std::remove_cvref_t< F > >::class_type member_class_t
Definition traits.hpp:129
member_nth_arg_t< member_last_arg_index_v< F >, F > member_last_arg_t
Definition traits.hpp:157
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
constexpr auto value(T &&v) -> value_t< std::remove_cvref_t< T > >
Wraps a value as an owning spec.
Definition specs.hpp:179
std::tuple_element_t< I, std::tuple< Args... > > arg
Alias to the I-th parameter type.
Definition traits.hpp:41
Extracts the canonical function signature information of a callable.
Definition traits.hpp:23
std::tuple_element_t< I, std::tuple< Args... > > arg
Definition traits.hpp:110
std::tuple_element_t< I, std::tuple< Args... > > arg
Definition traits.hpp:94
Output sink passed to direct-output tasks.