kDB: Knowledge DataBase
Loading...
Searching...
No Matches
overload.h
1// BEGIN OVERLOAD
2namespace overload
3{
4 namespace detail
5 {
6 template<typename... Args>
7 struct non_const_overload
8 {
9 template<typename R, typename C>
10 constexpr auto operator()(R (C::*ptr)(Args...)) const noexcept -> decltype(ptr)
11 {
12 return ptr;
13 }
14
15 template<typename R, typename C>
16 static constexpr auto of(R (C::*ptr)(Args...)) noexcept -> decltype(ptr)
17 {
18 return ptr;
19 }
20 };
21
22 template<typename... Args>
23 struct const_overload
24 {
25 template<typename R, typename C>
26 constexpr auto operator()(R (C::*ptr)(Args...) const) const noexcept -> decltype(ptr)
27 {
28 return ptr;
29 }
30
31 template<typename R, typename C>
32 static constexpr auto of(R (C::*ptr)(Args...) const) noexcept -> decltype(ptr)
33 {
34 return ptr;
35 }
36 };
37
38 template<typename... Args>
39 struct overload : const_overload<Args...>, non_const_overload<Args...>
40 {
41 using const_overload<Args...>::of;
42 using const_overload<Args...>::operator();
43 using non_const_overload<Args...>::of;
44 using non_const_overload<Args...>::operator();
45
46 template<typename R>
47 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
48 {
49 return ptr;
50 }
51
52 template<typename R>
53 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
54 {
55 return ptr;
56 }
57 };
58 template<typename R, typename C, typename... Args>
59 struct non_const_overload_r_c
60 {
61 constexpr auto operator()(R (C::*ptr)(Args...)) const noexcept -> decltype(ptr)
62 {
63 return ptr;
64 }
65
66 static constexpr auto of(R (C::*ptr)(Args...)) noexcept -> decltype(ptr) { return ptr; }
67 };
68
69 template<typename R, typename C, typename... Args>
70 struct const_overload_r_c
71 {
72 constexpr auto operator()(R (C::*ptr)(Args...) const) const noexcept -> decltype(ptr)
73 {
74 return ptr;
75 }
76
77 static constexpr auto of(R (C::*ptr)(Args...) const) noexcept -> decltype(ptr) { return ptr; }
78 };
79
80 template<typename R, typename C, typename... Args>
81 struct overload_r_c : const_overload_r_c<R, C, Args...>, non_const_overload_r_c<R, C, Args...>
82 {
83 using const_overload_r_c<R, C, Args...>::of;
84 using const_overload_r_c<R, C, Args...>::operator();
85 using non_const_overload_r_c<R, C, Args...>::of;
86 using non_const_overload_r_c<R, C, Args...>::operator();
87
88 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr) { return ptr; }
89
90 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr) { return ptr; }
91 };
92
93 } // namespace detail
94
95 template<typename... Args>
96 constexpr __attribute__((__unused__)) detail::overload_r_c<Args...> overload_r_c = {};
97 template<typename... Args>
98 constexpr __attribute__((__unused__)) detail::overload<Args...> overload = {};
99 template<typename... Args>
100 constexpr __attribute__((__unused__)) detail::const_overload<Args...> const_overload = {};
101 template<typename... Args>
102 constexpr __attribute__((__unused__)) detail::non_const_overload<Args...> non_const_overload = {};
103} // namespace overload
104// END OVERLOAD