]>
Commit | Line | Data |
---|---|---|
b32b8144 FG |
1 | /* |
2 | Copyright (c) 2016 Barrett Adair | |
3 | ||
4 | Distributed under the Boost Software License, Version 1.0. | |
5 | (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) | |
6 | ||
7 | HEADER GUARDS INTENTIONALLY OMITTED | |
8 | DO NOT INCLUDE THIS HEADER DIRECTLY | |
9 | ||
10 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS - the function-level qualifiers for the | |
11 | current inclusion (combinations of `const` `volatile` `&` `&&`, or nothing) | |
12 | ||
13 | BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE - the transaction_safe specifier for | |
14 | the current include (`transaction_safe` or nothing) | |
15 | ||
16 | BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE - `std::true_type` or `std::false_type`, | |
17 | tied on whether BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE is `transaction_safe` | |
18 | ||
19 | BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER - `transaction_safe` when | |
20 | BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE is enabled, otherwise nothing | |
21 | ||
22 | BOOST_CLBL_TRTS_NOEXCEPT_SPEC - the noexcept specifier for | |
23 | the current include (`noexcept` or nothing) | |
24 | ||
25 | BOOST_CLBL_TRTS_IS_NOEXCEPT - `std::true_type` or `std::false_type`, | |
26 | tied on whether BOOST_CLBL_TRTS_NOEXCEPT_SPEC is `noexcept` | |
27 | ||
28 | BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER - `noexcept` if | |
29 | BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES is defined, otherwise nothing | |
30 | */ | |
31 | ||
32 | template<typename Return, typename T, typename... Args> | |
33 | struct pmf<Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) | |
34 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS | |
35 | BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE | |
36 | BOOST_CLBL_TRTS_NOEXCEPT_SPEC> | |
37 | : default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS> { | |
38 | ||
39 | static constexpr bool value = true; | |
40 | ||
41 | using has_varargs = std::true_type; | |
42 | ||
43 | using traits = pmf; | |
44 | ||
45 | using return_type = Return; | |
46 | ||
47 | using type = Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) | |
48 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS | |
49 | BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE | |
50 | BOOST_CLBL_TRTS_NOEXCEPT_SPEC; | |
51 | ||
52 | using invoke_type = typename std::conditional< | |
53 | std::is_rvalue_reference<T BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>::value, | |
54 | T BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS, | |
55 | typename std::add_lvalue_reference<T BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>::type | |
56 | >::type; | |
57 | ||
58 | using arg_types = std::tuple<invoke_type, Args...>; | |
59 | using non_invoke_arg_types = std::tuple<Args...>; | |
60 | ||
61 | using function_object_signature = Return(Args..., ...); | |
62 | ||
63 | using function_type = Return(invoke_type, Args..., ...); | |
64 | ||
65 | using qualified_function_type = Return(Args..., ...) | |
66 | BOOST_CLBL_TRTS_INCLUDE_ABOMINABLE_QUALIFIERS | |
67 | BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE | |
68 | BOOST_CLBL_TRTS_NOEXCEPT_SPEC; | |
69 | ||
70 | using remove_varargs = | |
71 | Return(BOOST_CLBL_TRTS_CC T::*)(Args...) | |
72 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS | |
73 | BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE | |
74 | BOOST_CLBL_TRTS_NOEXCEPT_SPEC; | |
75 | ||
76 | using add_varargs = type; | |
77 | ||
78 | using is_noexcept = BOOST_CLBL_TRTS_IS_NOEXCEPT; | |
79 | ||
80 | using remove_noexcept = Return(BOOST_CLBL_TRTS_CC T::*)(Args..., ...) | |
81 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS | |
82 | BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE; | |
83 | ||
84 | using add_noexcept = Return(BOOST_CLBL_TRTS_CC T::*)(Args..., ...) | |
85 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS | |
86 | BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE | |
87 | BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER; | |
88 | ||
89 | using is_transaction_safe = BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE; | |
90 | ||
91 | using remove_transaction_safe = Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) | |
92 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS | |
93 | BOOST_CLBL_TRTS_NOEXCEPT_SPEC; | |
94 | ||
95 | using add_transaction_safe = Return(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) | |
96 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS | |
97 | BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER | |
98 | BOOST_CLBL_TRTS_NOEXCEPT_SPEC; | |
99 | ||
100 | using class_type = T; | |
101 | ||
102 | using qualifiers = default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>; | |
103 | ||
104 | template<qualifier_flags Flags> | |
105 | using set_qualifiers = set_varargs_member_function_qualifiers< | |
106 | Flags, is_transaction_safe::value, is_noexcept::value, | |
107 | BOOST_CLBL_TRTS_CC_TAG, T, Return, Args...>; | |
108 | ||
109 | using remove_member_reference = set_qualifiers<qualifiers::cv_flags>; | |
110 | ||
111 | using add_member_lvalue_reference = set_qualifiers< | |
112 | collapse_flags<qualifiers::q_flags, lref_>::value>; | |
113 | ||
114 | using add_member_rvalue_reference = set_qualifiers< | |
115 | collapse_flags<qualifiers::q_flags, rref_>::value>; | |
116 | ||
117 | using add_member_const = set_qualifiers<qualifiers::q_flags | const_>; | |
118 | ||
119 | using add_member_volatile = set_qualifiers<qualifiers::q_flags | volatile_>; | |
120 | ||
121 | using add_member_cv = set_qualifiers<qualifiers::q_flags | cv_>; | |
122 | ||
123 | using remove_member_const = set_qualifiers< | |
124 | qualifiers::ref_flags | remove_const_flag<qualifiers::cv_flags>::value>; | |
125 | ||
126 | using remove_member_volatile = set_qualifiers< | |
127 | qualifiers::ref_flags | remove_volatile_flag<qualifiers::cv_flags>::value>; | |
128 | ||
129 | using remove_member_cv = set_qualifiers<qualifiers::ref_flags>; | |
130 | ||
131 | template<typename U> | |
132 | using apply_member_pointer = | |
133 | Return(BOOST_CLBL_TRTS_VARARGS_CC U::*)(Args..., ...) | |
134 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS | |
135 | BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE | |
136 | BOOST_CLBL_TRTS_NOEXCEPT_SPEC; | |
137 | ||
138 | template<typename NewReturn> | |
139 | using apply_return = | |
140 | NewReturn(BOOST_CLBL_TRTS_VARARGS_CC T::*)(Args..., ...) | |
141 | BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS | |
142 | BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE | |
143 | BOOST_CLBL_TRTS_NOEXCEPT_SPEC; | |
144 | ||
145 | template<template<class...> class Container> | |
146 | using expand_args = Container<invoke_type, Args...>; | |
147 | ||
148 | using is_member_pointer = std::true_type; | |
149 | }; |