MU Library
call_main_template.hpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
2 // Copyright 2024 XCENA Inc.
3 
4 #pragma once
5 
6 #include <type_traits>
7 
8 #include "mu/access.hpp"
9 
10 namespace mu
11 {
12 template <typename T>
13 class NDArray;
14 
15 template <typename Function>
17 
18 template <typename R>
19 struct function_traits_helper<R (*)(void)>
20 {
21  static constexpr unsigned arity = 0;
22  typedef R result_type;
23 };
24 
25 template <typename R, typename T1>
26 struct function_traits_helper<R (*)(T1)>
27 {
28  static constexpr unsigned arity = 1;
29  typedef R result_type;
30  typedef T1 arg1_type;
31  typedef T1 argument_type;
32 };
33 
34 template <typename R, typename T1, typename T2>
35 struct function_traits_helper<R (*)(T1, T2)>
36 {
37  static constexpr unsigned arity = 2;
38  typedef R result_type;
39  typedef T1 arg1_type;
40  typedef T2 arg2_type;
41  typedef T1 first_argument_type;
43 };
44 
45 template <typename R, typename T1, typename T2, typename T3>
46 struct function_traits_helper<R (*)(T1, T2, T3)>
47 {
48  static constexpr unsigned arity = 3;
49  typedef R result_type;
50  typedef T1 arg1_type;
51  typedef T2 arg2_type;
52  typedef T3 arg3_type;
53 };
54 
55 template <typename R, typename T1, typename T2, typename T3, typename T4>
56 struct function_traits_helper<R (*)(T1, T2, T3, T4)>
57 {
58  static constexpr unsigned arity = 4;
59  typedef R result_type;
60  typedef T1 arg1_type;
61  typedef T2 arg2_type;
62  typedef T3 arg3_type;
63  typedef T4 arg4_type;
64 };
65 
66 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
67 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5)>
68 {
69  static constexpr unsigned arity = 5;
70  typedef R result_type;
71  typedef T1 arg1_type;
72  typedef T2 arg2_type;
73  typedef T3 arg3_type;
74  typedef T4 arg4_type;
75  typedef T5 arg5_type;
76 };
77 
78 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
79 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6)>
80 {
81  static constexpr unsigned arity = 6;
82  typedef R result_type;
83  typedef T1 arg1_type;
84  typedef T2 arg2_type;
85  typedef T3 arg3_type;
86  typedef T4 arg4_type;
87  typedef T5 arg5_type;
88  typedef T6 arg6_type;
89 };
90 
91 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
92 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7)>
93 {
94  static constexpr unsigned arity = 7;
95  typedef R result_type;
96  typedef T1 arg1_type;
97  typedef T2 arg2_type;
98  typedef T3 arg3_type;
99  typedef T4 arg4_type;
100  typedef T5 arg5_type;
101  typedef T6 arg6_type;
102  typedef T7 arg7_type;
103 };
104 
105 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
106 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8)>
107 {
108  static constexpr unsigned arity = 8;
109  typedef R result_type;
110  typedef T1 arg1_type;
111  typedef T2 arg2_type;
112  typedef T3 arg3_type;
113  typedef T4 arg4_type;
114  typedef T5 arg5_type;
115  typedef T6 arg6_type;
116  typedef T7 arg7_type;
117  typedef T8 arg8_type;
118 };
119 
120 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
121 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9)>
122 {
123  static constexpr unsigned arity = 9;
124  typedef R result_type;
125  typedef T1 arg1_type;
126  typedef T2 arg2_type;
127  typedef T3 arg3_type;
128  typedef T4 arg4_type;
129  typedef T5 arg5_type;
130  typedef T6 arg6_type;
131  typedef T7 arg7_type;
132  typedef T8 arg8_type;
133  typedef T9 arg9_type;
134 };
135 
136 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
137 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
138 {
139  static constexpr unsigned arity = 10;
140  typedef R result_type;
141  typedef T1 arg1_type;
142  typedef T2 arg2_type;
143  typedef T3 arg3_type;
144  typedef T4 arg4_type;
145  typedef T5 arg5_type;
146  typedef T6 arg6_type;
147  typedef T7 arg7_type;
148  typedef T8 arg8_type;
149  typedef T9 arg9_type;
150  typedef T10 arg10_type;
151 };
152 
153 template <typename>
155 
156 template <typename R, typename T>
158 {
159 public:
160  using member_type = R;
161  using class_type = T;
162 };
163 
164 template <class T>
166 {
167  static constexpr bool value = false;
168 };
169 template <class T>
170 struct is_reference<T&>
171 {
172  static constexpr bool value = true;
173 };
174 template <class T>
175 struct is_reference<T&&>
176 {
177  static constexpr bool value = true;
178 };
179 
180 template <typename T>
182 {
183  typedef T* type;
184 };
185 
186 template <class T>
188 {
189  typedef T type;
190 };
191 template <class T>
193 {
194  typedef T type;
195 };
196 template <class T>
197 struct remove_reference<T&&>
198 {
199  typedef T type;
200 };
201 
202 template <class T>
204 {
205  static constexpr bool value = false;
206 };
207 
208 template <class T>
209 struct is_pointer<T*>
210 {
211  static constexpr bool value = true;
212 };
213 template <class T>
214 struct is_pointer<T* const>
215 {
216  static constexpr bool value = true;
217 };
218 template <class T>
219 struct is_pointer<T* volatile>
220 {
221  static constexpr bool value = true;
222 };
223 template <class T>
224 struct is_pointer<T* const volatile>
225 {
226  static constexpr bool value = true;
227 };
228 
229 template <class T>
231 {
232  typedef T type;
233 };
234 template <class T>
235 struct remove_pointer<T*>
236 {
237  typedef T type;
238 };
239 template <class T>
240 struct remove_pointer<T* const>
241 {
242  typedef T type;
243 };
244 template <class T>
245 struct remove_pointer<T* volatile>
246 {
247  typedef T type;
248 };
249 template <class T>
250 struct remove_pointer<T* const volatile>
251 {
252  typedef T type;
253 };
254 
255 template <typename T>
257 {
258 };
259 
260 template <typename T>
262 {
263 };
264 
265 template <typename T>
267 
268 namespace detail
269 {
270 
271 template <typename T>
273 {
274 };
275 
276 template <typename T>
278 {
279  using wire_type = const T*;
280 
281  static mu::input_ptr<T> fromWire(const T* value)
282  {
283  return mu::input_ptr<T>(value);
284  }
285 };
286 
287 template <typename T>
289 {
290  using wire_type = T*;
291 
292  static mu::output_ptr<T> fromWire(T* value)
293  {
294  return mu::output_ptr<T>(value);
295  }
296 };
297 
298 template <typename T>
301 
302 template <typename T>
303 inline constexpr bool supported_directional_parameter_v =
304  !directional_pointer_traits<T>::value || !std::is_reference_v<T>;
305 
306 } // namespace detail
307 
308 } // namespace mu
NDArray is a class that can be used in both host and device code. NDArray is automatically divided in...
Definition: ndarray.hpp:23
Pointer to a kernel input buffer.
Definition: access.hpp:43
Pointer to a kernel output buffer.
Definition: access.hpp:98
bool_type< false > false_type
Definition: half.hpp:516
bool_type< true > true_type
Definition: half.hpp:515
constexpr bool supported_directional_parameter_v
Definition: access.hpp:10
constexpr bool is_ndarray_v
static constexpr bool value
static constexpr bool value