6#ifndef MIMICPP_TYPE_TRAITS_HPP
7#define MIMICPP_TYPE_TRAITS_HPP
14#ifndef MIMICPP_DETAIL_IS_MODULE
19 #include <type_traits>
22namespace mimicpp::detail
24 template <
typename Signature>
25 struct has_default_call_convention
26 :
public std::false_type
30 template <
typename Signature>
31 inline constexpr bool has_default_call_convention_v = has_default_call_convention<Signature>::value;
33 template <
typename Return,
typename... Params>
34 struct has_default_call_convention<Return(Params...)>
35 :
public std::true_type
39 template <
typename Return,
typename... Params>
40 struct has_default_call_convention<Return(Params..., ...)>
41 :
public std::true_type
45 template <
typename Return,
typename... Params>
46 struct has_default_call_convention<Return(Params...) noexcept>
47 :
public std::true_type
51 template <
typename Return,
typename... Params>
52 struct has_default_call_convention<Return(Params..., ...) noexcept>
53 :
public std::true_type
57 template <
typename Return,
typename... Params>
58 struct has_default_call_convention<Return(Params...) const>
59 :
public std::true_type
63 template <
typename Return,
typename... Params>
64 struct has_default_call_convention<Return(Params..., ...) const>
65 :
public std::true_type
69 template <
typename Return,
typename... Params>
70 struct has_default_call_convention<Return(Params...) const noexcept>
71 :
public std::true_type
75 template <
typename Return,
typename... Params>
76 struct has_default_call_convention<Return(Params..., ...) const noexcept>
77 :
public std::true_type
81 template <
typename Return,
typename... Params>
82 struct has_default_call_convention<Return(Params...)&>
83 :
public std::true_type
87 template <
typename Return,
typename... Params>
88 struct has_default_call_convention<Return(Params..., ...)&>
89 :
public std::true_type
93 template <
typename Return,
typename... Params>
94 struct has_default_call_convention<Return(Params...) &
noexcept>
95 :
public std::true_type
99 template <
typename Return,
typename... Params>
100 struct has_default_call_convention<Return(Params..., ...) &
noexcept>
101 :
public std::true_type
105 template <
typename Return,
typename... Params>
106 struct has_default_call_convention<Return(Params...) const&>
107 :
public std::true_type
111 template <
typename Return,
typename... Params>
112 struct has_default_call_convention<Return(Params..., ...) const&>
113 :
public std::true_type
117 template <
typename Return,
typename... Params>
118 struct has_default_call_convention<Return(Params...) const &
noexcept>
119 :
public std::true_type
123 template <
typename Return,
typename... Params>
124 struct has_default_call_convention<Return(Params..., ...) const &
noexcept>
125 :
public std::true_type
129 template <
typename Return,
typename... Params>
130 struct has_default_call_convention<Return(Params...) &&>
131 :
public std::true_type
135 template <
typename Return,
typename... Params>
136 struct has_default_call_convention<Return(Params..., ...) &&>
137 :
public std::true_type
141 template <
typename Return,
typename... Params>
142 struct has_default_call_convention<Return(Params...) &&
noexcept>
143 :
public std::true_type
147 template <
typename Return,
typename... Params>
148 struct has_default_call_convention<Return(Params..., ...) &&
noexcept>
149 :
public std::true_type
153 template <
typename Return,
typename... Params>
154 struct has_default_call_convention<Return(Params...) const&&>
155 :
public std::true_type
159 template <
typename Return,
typename... Params>
160 struct has_default_call_convention<Return(Params..., ...) const&&>
161 :
public std::true_type
165 template <
typename Return,
typename... Params>
166 struct has_default_call_convention<Return(Params...) const &&
noexcept>
167 :
public std::true_type
171 template <
typename Return,
typename... Params>
172 struct has_default_call_convention<Return(Params..., ...) const &&
noexcept>
173 :
public std::true_type
177 struct default_call_convention
194 template <
typename Signature>
210 template <has_default_call_convention Signature>
213 using type = detail::default_call_convention;
248 using tag_t = detail::default_call_convention;
250 template <
typename Signature>
253 template <
typename Signature>
256 template <
typename Derived,
typename Signature>
272 template <
typename Signature>
291 template <
typename>
typename Trait,
293 typename Applied = Trait<typename CallConvTrait::template remove_call_convention_t<Signature>>>
294 struct signature_apply_trait
295 :
public std::bool_constant<Applied::value>
297 using type =
typename CallConvTrait::template add_call_convention_t<typename Applied::type>;
311 template <
typename Signature>
312 struct signature_remove_noexcept;
314 template <
typename Return,
typename... Params>
315 struct signature_remove_noexcept<Return(Params...)>
316 :
public std::false_type
318 using type = Return(Params...);
321 template <
typename Return,
typename... Params>
322 struct signature_remove_noexcept<Return(Params..., ...)>
323 :
public std::false_type
325 using type = Return(Params..., ...);
328 template <
typename Return,
typename... Params>
329 struct signature_remove_noexcept<Return(Params...) noexcept>
330 :
public std::true_type
332 using type = Return(Params...);
335 template <
typename Return,
typename... Params>
336 struct signature_remove_noexcept<Return(Params..., ...) noexcept>
337 :
public std::true_type
339 using type = Return(Params..., ...);
342 template <
typename Return,
typename... Params>
343 struct signature_remove_noexcept<Return(Params...) const>
344 :
public std::false_type
346 using type = Return(Params...)
const;
349 template <
typename Return,
typename... Params>
350 struct signature_remove_noexcept<Return(Params..., ...) const>
351 :
public std::false_type
353 using type = Return(Params..., ...)
const;
356 template <
typename Return,
typename... Params>
357 struct signature_remove_noexcept<Return(Params...) const noexcept>
358 :
public std::true_type
360 using type = Return(Params...)
const;
363 template <
typename Return,
typename... Params>
364 struct signature_remove_noexcept<Return(Params..., ...) const noexcept>
365 :
public std::true_type
367 using type = Return(Params..., ...)
const;
370 template <
typename Return,
typename... Params>
371 struct signature_remove_noexcept<Return(Params...)&>
372 :
public std::false_type
374 using type = Return(Params...) &;
377 template <
typename Return,
typename... Params>
378 struct signature_remove_noexcept<Return(Params..., ...)&>
379 :
public std::false_type
381 using type = Return(Params..., ...) &;
384 template <
typename Return,
typename... Params>
385 struct signature_remove_noexcept<Return(Params...) &
noexcept>
386 :
public std::true_type
388 using type = Return(Params...) &;
391 template <
typename Return,
typename... Params>
392 struct signature_remove_noexcept<Return(Params..., ...) &
noexcept>
393 :
public std::true_type
395 using type = Return(Params..., ...) &;
398 template <
typename Return,
typename... Params>
399 struct signature_remove_noexcept<Return(Params...) const&>
400 :
public std::false_type
402 using type = Return(Params...) const&;
405 template <typename Return, typename... Params>
406 struct signature_remove_noexcept<Return(Params..., ...) const&>
407 : public std::false_type
409 using type = Return(Params..., ...) const&;
412 template <typename Return, typename... Params>
413 struct signature_remove_noexcept<Return(Params...) const & noexcept>
414 : public std::true_type
416 using type = Return(Params...) const&;
419 template <typename Return, typename... Params>
420 struct signature_remove_noexcept<Return(Params..., ...) const & noexcept>
421 : public std::true_type
423 using type = Return(Params..., ...) const&;
426 template <typename Return, typename... Params>
427 struct signature_remove_noexcept<Return(Params...) &&>
428 : public std::false_type
430 using type = Return(Params...) &&;
433 template <
typename Return,
typename... Params>
434 struct signature_remove_noexcept<Return(Params..., ...) &&>
435 :
public std::false_type
437 using type = Return(Params..., ...) &&;
440 template <
typename Return,
typename... Params>
441 struct signature_remove_noexcept<Return(Params...) &&
noexcept>
442 :
public std::true_type
444 using type = Return(Params...) &&;
447 template <
typename Return,
typename... Params>
448 struct signature_remove_noexcept<Return(Params..., ...) &&
noexcept>
449 :
public std::true_type
451 using type = Return(Params..., ...) &&;
454 template <
typename Return,
typename... Params>
455 struct signature_remove_noexcept<Return(Params...) const&&>
456 :
public std::false_type
458 using type = Return(Params...) const&&;
461 template <typename Return, typename... Params>
462 struct signature_remove_noexcept<Return(Params..., ...) const&&>
463 : public std::false_type
465 using type = Return(Params..., ...) const&&;
468 template <typename Return, typename... Params>
469 struct signature_remove_noexcept<Return(Params...) const && noexcept>
470 : public std::true_type
472 using type = Return(Params...) const&&;
475 template <typename Return, typename... Params>
476 struct signature_remove_noexcept<Return(Params..., ...) const && noexcept>
477 : public std::true_type
479 using type = Return(Params..., ...) const&&;
483 template <typename Signature>
503 template <
typename Signature>
506 template <
typename Signature>
509 :
public std::false_type
511 using type = Signature;
514 template <
typename Return,
typename... Params>
515 struct signature_add_noexcept<Return(Params...)>
516 :
public std::true_type
518 using type = Return(Params...) noexcept;
521 template <typename Return, typename... Params>
522 struct signature_add_noexcept<Return(Params..., ...)>
523 : public std::true_type
525 using type = Return(Params..., ...) noexcept;
528 template <typename Return, typename... Params>
529 struct signature_add_noexcept<Return(Params...) const>
530 : public std::true_type
532 using type = Return(Params...) const noexcept;
535 template <typename Return, typename... Params>
536 struct signature_add_noexcept<Return(Params..., ...) const>
537 : public std::true_type
539 using type = Return(Params..., ...) const noexcept;
542 template <typename Return, typename... Params>
543 struct signature_add_noexcept<Return(Params...)&>
544 : public std::true_type
546 using type = Return(Params...) &
noexcept;
549 template <
typename Return,
typename... Params>
550 struct signature_add_noexcept<Return(Params..., ...)&>
551 :
public std::true_type
553 using type = Return(Params..., ...) &
noexcept;
556 template <
typename Return,
typename... Params>
557 struct signature_add_noexcept<Return(Params...) const&>
558 :
public std::true_type
560 using type = Return(Params...) const& noexcept;
563 template <typename Return, typename... Params>
564 struct signature_add_noexcept<Return(Params..., ...) const&>
565 : public std::true_type
567 using type = Return(Params..., ...) const& noexcept;
570 template <typename Return, typename... Params>
571 struct signature_add_noexcept<Return(Params...) &&>
572 : public std::true_type
574 using type = Return(Params...) &&
noexcept;
577 template <
typename Return,
typename... Params>
578 struct signature_add_noexcept<Return(Params..., ...) &&>
579 :
public std::true_type
581 using type = Return(Params..., ...) &&
noexcept;
584 template <
typename Return,
typename... Params>
585 struct signature_add_noexcept<Return(Params...) const&&>
586 :
public std::true_type
588 using type = Return(Params...) const&& noexcept;
591 template <typename Return, typename... Params>
592 struct signature_add_noexcept<Return(Params..., ...) const&&>
593 : public std::true_type
595 using type = Return(Params..., ...) const&& noexcept;
599 template <typename Signature>
617 template <
typename Signature>
619 :
public std::bool_constant<signature_remove_noexcept<Signature>::value>
637 template <
typename Signature,
bool isNoexcept>
638 struct signature_remove_ref_qualifier_impl;
640 template <
typename Return,
typename... Params,
bool isNoexcept>
641 struct signature_remove_ref_qualifier_impl<Return(Params...), isNoexcept>
642 :
public std::false_type
644 using type = Return(Params...) noexcept(isNoexcept);
647 template <typename Return, typename... Params,
bool isNoexcept>
648 struct signature_remove_ref_qualifier_impl<Return(Params..., ...), isNoexcept>
649 : public std::false_type
651 using type = Return(Params..., ...) noexcept(isNoexcept);
654 template <typename Return, typename... Params,
bool isNoexcept>
655 struct signature_remove_ref_qualifier_impl<Return(Params...) const, isNoexcept>
656 : public std::false_type
658 using type = Return(Params...) const noexcept(isNoexcept);
661 template <typename Return, typename... Params,
bool isNoexcept>
662 struct signature_remove_ref_qualifier_impl<Return(Params..., ...) const, isNoexcept>
663 : public std::false_type
665 using type = Return(Params..., ...) const noexcept(isNoexcept);
668 template <typename Return, typename... Params,
bool isNoexcept>
669 struct signature_remove_ref_qualifier_impl<Return(Params...)&, isNoexcept>
670 : public std::true_type
672 using type = Return(Params...) noexcept(isNoexcept);
675 template <typename Return, typename... Params,
bool isNoexcept>
676 struct signature_remove_ref_qualifier_impl<Return(Params..., ...)&, isNoexcept>
677 : public std::true_type
679 using type = Return(Params..., ...) noexcept(isNoexcept);
682 template <typename Return, typename... Params,
bool isNoexcept>
683 struct signature_remove_ref_qualifier_impl<Return(Params...) const&, isNoexcept>
684 : public std::true_type
686 using type = Return(Params...) const noexcept(isNoexcept);
689 template <typename Return, typename... Params,
bool isNoexcept>
690 struct signature_remove_ref_qualifier_impl<Return(Params..., ...) const&, isNoexcept>
691 : public std::true_type
693 using type = Return(Params..., ...) const noexcept(isNoexcept);
696 template <typename Return, typename... Params,
bool isNoexcept>
697 struct signature_remove_ref_qualifier_impl<Return(Params...)&&, isNoexcept>
698 : public std::true_type
700 using type = Return(Params...) noexcept(isNoexcept);
703 template <typename Return, typename... Params,
bool isNoexcept>
704 struct signature_remove_ref_qualifier_impl<Return(Params..., ...)&&, isNoexcept>
705 : public std::true_type
707 using type = Return(Params..., ...) noexcept(isNoexcept);
710 template <typename Return, typename... Params,
bool isNoexcept>
711 struct signature_remove_ref_qualifier_impl<Return(Params...) const&&, isNoexcept>
712 : public std::true_type
714 using type = Return(Params...) const noexcept(isNoexcept);
717 template <typename Return, typename... Params,
bool isNoexcept>
718 struct signature_remove_ref_qualifier_impl<Return(Params..., ...) const&&, isNoexcept>
719 : public std::true_type
721 using type = Return(Params..., ...) const noexcept(isNoexcept);
726 struct signature_remove_ref_qualifier_
727 : public signature_remove_ref_qualifier_impl<typename Trait::type, Trait::value>
731 template <
typename Signature>
732 using signature_remove_ref_qualifier = signature_remove_ref_qualifier_<Signature>;
735 template <
typename Signature>
737 :
public detail::signature_apply_trait<Signature, detail::signature_remove_ref_qualifier>
755 template <
typename Signature,
bool isNoexcept>
756 struct signature_remove_const_qualifier_impl;
758 template <
typename Return,
typename... Params,
bool isNoexcept>
759 struct signature_remove_const_qualifier_impl<Return(Params...), isNoexcept>
760 :
public std::false_type
762 using type = Return(Params...) noexcept(isNoexcept);
765 template <typename Return, typename... Params,
bool isNoexcept>
766 struct signature_remove_const_qualifier_impl<Return(Params...) const, isNoexcept>
767 : public std::true_type
769 using type = Return(Params...) noexcept(isNoexcept);
772 template <typename Return, typename... Params,
bool isNoexcept>
773 struct signature_remove_const_qualifier_impl<Return(Params..., ...), isNoexcept>
774 : public std::false_type
776 using type = Return(Params..., ...) noexcept(isNoexcept);
779 template <typename Return, typename... Params,
bool isNoexcept>
780 struct signature_remove_const_qualifier_impl<Return(Params..., ...) const, isNoexcept>
781 : public std::true_type
783 using type = Return(Params..., ...) noexcept(isNoexcept);
786 template <typename Return, typename... Params,
bool isNoexcept>
787 struct signature_remove_const_qualifier_impl<Return(Params...)&, isNoexcept>
788 : public std::false_type
790 using type = Return(Params...) &
noexcept(isNoexcept);
793 template <
typename Return,
typename... Params,
bool isNoexcept>
794 struct signature_remove_const_qualifier_impl<Return(Params...) const&, isNoexcept>
795 :
public std::true_type
797 using type = Return(Params...) &
noexcept(isNoexcept);
800 template <
typename Return,
typename... Params,
bool isNoexcept>
801 struct signature_remove_const_qualifier_impl<Return(Params..., ...)&, isNoexcept>
802 :
public std::false_type
804 using type = Return(Params..., ...) &
noexcept(isNoexcept);
807 template <
typename Return,
typename... Params,
bool isNoexcept>
808 struct signature_remove_const_qualifier_impl<Return(Params..., ...) const&, isNoexcept>
809 :
public std::true_type
811 using type = Return(Params..., ...) &
noexcept(isNoexcept);
814 template <
typename Return,
typename... Params,
bool isNoexcept>
815 struct signature_remove_const_qualifier_impl<Return(Params...)&&, isNoexcept>
816 :
public std::false_type
818 using type = Return(Params...) &&
noexcept(isNoexcept);
821 template <
typename Return,
typename... Params,
bool isNoexcept>
822 struct signature_remove_const_qualifier_impl<Return(Params...) const&&, isNoexcept>
823 :
public std::true_type
825 using type = Return(Params...) &&
noexcept(isNoexcept);
828 template <
typename Return,
typename... Params,
bool isNoexcept>
829 struct signature_remove_const_qualifier_impl<Return(Params..., ...)&&, isNoexcept>
830 :
public std::false_type
832 using type = Return(Params..., ...) &&
noexcept(isNoexcept);
835 template <
typename Return,
typename... Params,
bool isNoexcept>
836 struct signature_remove_const_qualifier_impl<Return(Params..., ...) const&&, isNoexcept>
837 :
public std::true_type
839 using type = Return(Params..., ...) &&
noexcept(isNoexcept);
843 template <
typename Signature,
typename Trait = signature_remove_noexcept<Signature>>
844 struct signature_remove_const_qualifier_
845 :
public signature_remove_const_qualifier_impl<typename Trait::type, Trait::value>
849 template <
typename Signature>
850 using signature_remove_const_qualifier = signature_remove_const_qualifier_<Signature>;
853 template <
typename Signature>
855 :
public detail::signature_apply_trait<Signature, detail::signature_remove_const_qualifier>
873 template <
typename Signature,
bool isNoexcept>
874 struct signature_add_const_qualifier_impl;
876 template <
typename Return,
typename... Params,
bool isNoexcept>
877 struct signature_add_const_qualifier_impl<Return(Params...), isNoexcept>
878 :
public std::true_type
880 using type = Return(Params...) const noexcept(isNoexcept);
883 template <typename Return, typename... Params,
bool isNoexcept>
884 struct signature_add_const_qualifier_impl<Return(Params..., ...), isNoexcept>
885 : public std::true_type
887 using type = Return(Params..., ...) const noexcept(isNoexcept);
890 template <typename Return, typename... Params,
bool isNoexcept>
891 struct signature_add_const_qualifier_impl<Return(Params...)&, isNoexcept>
892 : public std::true_type
894 using type = Return(Params...) const& noexcept(isNoexcept);
897 template <typename Return, typename... Params,
bool isNoexcept>
898 struct signature_add_const_qualifier_impl<Return(Params..., ...)&, isNoexcept>
899 : public std::true_type
901 using type = Return(Params..., ...) const& noexcept(isNoexcept);
904 template <typename Return, typename... Params,
bool isNoexcept>
905 struct signature_add_const_qualifier_impl<Return(Params...)&&, isNoexcept>
906 : public std::true_type
908 using type = Return(Params...) const&& noexcept(isNoexcept);
911 template <typename Return, typename... Params,
bool isNoexcept>
912 struct signature_add_const_qualifier_impl<Return(Params..., ...)&&, isNoexcept>
913 : public std::true_type
915 using type = Return(Params..., ...) const&& noexcept(isNoexcept);
920 struct signature_add_const_qualifier_
921 : public signature_add_const_qualifier_impl<typename Trait::type, Trait::value>
925 template <
typename Signature>
926 requires signature_remove_const_qualifier<Signature>::value
927 struct signature_add_const_qualifier_<Signature>
928 :
public std::false_type
930 using type = Signature;
933 template <
typename Signature>
934 using signature_add_const_qualifier = signature_add_const_qualifier_<Signature>;
937 template <
typename Signature>
939 :
public detail::signature_apply_trait<Signature, detail::signature_add_const_qualifier>
958 template <
typename Signature,
bool isNoexcept>
959 struct signature_add_lvalue_ref_qualifier_impl;
961 template <
typename Return,
typename... Params,
bool isNoexcept>
962 struct signature_add_lvalue_ref_qualifier_impl<Return(Params...), isNoexcept>
963 :
public std::true_type
965 using type = Return(Params...) &
noexcept(isNoexcept);
968 template <
typename Return,
typename... Params,
bool isNoexcept>
969 struct signature_add_lvalue_ref_qualifier_impl<Return(Params..., ...), isNoexcept>
970 :
public std::true_type
972 using type = Return(Params..., ...) &
noexcept(isNoexcept);
975 template <
typename Return,
typename... Params,
bool isNoexcept>
976 struct signature_add_lvalue_ref_qualifier_impl<Return(Params...) const, isNoexcept>
977 :
public std::true_type
979 using type = Return(Params...) const& noexcept(isNoexcept);
982 template <typename Return, typename... Params,
bool isNoexcept>
983 struct signature_add_lvalue_ref_qualifier_impl<Return(Params..., ...) const, isNoexcept>
984 : public std::true_type
986 using type = Return(Params..., ...) const& noexcept(isNoexcept);
989 template <typename Return, typename... Params,
bool isNoexcept>
990 struct signature_add_lvalue_ref_qualifier_impl<Return(Params...)&, isNoexcept>
991 : public std::false_type
993 using type = Return(Params...) &
noexcept(isNoexcept);
996 template <
typename Return,
typename... Params,
bool isNoexcept>
997 struct signature_add_lvalue_ref_qualifier_impl<Return(Params..., ...)&, isNoexcept>
998 :
public std::false_type
1000 using type = Return(Params..., ...) &
noexcept(isNoexcept);
1003 template <
typename Return,
typename... Params,
bool isNoexcept>
1004 struct signature_add_lvalue_ref_qualifier_impl<Return(Params...) const&, isNoexcept>
1005 :
public std::false_type
1007 using type = Return(Params...) const& noexcept(isNoexcept);
1010 template <typename Return, typename... Params,
bool isNoexcept>
1011 struct signature_add_lvalue_ref_qualifier_impl<Return(Params..., ...) const&, isNoexcept>
1012 : public std::false_type
1014 using type = Return(Params..., ...) const& noexcept(isNoexcept);
1018 template <typename Signature, typename Trait = signature_remove_noexcept<Signature>>
1019 struct signature_add_lvalue_ref_qualifier_
1020 : public signature_add_lvalue_ref_qualifier_impl<typename Trait::type, Trait::value>
1024 template <
typename Signature>
1025 using signature_add_lvalue_ref_qualifier = signature_add_lvalue_ref_qualifier_<Signature>;
1028 template <
typename Signature>
1030 :
public detail::signature_apply_trait<Signature, detail::signature_add_lvalue_ref_qualifier>
1049 template <
typename Signature,
bool isNoexcept>
1050 struct signature_add_rvalue_ref_qualifier_impl;
1052 template <
typename Return,
typename... Params,
bool isNoexcept>
1053 struct signature_add_rvalue_ref_qualifier_impl<Return(Params...), isNoexcept>
1054 :
public std::true_type
1056 using type = Return(Params...) &&
noexcept(isNoexcept);
1059 template <
typename Return,
typename... Params,
bool isNoexcept>
1060 struct signature_add_rvalue_ref_qualifier_impl<Return(Params..., ...), isNoexcept>
1061 :
public std::true_type
1063 using type = Return(Params..., ...) &&
noexcept(isNoexcept);
1066 template <
typename Return,
typename... Params,
bool isNoexcept>
1067 struct signature_add_rvalue_ref_qualifier_impl<Return(Params...) const, isNoexcept>
1068 :
public std::true_type
1070 using type = Return(Params...) const&& noexcept(isNoexcept);
1073 template <typename Return, typename... Params,
bool isNoexcept>
1074 struct signature_add_rvalue_ref_qualifier_impl<Return(Params..., ...) const, isNoexcept>
1075 : public std::true_type
1077 using type = Return(Params..., ...) const&& noexcept(isNoexcept);
1080 template <typename Return, typename... Params,
bool isNoexcept>
1081 struct signature_add_rvalue_ref_qualifier_impl<Return(Params...)&&, isNoexcept>
1082 : public std::false_type
1084 using type = Return(Params...) &&
noexcept(isNoexcept);
1087 template <
typename Return,
typename... Params,
bool isNoexcept>
1088 struct signature_add_rvalue_ref_qualifier_impl<Return(Params..., ...)&&, isNoexcept>
1089 :
public std::false_type
1091 using type = Return(Params..., ...) &&
noexcept(isNoexcept);
1094 template <
typename Return,
typename... Params,
bool isNoexcept>
1095 struct signature_add_rvalue_ref_qualifier_impl<Return(Params...) const&&, isNoexcept>
1096 :
public std::false_type
1098 using type = Return(Params...) const&& noexcept(isNoexcept);
1101 template <typename Return, typename... Params,
bool isNoexcept>
1102 struct signature_add_rvalue_ref_qualifier_impl<Return(Params..., ...) const&&, isNoexcept>
1103 : public std::false_type
1105 using type = Return(Params..., ...) const&& noexcept(isNoexcept);
1109 template <typename Signature, typename Trait = signature_remove_noexcept<Signature>>
1110 struct signature_add_rvalue_ref_qualifier_
1111 : public signature_add_rvalue_ref_qualifier_impl<typename Trait::type, Trait::value>
1115 template <
typename Signature>
1116 using signature_add_rvalue_ref_qualifier = signature_add_rvalue_ref_qualifier_<Signature>;
1119 template <
typename Signature>
1121 :
public detail::signature_apply_trait<Signature, detail::signature_add_rvalue_ref_qualifier>
1137 template <
typename Signature>
1141 typename detail::signature_remove_ref_qualifier_impl<
1142 typename detail::signature_remove_const_qualifier_impl<
1143 typename detail::signature_remove_noexcept<
1161 template <
typename Signature>
1169 template <
typename Return,
typename... Params>
1175 template <
typename Return,
typename... Params>
1193 template <std::
size_t index,
typename Signature>
1198 signature_decay_t<Signature>>
1203 template <std::size_t index,
typename Return,
typename... Params>
1205 :
public std::tuple_element<index, std::tuple<Params...>>
1221 template <
typename Signature>
1223 :
public std::integral_constant<
1225 signature_remove_const_qualifier<Signature>::value
1226 ? Constness::as_const
1227 : Constness::non_const>
1243 template <
typename Signature>
1247 signature_remove_noexcept_t<
1248 signature_remove_const_qualifier_t<
1249 signature_remove_call_convention_t<Signature>>>>
1254 template <
typename Return,
typename... Params>
1256 :
public std::integral_constant<
1262 template <
typename Return,
typename... Params>
1264 :
public std::integral_constant<
1270 template <
typename Return,
typename... Params>
1272 :
public std::integral_constant<
1278 template <
typename Return,
typename... Params>
1280 :
public std::integral_constant<
1286 template <
typename Return,
typename... Params>
1288 :
public std::integral_constant<
1294 template <
typename Return,
typename... Params>
1296 :
public std::integral_constant<
1314 template <
typename Signature>
1318 signature_decay_t<Signature>>
1323 template <
typename Return,
typename... Params>
1343 template <
typename Signature,
typename T,
bool isNoexcept>
1344 struct signature_prepend_param_impl;
1346 template <
typename Return,
typename... Params,
typename T,
bool isNoexcept>
1347 struct signature_prepend_param_impl<Return(Params...), T, isNoexcept>
1348 :
public std::true_type
1350 using type = Return(T, Params...)
noexcept(isNoexcept);
1353 template <
typename Return,
typename... Params,
typename T,
bool isNoexcept>
1354 struct signature_prepend_param_impl<Return(Params..., ...), T, isNoexcept>
1355 :
public std::true_type
1357 using type = Return(T, Params..., ...) noexcept(isNoexcept);
1360 template <typename Return, typename... Params, typename T,
bool isNoexcept>
1361 struct signature_prepend_param_impl<Return(Params...)&, T, isNoexcept>
1362 : public std::true_type
1364 using type = Return(T, Params...) &
noexcept(isNoexcept);
1367 template <
typename Return,
typename... Params,
typename T,
bool isNoexcept>
1368 struct signature_prepend_param_impl<Return(Params..., ...)&, T, isNoexcept>
1369 :
public std::true_type
1371 using type = Return(T, Params..., ...) &
noexcept(isNoexcept);
1374 template <
typename Return,
typename... Params,
typename T,
bool isNoexcept>
1375 struct signature_prepend_param_impl<Return(Params...)&&, T, isNoexcept>
1376 :
public std::true_type
1378 using type = Return(T, Params...) &&
noexcept(isNoexcept);
1381 template <
typename Return,
typename... Params,
typename T,
bool isNoexcept>
1382 struct signature_prepend_param_impl<Return(Params..., ...)&&, T, isNoexcept>
1383 :
public std::true_type
1385 using type = Return(T, Params..., ...) &&
noexcept(isNoexcept);
1388 template <
typename Return,
typename... Params,
typename T,
bool isNoexcept>
1389 struct signature_prepend_param_impl<Return(Params...) const, T, isNoexcept>
1390 :
public std::true_type
1392 using type = Return(T, Params...) const noexcept(isNoexcept);
1395 template <typename Return, typename... Params, typename T,
bool isNoexcept>
1396 struct signature_prepend_param_impl<Return(Params..., ...) const, T, isNoexcept>
1397 : public std::true_type
1399 using type = Return(T, Params..., ...) const noexcept(isNoexcept);
1402 template <typename Return, typename... Params, typename T,
bool isNoexcept>
1403 struct signature_prepend_param_impl<Return(Params...) const&, T, isNoexcept>
1404 : public std::true_type
1406 using type = Return(T, Params...) const& noexcept(isNoexcept);
1409 template <typename Return, typename... Params, typename T,
bool isNoexcept>
1410 struct signature_prepend_param_impl<Return(Params..., ...) const&, T, isNoexcept>
1411 : public std::true_type
1413 using type = Return(T, Params..., ...) const& noexcept(isNoexcept);
1416 template <typename Return, typename... Params, typename T,
bool isNoexcept>
1417 struct signature_prepend_param_impl<Return(Params...) const&&, T, isNoexcept>
1418 : public std::true_type
1420 using type = Return(T, Params...) const&& noexcept(isNoexcept);
1423 template <typename Return, typename... Params, typename T,
bool isNoexcept>
1424 struct signature_prepend_param_impl<Return(Params..., ...) const&&, T, isNoexcept>
1425 : public std::true_type
1427 using type = Return(T, Params..., ...) const&& noexcept(isNoexcept);
1431 template <typename Signature, typename T, typename Trait = signature_remove_noexcept<Signature>>
1432 struct signature_prepend_param_
1433 : public signature_prepend_param_impl<typename Trait::type, T, Trait::value>
1437 template <
typename T>
1438 struct signature_prepend_param
1440 template <
typename Signature>
1441 using type = signature_prepend_param_<Signature, T>;
1445 template <
typename Signature,
typename T>
1447 :
public detail::signature_apply_trait<Signature, detail::signature_prepend_param<T>::template type>
1456namespace mimicpp::detail
1458 template <
typename First,
typename Second,
bool reversed = false>
1459 struct is_overloadable_with
1460 :
public std::conditional_t<
1463 is_overloadable_with<Second, First, true>>
1467 template <
typename First,
typename Second>
1472 struct is_overloadable_with<First, Second, false>
1473 :
public std::true_type
1477 template <
typename Return1,
typename Return2,
typename... Params,
bool reversed>
1478 struct is_overloadable_with<Return1(Params...), Return2(Params...) const, reversed>
1479 :
public std::true_type
1483 template <
typename Return1,
typename Return2,
typename... Params,
bool reversed>
1484 struct is_overloadable_with<Return1(Params...)&, Return2(Params...) const&, reversed>
1485 : public std::true_type
1489 template <
typename Return1,
typename Return2,
typename... Params,
bool reversed>
1490 struct is_overloadable_with<Return1(Params...)&, Return2(Params...)&&, reversed>
1491 :
public std::true_type
1495 template <
typename Return1,
typename Return2,
typename... Params,
bool reversed>
1496 struct is_overloadable_with<Return1(Params...)&, Return2(Params...) const&&, reversed>
1497 : public std::true_type
1501 template <
typename Return1,
typename Return2,
typename... Params,
bool reversed>
1502 struct is_overloadable_with<Return1(Params...) const&, Return2(Params...)&&, reversed>
1503 :
public std::true_type
1507 template <
typename Return1,
typename Return2,
typename... Params,
bool reversed>
1508 struct is_overloadable_with<Return1(Params...) const&, Return2(Params...) const&&, reversed>
1509 : public std::true_type
1513 template <
typename Return1,
typename Return2,
typename... Params,
bool reversed>
1514 struct is_overloadable_with<Return1(Params...)&&, Return2(Params...) const&&, reversed>
1515 : public std::true_type
1519 template <
typename Signature>
1534 template <
typename First,
typename Second>
1536 :
public detail::is_overloadable_with<
1537 detail::normalize_overload_t<First>,
1538 detail::normalize_overload_t<Second>>
1548 template <
typename First,
typename... Others>
1552 if constexpr (0 ==
sizeof...(Others))
1558 return (... && is_overloadable_with<First, Others>::value)
1559 && is_overload_set<Others...>();
1572 template <
typename First,
typename... Others>
1574 :
public std::bool_constant<
1575 detail::is_overload_set<detail::normalize_overload_t<First>, detail::normalize_overload_t<Others>...>()>
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
Determines, whether the given signature has default call-convention.
Definition TypeTraits.hpp:195
constexpr TypeMatcher< T > type
Matcher, which can be used as a last resort to disambiguate similar overloads.
Definition GeneralMatchers.hpp:297
typename signature_call_convention< Signature >::type signature_call_convention_t
Convenience alias, exposing the type member alias of the actual type-trait.
Definition Fwd.hpp:102
typename signature_param_list< Signature >::type signature_param_list_t
Convenience alias, exposing the type member alias of the actual type-trait.
Definition Fwd.hpp:294
typename signature_remove_call_convention< Signature >::type signature_remove_call_convention_t
Convenience alias, exposing the type member alias of the actual type-trait.
Definition Fwd.hpp:118
typename signature_remove_noexcept< Signature >::type signature_remove_noexcept_t
Convenience alias, exposing the type member alias of the actual type-trait.
Definition Fwd.hpp:70
ValueCategory
Definition Fwd.hpp:34
@ lvalue
Definition Fwd.hpp:35
@ rvalue
Definition Fwd.hpp:36
detail::DefaultCallInterface< Derived, Signature > call_interface_t
Definition TypeTraits.hpp:257
std::type_identity_t< Signature > add_call_convention_t
Definition TypeTraits.hpp:254
detail::default_call_convention tag_t
Definition TypeTraits.hpp:248
std::type_identity_t< Signature > remove_call_convention_t
Definition TypeTraits.hpp:251
Primary template, purposely undefined.
Definition Fwd.hpp:355
Primary template.
Definition TypeTraits.hpp:1576
Primary template.
Definition TypeTraits.hpp:1539
Primary template, purposely undefined.
Definition TypeTraits.hpp:940
Primary template, purposely undefined.
Definition TypeTraits.hpp:1031
Primary template, purposely undefined.
Definition TypeTraits.hpp:602
Primary template, purposely undefined.
Definition TypeTraits.hpp:1122
detail::default_call_convention type
Definition TypeTraits.hpp:213
Primary template, purposely undefined.
Definition Fwd.hpp:94
Primary template.
Definition TypeTraits.hpp:1228
Primary template.
Definition TypeTraits.hpp:1139
typename detail::signature_remove_ref_qualifier_impl< typename detail::signature_remove_const_qualifier_impl< typename detail::signature_remove_noexcept< signature_remove_call_convention_t< Signature > >::type, false >::type, false >::type type
Definition TypeTraits.hpp:1140
Primary template.
Definition TypeTraits.hpp:620
util::type_list< Params... > type
Definition TypeTraits.hpp:1326
Primary template.
Definition TypeTraits.hpp:1320
Primary template.
Definition TypeTraits.hpp:1200
Primary template.
Definition TypeTraits.hpp:1448
Primary template.
Definition TypeTraits.hpp:1251
Primary template, purposely undefined.
Definition TypeTraits.hpp:274
typename call_convention_traits< signature_call_convention_t< Signature > >::template remove_call_convention_t< Signature > type
Definition TypeTraits.hpp:275
Primary template, purposely undefined.
Definition TypeTraits.hpp:856
Primary template, purposely undefined.
Definition TypeTraits.hpp:486
Primary template, purposely undefined.
Definition TypeTraits.hpp:738
Return type
Definition TypeTraits.hpp:1178
Return type
Definition TypeTraits.hpp:1172
Primary template.
Definition TypeTraits.hpp:1166
std::uint8_t type
Definition TypeTraits.hpp:1598
std::uint16_t type
Definition TypeTraits.hpp:1607
std::uint32_t type
Definition TypeTraits.hpp:1616
std::uint64_t type
Definition TypeTraits.hpp:1625
Primary template, purposely undefined.
Definition Fwd.hpp:363
A very basic type-list template.
Definition TypeList.hpp:29