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 namespace mu
9 {
10 template <typename T>
11 class NDArray;
12 
13 template <typename Function>
15 
16 template <typename R>
17 struct function_traits_helper<R (*)(void)>
18 {
19  static constexpr unsigned arity = 0;
20  typedef R result_type;
21 };
22 
23 template <typename R, typename T1>
24 struct function_traits_helper<R (*)(T1)>
25 {
26  static constexpr unsigned arity = 1;
27  typedef R result_type;
28  typedef T1 arg1_type;
29  typedef T1 argument_type;
30 };
31 
32 template <typename R, typename T1, typename T2>
33 struct function_traits_helper<R (*)(T1, T2)>
34 {
35  static constexpr unsigned arity = 2;
36  typedef R result_type;
37  typedef T1 arg1_type;
38  typedef T2 arg2_type;
39  typedef T1 first_argument_type;
41 };
42 
43 template <typename R, typename T1, typename T2, typename T3>
44 struct function_traits_helper<R (*)(T1, T2, T3)>
45 {
46  static constexpr unsigned arity = 3;
47  typedef R result_type;
48  typedef T1 arg1_type;
49  typedef T2 arg2_type;
50  typedef T3 arg3_type;
51 };
52 
53 template <typename R, typename T1, typename T2, typename T3, typename T4>
54 struct function_traits_helper<R (*)(T1, T2, T3, T4)>
55 {
56  static constexpr unsigned arity = 4;
57  typedef R result_type;
58  typedef T1 arg1_type;
59  typedef T2 arg2_type;
60  typedef T3 arg3_type;
61  typedef T4 arg4_type;
62 };
63 
64 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
65 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5)>
66 {
67  static constexpr unsigned arity = 5;
68  typedef R result_type;
69  typedef T1 arg1_type;
70  typedef T2 arg2_type;
71  typedef T3 arg3_type;
72  typedef T4 arg4_type;
73  typedef T5 arg5_type;
74 };
75 
76 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
77 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6)>
78 {
79  static constexpr unsigned arity = 6;
80  typedef R result_type;
81  typedef T1 arg1_type;
82  typedef T2 arg2_type;
83  typedef T3 arg3_type;
84  typedef T4 arg4_type;
85  typedef T5 arg5_type;
86  typedef T6 arg6_type;
87 };
88 
89 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
90 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7)>
91 {
92  static constexpr unsigned arity = 7;
93  typedef R result_type;
94  typedef T1 arg1_type;
95  typedef T2 arg2_type;
96  typedef T3 arg3_type;
97  typedef T4 arg4_type;
98  typedef T5 arg5_type;
99  typedef T6 arg6_type;
100  typedef T7 arg7_type;
101 };
102 
103 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
104 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8)>
105 {
106  static constexpr unsigned arity = 8;
107  typedef R result_type;
108  typedef T1 arg1_type;
109  typedef T2 arg2_type;
110  typedef T3 arg3_type;
111  typedef T4 arg4_type;
112  typedef T5 arg5_type;
113  typedef T6 arg6_type;
114  typedef T7 arg7_type;
115  typedef T8 arg8_type;
116 };
117 
118 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
119 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9)>
120 {
121  static constexpr unsigned arity = 9;
122  typedef R result_type;
123  typedef T1 arg1_type;
124  typedef T2 arg2_type;
125  typedef T3 arg3_type;
126  typedef T4 arg4_type;
127  typedef T5 arg5_type;
128  typedef T6 arg6_type;
129  typedef T7 arg7_type;
130  typedef T8 arg8_type;
131  typedef T9 arg9_type;
132 };
133 
134 template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
135 struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
136 {
137  static constexpr unsigned arity = 10;
138  typedef R result_type;
139  typedef T1 arg1_type;
140  typedef T2 arg2_type;
141  typedef T3 arg3_type;
142  typedef T4 arg4_type;
143  typedef T5 arg5_type;
144  typedef T6 arg6_type;
145  typedef T7 arg7_type;
146  typedef T8 arg8_type;
147  typedef T9 arg9_type;
148  typedef T10 arg10_type;
149 };
150 
151 template <typename>
153 
154 template <typename R, typename T>
156 {
157 public:
158  using member_type = R;
159  using class_type = T;
160 };
161 
162 template <class T>
164 {
165  static constexpr bool value = false;
166 };
167 template <class T>
168 struct is_reference<T&>
169 {
170  static constexpr bool value = true;
171 };
172 template <class T>
173 struct is_reference<T&&>
174 {
175  static constexpr bool value = true;
176 };
177 
178 template <typename T>
180 {
181  typedef T* type;
182 };
183 
184 template <class T>
186 {
187  typedef T type;
188 };
189 template <class T>
191 {
192  typedef T type;
193 };
194 template <class T>
195 struct remove_reference<T&&>
196 {
197  typedef T type;
198 };
199 
200 template <class T>
202 {
203  static constexpr bool value = false;
204 };
205 
206 template <class T>
207 struct is_pointer<T*>
208 {
209  static constexpr bool value = true;
210 };
211 template <class T>
212 struct is_pointer<T* const>
213 {
214  static constexpr bool value = true;
215 };
216 template <class T>
217 struct is_pointer<T* volatile>
218 {
219  static constexpr bool value = true;
220 };
221 template <class T>
222 struct is_pointer<T* const volatile>
223 {
224  static constexpr bool value = true;
225 };
226 
227 template <class T>
229 {
230  typedef T type;
231 };
232 template <class T>
233 struct remove_pointer<T*>
234 {
235  typedef T type;
236 };
237 template <class T>
238 struct remove_pointer<T* const>
239 {
240  typedef T type;
241 };
242 template <class T>
243 struct remove_pointer<T* volatile>
244 {
245  typedef T type;
246 };
247 template <class T>
248 struct remove_pointer<T* const volatile>
249 {
250  typedef T type;
251 };
252 
253 template <typename T>
255 {
256 };
257 
258 template <typename T>
260 {
261 };
262 
263 template <typename T>
265 } // 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
bool_type< false > false_type
Definition: half.hpp:516
bool_type< true > true_type
Definition: half.hpp:515
Definition: assert.hpp:9
constexpr bool is_ndarray_v
static constexpr bool value
static constexpr bool value