mimic++ v2
Loading...
Searching...
No Matches
TypeTraits.hpp
Go to the documentation of this file.
1// // Copyright Dominic (DNKpp) Koepke 2024 - 2024.
2// // Distributed under the Boost Software License, Version 1.0.
3// // (See accompanying file LICENSE_1_0.txt or copy at
4// // https://www.boost.org/LICENSE_1_0.txt)
5
6#ifndef MIMICPP_TYPE_TRAITS_HPP
7#define MIMICPP_TYPE_TRAITS_HPP
8
9#pragma once
10
11#include "Fwd.hpp"
12
13#include <concepts>
14#include <cstddef>
15#include <tuple>
16#include <type_traits>
17
18namespace mimicpp
19{
20 template <typename Return, typename... Params>
21 struct signature_add_noexcept<Return(Params...)>
22 {
23 using type = Return(Params...) noexcept;
24 };
25
26 template <typename Return, typename... Params>
27 struct signature_add_noexcept<Return(Params..., ...)>
28 {
29 using type = Return(Params..., ...) noexcept;
30 };
31
32 template <typename Return, typename... Params>
33 struct signature_add_noexcept<Return(Params...) noexcept>
34 {
35 using type = Return(Params...) noexcept;
36 };
37
38 template <typename Return, typename... Params>
39 struct signature_add_noexcept<Return(Params..., ...) noexcept>
40 {
41 using type = Return(Params..., ...) noexcept;
42 };
43
44 template <typename Return, typename... Params>
45 struct signature_add_noexcept<Return(Params...) const>
46 {
47 using type = Return(Params...) const noexcept;
48 };
49
50 template <typename Return, typename... Params>
51 struct signature_add_noexcept<Return(Params..., ...) const>
52 {
53 using type = Return(Params..., ...) const noexcept;
54 };
55
56 template <typename Return, typename... Params>
57 struct signature_add_noexcept<Return(Params...) const noexcept>
58 {
59 using type = Return(Params...) const noexcept;
60 };
61
62 template <typename Return, typename... Params>
63 struct signature_add_noexcept<Return(Params..., ...) const noexcept>
64 {
65 using type = Return(Params..., ...) const noexcept;
66 };
67
68 template <typename Return, typename... Params>
69 struct signature_add_noexcept<Return(Params...) &>
70 {
71 using type = Return(Params...) & noexcept;
72 };
73
74 template <typename Return, typename... Params>
75 struct signature_add_noexcept<Return(Params..., ...) &>
76 {
77 using type = Return(Params..., ...) & noexcept;
78 };
79
80 template <typename Return, typename... Params>
81 struct signature_add_noexcept<Return(Params...) & noexcept>
82 {
83 using type = Return(Params...) & noexcept;
84 };
85
86 template <typename Return, typename... Params>
87 struct signature_add_noexcept<Return(Params..., ...) & noexcept>
88 {
89 using type = Return(Params..., ...) & noexcept;
90 };
91
92 template <typename Return, typename... Params>
93 struct signature_add_noexcept<Return(Params...) const &>
94 {
95 using type = Return(Params...) const & noexcept;
96 };
97
98 template <typename Return, typename... Params>
99 struct signature_add_noexcept<Return(Params..., ...) const &>
100 {
101 using type = Return(Params..., ...) const & noexcept;
102 };
103
104 template <typename Return, typename... Params>
105 struct signature_add_noexcept<Return(Params...) const & noexcept>
106 {
107 using type = Return(Params...) const & noexcept;
108 };
109
110 template <typename Return, typename... Params>
111 struct signature_add_noexcept<Return(Params..., ...) const & noexcept>
112 {
113 using type = Return(Params..., ...) const & noexcept;
114 };
115
116 template <typename Return, typename... Params>
117 struct signature_add_noexcept<Return(Params...) &&>
118 {
119 using type = Return(Params...) && noexcept;
120 };
121
122 template <typename Return, typename... Params>
123 struct signature_add_noexcept<Return(Params..., ...) &&>
124 {
125 using type = Return(Params..., ...) && noexcept;
126 };
127
128 template <typename Return, typename... Params>
129 struct signature_add_noexcept<Return(Params...) && noexcept>
130 {
131 using type = Return(Params...) && noexcept;
132 };
133
134 template <typename Return, typename... Params>
135 struct signature_add_noexcept<Return(Params..., ...) && noexcept>
136 {
137 using type = Return(Params..., ...) && noexcept;
138 };
139
140 template <typename Return, typename... Params>
141 struct signature_add_noexcept<Return(Params...) const &&>
142 {
143 using type = Return(Params...) const && noexcept;
144 };
145
146 template <typename Return, typename... Params>
147 struct signature_add_noexcept<Return(Params..., ...) const &&>
148 {
149 using type = Return(Params..., ...) const && noexcept;
150 };
151
152 template <typename Return, typename... Params>
153 struct signature_add_noexcept<Return(Params...) const && noexcept>
154 {
155 using type = Return(Params...) const && noexcept;
156 };
157
158 template <typename Return, typename... Params>
159 struct signature_add_noexcept<Return(Params..., ...) const && noexcept>
160 {
161 using type = Return(Params..., ...) const && noexcept;
162 };
163
164 template <typename Return, typename... Params>
165 struct signature_remove_noexcept<Return(Params...)>
166 {
167 using type = Return(Params...);
168 };
169
170 template <typename Return, typename... Params>
171 struct signature_remove_noexcept<Return(Params..., ...)>
172 {
173 using type = Return(Params..., ...);
174 };
175
176 template <typename Return, typename... Params>
177 struct signature_remove_noexcept<Return(Params...) noexcept>
178 {
179 using type = Return(Params...);
180 };
181
182 template <typename Return, typename... Params>
183 struct signature_remove_noexcept<Return(Params..., ...) noexcept>
184 {
185 using type = Return(Params..., ...);
186 };
187
188 template <typename Return, typename... Params>
189 struct signature_remove_noexcept<Return(Params...) const>
190 {
191 using type = Return(Params...) const;
192 };
193
194 template <typename Return, typename... Params>
195 struct signature_remove_noexcept<Return(Params..., ...) const>
196 {
197 using type = Return(Params..., ...) const;
198 };
199
200 template <typename Return, typename... Params>
201 struct signature_remove_noexcept<Return(Params...) const noexcept>
202 {
203 using type = Return(Params...) const;
204 };
205
206 template <typename Return, typename... Params>
207 struct signature_remove_noexcept<Return(Params..., ...) const noexcept>
208 {
209 using type = Return(Params..., ...) const;
210 };
211
212 template <typename Return, typename... Params>
213 struct signature_remove_noexcept<Return(Params...) &>
214 {
215 using type = Return(Params...) &;
216 };
217
218 template <typename Return, typename... Params>
219 struct signature_remove_noexcept<Return(Params..., ...) &>
220 {
221 using type = Return(Params..., ...) &;
222 };
223
224 template <typename Return, typename... Params>
225 struct signature_remove_noexcept<Return(Params...) & noexcept>
226 {
227 using type = Return(Params...) &;
228 };
229
230 template <typename Return, typename... Params>
231 struct signature_remove_noexcept<Return(Params..., ...) & noexcept>
232 {
233 using type = Return(Params..., ...) &;
234 };
235
236 template <typename Return, typename... Params>
237 struct signature_remove_noexcept<Return(Params...) const &>
238 {
239 using type = Return(Params...) const &;
240 };
241
242 template <typename Return, typename... Params>
243 struct signature_remove_noexcept<Return(Params..., ...) const &>
244 {
245 using type = Return(Params..., ...) const &;
246 };
247
248 template <typename Return, typename... Params>
249 struct signature_remove_noexcept<Return(Params...) const & noexcept>
250 {
251 using type = Return(Params...) const &;
252 };
253
254 template <typename Return, typename... Params>
255 struct signature_remove_noexcept<Return(Params..., ...) const & noexcept>
256 {
257 using type = Return(Params..., ...) const &;
258 };
259
260 template <typename Return, typename... Params>
261 struct signature_remove_noexcept<Return(Params...) &&>
262 {
263 using type = Return(Params...) &&;
264 };
265
266 template <typename Return, typename... Params>
267 struct signature_remove_noexcept<Return(Params..., ...) &&>
268 {
269 using type = Return(Params..., ...) &&;
270 };
271
272 template <typename Return, typename... Params>
273 struct signature_remove_noexcept<Return(Params...) && noexcept>
274 {
275 using type = Return(Params...) &&;
276 };
277
278 template <typename Return, typename... Params>
279 struct signature_remove_noexcept<Return(Params..., ...) && noexcept>
280 {
281 using type = Return(Params..., ...) &&;
282 };
283
284 template <typename Return, typename... Params>
285 struct signature_remove_noexcept<Return(Params...) const &&>
286 {
287 using type = Return(Params...) const &&;
288 };
289
290 template <typename Return, typename... Params>
291 struct signature_remove_noexcept<Return(Params..., ...) const &&>
292 {
293 using type = Return(Params..., ...) const &&;
294 };
295
296 template <typename Return, typename... Params>
297 struct signature_remove_noexcept<Return(Params...) const && noexcept>
298 {
299 using type = Return(Params...) const &&;
300 };
301
302 template <typename Return, typename... Params>
303 struct signature_remove_noexcept<Return(Params..., ...) const && noexcept>
304 {
305 using type = Return(Params..., ...) const &&;
306 };
307
308 template <typename Return, typename... Params>
309 struct signature_decay<Return(Params...)>
310 {
311 using type = Return(Params...);
312 };
313
314 template <typename Return, typename... Params>
315 struct signature_decay<Return(Params...) const>
316 {
317 using type = Return(Params...);
318 };
319
320 template <typename Return, typename... Params>
321 struct signature_decay<Return(Params...) &>
322 {
323 using type = Return(Params...);
324 };
325
326 template <typename Return, typename... Params>
327 struct signature_decay<Return(Params...) const &>
328 {
329 using type = Return(Params...);
330 };
331
332 template <typename Return, typename... Params>
333 struct signature_decay<Return(Params...) &&>
334 {
335 using type = Return(Params...);
336 };
337
338 template <typename Return, typename... Params>
339 struct signature_decay<Return(Params...) const &&>
340 {
341 using type = Return(Params...);
342 };
343
344 template <typename Return, typename... Params>
345 struct signature_decay<Return(Params...) noexcept>
346 {
347 using type = Return(Params...);
348 };
349
350 template <typename Return, typename... Params>
351 struct signature_decay<Return(Params...) const noexcept>
352 {
353 using type = Return(Params...);
354 };
355
356 template <typename Return, typename... Params>
357 struct signature_decay<Return(Params...) & noexcept>
358 {
359 using type = Return(Params...);
360 };
361
362 template <typename Return, typename... Params>
363 struct signature_decay<Return(Params...) const & noexcept>
364 {
365 using type = Return(Params...);
366 };
367
368 template <typename Return, typename... Params>
369 struct signature_decay<Return(Params...) && noexcept>
370 {
371 using type = Return(Params...);
372 };
373
374 template <typename Return, typename... Params>
375 struct signature_decay<Return(Params...) const && noexcept>
376 {
377 using type = Return(Params...);
378 };
379
380 template <typename Return, typename... Params>
381 struct signature_decay<Return(Params..., ...)>
382 {
383 using type = Return(Params..., ...);
384 };
385
386 template <typename Return, typename... Params>
387 struct signature_decay<Return(Params..., ...) const>
388 {
389 using type = Return(Params..., ...);
390 };
391
392 template <typename Return, typename... Params>
393 struct signature_decay<Return(Params..., ...) &>
394 {
395 using type = Return(Params..., ...);
396 };
397
398 template <typename Return, typename... Params>
399 struct signature_decay<Return(Params..., ...) const &>
400 {
401 using type = Return(Params..., ...);
402 };
403
404 template <typename Return, typename... Params>
405 struct signature_decay<Return(Params..., ...) &&>
406 {
407 using type = Return(Params..., ...);
408 };
409
410 template <typename Return, typename... Params>
411 struct signature_decay<Return(Params..., ...) const &&>
412 {
413 using type = Return(Params..., ...);
414 };
415
416 template <typename Return, typename... Params>
417 struct signature_decay<Return(Params..., ...) noexcept>
418 {
419 using type = Return(Params..., ...);
420 };
421
422 template <typename Return, typename... Params>
423 struct signature_decay<Return(Params..., ...) const noexcept>
424 {
425 using type = Return(Params..., ...);
426 };
427
428 template <typename Return, typename... Params>
429 struct signature_decay<Return(Params..., ...) & noexcept>
430 {
431 using type = Return(Params..., ...);
432 };
433
434 template <typename Return, typename... Params>
435 struct signature_decay<Return(Params..., ...) const & noexcept>
436 {
437 using type = Return(Params..., ...);
438 };
439
440 template <typename Return, typename... Params>
441 struct signature_decay<Return(Params..., ...) && noexcept>
442 {
443 using type = Return(Params..., ...);
444 };
445
446 template <typename Return, typename... Params>
447 struct signature_decay<Return(Params..., ...) const && noexcept>
448 {
449 using type = Return(Params..., ...);
450 };
451
452 template <typename Signature>
453 requires std::is_function_v<Signature>
454 struct signature_return_type<Signature>
455 : public signature_return_type<signature_decay_t<Signature>>
456 {
457 };
458
459 template <typename Return, typename... Params>
460 struct signature_return_type<Return(Params...)>
461 {
462 using type = Return;
463 };
464
465 template <typename Return, typename... Params>
466 struct signature_return_type<Return(Params..., ...)>
467 {
468 using type = Return;
469 };
470
471 template <std::size_t index, typename Signature>
472 requires std::is_function_v<Signature>
473 struct signature_param_type<index, Signature>
474 : public signature_param_type<
475 index,
476 signature_decay_t<Signature>>
477 {
478 };
479
480 template <std::size_t index, typename Return, typename... Params>
481 struct signature_param_type<index, Return(Params...)>
482 : public std::tuple_element<index, std::tuple<Params...>>
483 {
484 };
485
486 template <typename Signature>
487 requires std::is_function_v<Signature>
488 struct signature_param_list<Signature>
489 : public signature_param_list<
490 signature_decay_t<Signature>>
491 {
492 };
493
494 template <typename Return, typename... Params>
495 struct signature_param_list<Return(Params...)>
496 {
497 using type = std::tuple<Params...>;
498 };
499
500 namespace detail
501 {
502 template <typename First, typename Second, bool reversed = false>
504 : public std::conditional_t<
505 reversed,
506 std::false_type,
507 is_overloadable_with<Second, First, true>>
508 {
509 };
510
511 template <typename First, typename Second>
512 requires (
513 !std::same_as<
514 signature_param_list_t<signature_decay_t<First>>,
515 signature_param_list_t<signature_decay_t<Second>>>)
516 struct is_overloadable_with<First, Second, false>
517 : public std::true_type
518 {
519 };
520
521 template <typename Return1, typename Return2, typename... Params, bool reversed>
522 struct is_overloadable_with<Return1(Params...), Return2(Params...) const, reversed>
523 : public std::true_type
524 {
525 };
526
527 template <typename Return1, typename Return2, typename... Params, bool reversed>
528 struct is_overloadable_with<Return1(Params...) &, Return2(Params...) const &, reversed>
529 : public std::true_type
530 {
531 };
532
533 template <typename Return1, typename Return2, typename... Params, bool reversed>
534 struct is_overloadable_with<Return1(Params...) &, Return2(Params...) &&, reversed>
535 : public std::true_type
536 {
537 };
538
539 template <typename Return1, typename Return2, typename... Params, bool reversed>
540 struct is_overloadable_with<Return1(Params...) &, Return2(Params...) const &&, reversed>
541 : public std::true_type
542 {
543 };
544
545 template <typename Return1, typename Return2, typename... Params, bool reversed>
546 struct is_overloadable_with<Return1(Params...) const &, Return2(Params...) &&, reversed>
547 : public std::true_type
548 {
549 };
550
551 template <typename Return1, typename Return2, typename... Params, bool reversed>
552 struct is_overloadable_with<Return1(Params...) const &, Return2(Params...) const &&, reversed>
553 : public std::true_type
554 {
555 };
556
557 template <typename Return1, typename Return2, typename... Params, bool reversed>
558 struct is_overloadable_with<Return1(Params...) &&, Return2(Params...) const &&, reversed>
559 : public std::true_type
560 {
561 };
562 }
563
564 template <typename First, typename Second>
566 : public detail::is_overloadable_with<
567 signature_remove_noexcept_t<First>,
568 signature_remove_noexcept_t<Second>>
569 {
570 };
571
572 template <typename First>
573 struct is_overload_set<First>
574 : public std::true_type
575 {
576 };
577
578 template <typename First, typename Second, typename... Others>
579 struct is_overload_set<First, Second, Others...>
580 : public std::conjunction<
581 is_overloadable_with<First, Second>,
582 is_overload_set<First, Others...>,
583 is_overload_set<Second, Others...>>
584 {
585 };
586}
587
588#endif
Definition BoostTest.hpp:20
Definition Fwd.hpp:64
Definition TypeTraits.hpp:569
Return(Params...,...) &noexcept type
Definition TypeTraits.hpp:77
Return(Params...,...) &&noexcept type
Definition TypeTraits.hpp:125
Return(Params...,...) &&noexcept type
Definition TypeTraits.hpp:137
Return(Params...,...) &noexcept type
Definition TypeTraits.hpp:89
Return(Params...,...) const noexcept type
Definition TypeTraits.hpp:53
Return(Params...,...) const &noexcept type
Definition TypeTraits.hpp:101
Return(Params...,...) const &&noexcept type
Definition TypeTraits.hpp:149
Return(Params...,...) const &&noexcept type
Definition TypeTraits.hpp:161
Return(Params...,...) const &noexcept type
Definition TypeTraits.hpp:113
Return(Params...,...) const noexcept type
Definition TypeTraits.hpp:65
Return(Params...,...) noexcept type
Definition TypeTraits.hpp:41
Return(Params...,...) noexcept type
Definition TypeTraits.hpp:29
Return(Params...) &noexcept type
Definition TypeTraits.hpp:71
Return(Params...) &&noexcept type
Definition TypeTraits.hpp:119
Return(Params...) &&noexcept type
Definition TypeTraits.hpp:131
Return(Params...) &noexcept type
Definition TypeTraits.hpp:83
Return(Params...) const noexcept type
Definition TypeTraits.hpp:47
Return(Params...) const &noexcept type
Definition TypeTraits.hpp:95
Return(Params...) const &&noexcept type
Definition TypeTraits.hpp:143
Return(Params...) const &&noexcept type
Definition TypeTraits.hpp:155
Return(Params...) const &noexcept type
Definition TypeTraits.hpp:107
Return(Params...) const noexcept type
Definition TypeTraits.hpp:59
Return(Params...) noexcept type
Definition TypeTraits.hpp:35
Return(Params...) noexcept type
Definition TypeTraits.hpp:23
Definition Fwd.hpp:22
Return(Params...,...) type
Definition TypeTraits.hpp:395
Return(Params...,...) type
Definition TypeTraits.hpp:407
Return(Params...,...) type
Definition TypeTraits.hpp:443
Return(Params...,...) type
Definition TypeTraits.hpp:431
Return(Params...,...) type
Definition TypeTraits.hpp:389
Return(Params...,...) type
Definition TypeTraits.hpp:401
Return(Params...,...) type
Definition TypeTraits.hpp:413
Return(Params...,...) type
Definition TypeTraits.hpp:449
Return(Params...,...) type
Definition TypeTraits.hpp:437
Return(Params...,...) type
Definition TypeTraits.hpp:425
Return(Params...,...) type
Definition TypeTraits.hpp:419
Return(Params...,...) type
Definition TypeTraits.hpp:383
Return(Params...) type
Definition TypeTraits.hpp:323
Return(Params...) type
Definition TypeTraits.hpp:335
Return(Params...) type
Definition TypeTraits.hpp:371
Return(Params...) type
Definition TypeTraits.hpp:359
Return(Params...) type
Definition TypeTraits.hpp:317
Return(Params...) type
Definition TypeTraits.hpp:329
Return(Params...) type
Definition TypeTraits.hpp:341
Return(Params...) type
Definition TypeTraits.hpp:377
Return(Params...) type
Definition TypeTraits.hpp:365
Return(Params...) type
Definition TypeTraits.hpp:353
Return(Params...) type
Definition TypeTraits.hpp:347
Return(Params...) type
Definition TypeTraits.hpp:311
Definition Fwd.hpp:34
std::tuple< Params... > type
Definition TypeTraits.hpp:497
Definition Fwd.hpp:52
Definition Fwd.hpp:46
Return(Params...,...) & type
Definition TypeTraits.hpp:221
Return(Params...,...) && type
Definition TypeTraits.hpp:269
Return(Params...,...) && type
Definition TypeTraits.hpp:281
Return(Params...,...) & type
Definition TypeTraits.hpp:233
Return(Params...,...) const type
Definition TypeTraits.hpp:197
Return(Params...,...) const & type
Definition TypeTraits.hpp:245
Return(Params...,...) const && type
Definition TypeTraits.hpp:293
Return(Params...,...) const && type
Definition TypeTraits.hpp:305
Return(Params...,...) const & type
Definition TypeTraits.hpp:257
Return(Params...,...) const type
Definition TypeTraits.hpp:209
Return(Params...,...) type
Definition TypeTraits.hpp:185
Return(Params...,...) type
Definition TypeTraits.hpp:173
Return(Params...) & type
Definition TypeTraits.hpp:215
Return(Params...) && type
Definition TypeTraits.hpp:263
Return(Params...) && type
Definition TypeTraits.hpp:275
Return(Params...) & type
Definition TypeTraits.hpp:227
Return(Params...) const type
Definition TypeTraits.hpp:191
Return(Params...) const & type
Definition TypeTraits.hpp:239
Return(Params...) const && type
Definition TypeTraits.hpp:287
Return(Params...) const && type
Definition TypeTraits.hpp:299
Return(Params...) const & type
Definition TypeTraits.hpp:251
Return(Params...) const type
Definition TypeTraits.hpp:203
Return(Params...) type
Definition TypeTraits.hpp:179
Return(Params...) type
Definition TypeTraits.hpp:167
Return type
Definition TypeTraits.hpp:468
Return type
Definition TypeTraits.hpp:462
Definition Fwd.hpp:40