6#ifndef MIMICPP_TYPE_TRAITS_HPP
7#define MIMICPP_TYPE_TRAITS_HPP
20 template <
typename Return,
typename... Params>
23 using type = Return(Params...) noexcept;
26 template <typename Return, typename... Params>
29 using type = Return(Params..., ...) noexcept;
32 template <typename Return, typename... Params>
35 using type = Return(Params...) noexcept;
38 template <typename Return, typename... Params>
41 using type = Return(Params..., ...) noexcept;
44 template <typename Return, typename... Params>
47 using type = Return(Params...) const noexcept;
50 template <typename Return, typename... Params>
53 using type = Return(Params..., ...) const noexcept;
56 template <typename Return, typename... Params>
59 using type = Return(Params...) const noexcept;
62 template <typename Return, typename... Params>
65 using type = Return(Params..., ...) const noexcept;
68 template <typename Return, typename... Params>
71 using type = Return(Params...) &
noexcept;
74 template <
typename Return,
typename... Params>
77 using type = Return(Params..., ...) &
noexcept;
80 template <
typename Return,
typename... Params>
83 using type = Return(Params...) &
noexcept;
86 template <
typename Return,
typename... Params>
89 using type = Return(Params..., ...) &
noexcept;
92 template <
typename Return,
typename... Params>
95 using type = Return(Params...) const & noexcept;
98 template <typename Return, typename... Params>
101 using type = Return(Params..., ...) const & noexcept;
104 template <typename Return, typename... Params>
107 using type = Return(Params...) const & noexcept;
110 template <typename Return, typename... Params>
113 using type = Return(Params..., ...) const & noexcept;
116 template <typename Return, typename... Params>
119 using type = Return(Params...) &&
noexcept;
122 template <
typename Return,
typename... Params>
125 using type = Return(Params..., ...) &&
noexcept;
128 template <
typename Return,
typename... Params>
131 using type = Return(Params...) &&
noexcept;
134 template <
typename Return,
typename... Params>
137 using type = Return(Params..., ...) &&
noexcept;
140 template <
typename Return,
typename... Params>
143 using type = Return(Params...) const && noexcept;
146 template <typename Return, typename... Params>
149 using type = Return(Params..., ...) const && noexcept;
152 template <typename Return, typename... Params>
155 using type = Return(Params...) const && noexcept;
158 template <typename Return, typename... Params>
161 using type = Return(Params..., ...) const && noexcept;
164 template <typename Return, typename... Params>
167 using type = Return(Params...);
170 template <
typename Return,
typename... Params>
173 using type = Return(Params..., ...);
176 template <
typename Return,
typename... Params>
179 using type = Return(Params...);
182 template <
typename Return,
typename... Params>
185 using type = Return(Params..., ...);
188 template <
typename Return,
typename... Params>
191 using type = Return(Params...)
const;
194 template <
typename Return,
typename... Params>
197 using type = Return(Params..., ...)
const;
200 template <
typename Return,
typename... Params>
203 using type = Return(Params...)
const;
206 template <
typename Return,
typename... Params>
209 using type = Return(Params..., ...)
const;
212 template <
typename Return,
typename... Params>
215 using type = Return(Params...) &;
218 template <
typename Return,
typename... Params>
221 using type = Return(Params..., ...) &;
224 template <
typename Return,
typename... Params>
227 using type = Return(Params...) &;
230 template <
typename Return,
typename... Params>
233 using type = Return(Params..., ...) &;
236 template <
typename Return,
typename... Params>
239 using type = Return(Params...) const &;
242 template <typename Return, typename... Params>
245 using type = Return(Params..., ...) const &;
248 template <typename Return, typename... Params>
251 using type = Return(Params...) const &;
254 template <typename Return, typename... Params>
257 using type = Return(Params..., ...) const &;
260 template <typename Return, typename... Params>
263 using type = Return(Params...) &&;
266 template <
typename Return,
typename... Params>
269 using type = Return(Params..., ...) &&;
272 template <
typename Return,
typename... Params>
275 using type = Return(Params...) &&;
278 template <
typename Return,
typename... Params>
281 using type = Return(Params..., ...) &&;
284 template <
typename Return,
typename... Params>
287 using type = Return(Params...) const &&;
290 template <typename Return, typename... Params>
293 using type = Return(Params..., ...) const &&;
296 template <typename Return, typename... Params>
299 using type = Return(Params...) const &&;
302 template <typename Return, typename... Params>
305 using type = Return(Params..., ...) const &&;
308 template <typename Return, typename... Params>
311 using type = Return(Params...);
314 template <
typename Return,
typename... Params>
317 using type = Return(Params...);
320 template <
typename Return,
typename... Params>
323 using type = Return(Params...);
326 template <
typename Return,
typename... Params>
329 using type = Return(Params...);
332 template <
typename Return,
typename... Params>
335 using type = Return(Params...);
338 template <
typename Return,
typename... Params>
341 using type = Return(Params...);
344 template <
typename Return,
typename... Params>
347 using type = Return(Params...);
350 template <
typename Return,
typename... Params>
353 using type = Return(Params...);
356 template <
typename Return,
typename... Params>
359 using type = Return(Params...);
362 template <
typename Return,
typename... Params>
365 using type = Return(Params...);
368 template <
typename Return,
typename... Params>
371 using type = Return(Params...);
374 template <
typename Return,
typename... Params>
377 using type = Return(Params...);
380 template <
typename Return,
typename... Params>
383 using type = Return(Params..., ...);
386 template <
typename Return,
typename... Params>
389 using type = Return(Params..., ...);
392 template <
typename Return,
typename... Params>
395 using type = Return(Params..., ...);
398 template <
typename Return,
typename... Params>
401 using type = Return(Params..., ...);
404 template <
typename Return,
typename... Params>
407 using type = Return(Params..., ...);
410 template <
typename Return,
typename... Params>
413 using type = Return(Params..., ...);
416 template <
typename Return,
typename... Params>
419 using type = Return(Params..., ...);
422 template <
typename Return,
typename... Params>
425 using type = Return(Params..., ...);
428 template <
typename Return,
typename... Params>
431 using type = Return(Params..., ...);
434 template <
typename Return,
typename... Params>
437 using type = Return(Params..., ...);
440 template <
typename Return,
typename... Params>
443 using type = Return(Params..., ...);
446 template <
typename Return,
typename... Params>
449 using type = Return(Params..., ...);
452 template <
typename Signature>
453 requires std::is_function_v<Signature>
459 template <
typename Return,
typename... Params>
465 template <
typename Return,
typename... Params>
471 template <std::
size_t index,
typename Signature>
472 requires std::is_function_v<Signature>
476 signature_decay_t<Signature>>
480 template <std::size_t index,
typename Return,
typename... Params>
482 :
public std::tuple_element<index, std::tuple<Params...>>
486 template <
typename Signature>
487 requires std::is_function_v<Signature>
490 signature_decay_t<Signature>>
494 template <
typename Return,
typename... Params>
497 using type = std::tuple<Params...>;
502 template <
typename First,
typename Second,
bool reversed = false>
504 :
public std::conditional_t<
507 is_overloadable_with<Second, First, true>>
511 template <
typename First,
typename Second>
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
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
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
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
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
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
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
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
564 template <
typename First,
typename Second>
566 :
public detail::is_overloadable_with<
567 signature_remove_noexcept_t<First>,
568 signature_remove_noexcept_t<Second>>
572 template <
typename First>
574 :
public std::true_type
578 template <
typename First,
typename Second,
typename... Others>
580 :
public std::conjunction<
581 is_overloadable_with<First, Second>,
582 is_overload_set<First, Others...>,
583 is_overload_set<Second, Others...>>
Definition BoostTest.hpp:20
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
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
std::tuple< Params... > type
Definition TypeTraits.hpp:497
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