• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 macros used:
11 
12 BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS - the function-level qualifiers for the
13     current inclusion (combinations of `const` `volatile` `&` `&&`, or nothing)
14 
15 BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE - the transaction_safe specifier for
16     the current include (`transaction_safe` or nothing)
17 
18 BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE - `std::true_type` or `std::false_type`,
19     tied on whether BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE is `transaction_safe`
20 
21 BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER - `transaction_safe` when
22     BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE is enabled, otherwise nothing
23 
24 BOOST_CLBL_TRTS_NOEXCEPT_SPEC - the noexcept specifier for
25     the current include (`noexcept` or nothing)
26 
27 BOOST_CLBL_TRTS_IS_NOEXCEPT - `std::true_type` or `std::false_type`,
28     tied on whether BOOST_CLBL_TRTS_NOEXCEPT_SPEC is `noexcept`
29 
30 BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER - `noexcept` if
31     BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES is defined, otherwise nothing
32 
33 */
34 
35 template<typename Return, typename... Args>
36 struct function<Return(Args...)
37     BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
38     BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
39     BOOST_CLBL_TRTS_NOEXCEPT_SPEC>
40  : default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS> {
41 
42     static constexpr bool value = true;
43 
44     using traits = function;
45 
46     using return_type = Return;
47 
48     using arg_types = std::tuple<Args...>;
49     using non_invoke_arg_types = arg_types;
50 
51     using type = Return(Args...)
52         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
53         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
54         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
55 
56     using function_type = Return(Args...);
57 
58     using qualified_function_type = Return(Args...)
59         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
60         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
61         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
62 
63     using remove_varargs = type;
64 
65     using add_varargs = Return (Args..., ...)
66         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
67         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
68         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
69 
70     using is_noexcept = BOOST_CLBL_TRTS_IS_NOEXCEPT;
71 
72     using remove_noexcept = Return(Args...)
73         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
74         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE;
75 
76     using add_noexcept = Return(Args...)
77         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
78         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
79         BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER;
80 
81     using is_transaction_safe = BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE;
82 
83     using remove_transaction_safe = Return(Args...)
84         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
85         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
86 
87     using add_transaction_safe = Return(Args...)
88         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
89         BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER
90         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
91 
92     using qualifiers = default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>;
93 
94     template<qualifier_flags Flags>
95     using set_qualifiers = set_function_qualifiers<Flags, is_transaction_safe::value,
96         is_noexcept::value, Return, Args...>;
97 
98     #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
99 
100     using add_member_lvalue_reference = abominable_functions_not_supported_on_this_compiler;
101     using add_member_rvalue_reference = abominable_functions_not_supported_on_this_compiler;
102     using add_member_const = abominable_functions_not_supported_on_this_compiler;
103     using add_member_volatile = abominable_functions_not_supported_on_this_compiler;
104     using add_member_cv = abominable_functions_not_supported_on_this_compiler;
105 
106     #else
107 
108     using add_member_lvalue_reference = set_qualifiers<
109         collapse_flags<qualifiers::q_flags, lref_>::value>;
110 
111     using add_member_rvalue_reference = set_qualifiers<
112         collapse_flags<qualifiers::q_flags, rref_>::value>;
113 
114     using add_member_const = set_qualifiers<qualifiers::q_flags | const_>;
115 
116     using add_member_volatile = set_qualifiers<qualifiers::q_flags | volatile_>;
117 
118     using add_member_cv = set_qualifiers<qualifiers::q_flags | cv_>;
119 
120     #endif // #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
121 
122     using remove_member_reference = set_qualifiers<qualifiers::cv_flags>;
123 
124     using remove_member_const = set_qualifiers<
125         qualifiers::ref_flags | remove_const_flag<qualifiers::cv_flags>::value>;
126 
127     using remove_member_volatile = set_qualifiers<
128         qualifiers::ref_flags | remove_volatile_flag<qualifiers::cv_flags>::value>;
129 
130     using remove_member_cv = set_qualifiers<qualifiers::ref_flags>;
131 
132     template<typename U>
133     using apply_member_pointer = add_member_pointer<type, U>;
134 
135     template<typename NewReturn>
136     using apply_return = NewReturn(Args...)
137         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
138         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
139         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
140 
141     template<template<class...> class Container>
142     using expand_args = Container<Args...>;
143 
144     using is_member_pointer = std::false_type;
145 };
146 
147 
148 template<typename Return, typename... Args>
149 struct function<Return (Args..., ...)
150     BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
151     BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
152     BOOST_CLBL_TRTS_NOEXCEPT_SPEC>
153  : default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS> {
154 
155     static constexpr bool value = true;
156 
157     using has_varargs = std::true_type;
158     using traits = function;
159     using return_type = Return;
160     using arg_types = std::tuple<Args...>;
161 
162     using type = Return (Args..., ...)
163         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
164         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
165         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
166 
167     using function_type = Return(Args..., ...);
168 
169     using qualified_function_type = Return(Args..., ...)
170         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
171         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
172         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
173 
174     using remove_varargs = Return (Args...)
175         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
176         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
177         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
178 
179     using add_varargs = type;
180 
181     using is_noexcept = BOOST_CLBL_TRTS_IS_NOEXCEPT;
182 
183     using remove_noexcept = Return(Args..., ...)
184         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
185         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE;
186 
187     using add_noexcept = Return(Args..., ...)
188         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
189         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
190         BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER;
191 
192     using is_transaction_safe = BOOST_CLBL_TRTS_IS_TRANSACTION_SAFE;
193 
194     using remove_transaction_safe = Return(Args..., ...)
195         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
196         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
197 
198     using add_transaction_safe = Return(Args..., ...)
199         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
200         BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER
201         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
202 
203     using qualifiers = default_callable_traits<dummy BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS>;
204 
205     template<qualifier_flags Flags>
206     using set_qualifiers = set_varargs_function_qualifiers<Flags, is_transaction_safe::value,
207         is_noexcept::value, Return, Args...>;
208 
209     #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
210 
211     using add_member_lvalue_reference = abominable_functions_not_supported_on_this_compiler;
212     using add_member_rvalue_reference = abominable_functions_not_supported_on_this_compiler;
213     using add_member_const = abominable_functions_not_supported_on_this_compiler;
214     using add_member_volatile = abominable_functions_not_supported_on_this_compiler;
215     using add_member_cv = abominable_functions_not_supported_on_this_compiler;
216 
217     #else
218 
219     using add_member_lvalue_reference = set_qualifiers<
220         collapse_flags<qualifiers::q_flags, lref_>::value>;
221 
222     using add_member_rvalue_reference = set_qualifiers<
223         collapse_flags<qualifiers::q_flags, rref_>::value>;
224 
225     using add_member_const = set_qualifiers<qualifiers::q_flags | const_>;
226 
227     using add_member_volatile = set_qualifiers<qualifiers::q_flags | volatile_>;
228 
229     using add_member_cv = set_qualifiers<qualifiers::q_flags | cv_>;
230 
231     #endif // #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS
232 
233     using remove_member_reference = set_qualifiers<qualifiers::cv_flags>;
234 
235     using remove_member_const = set_qualifiers<
236         qualifiers::ref_flags | remove_const_flag<qualifiers::cv_flags>::value>;
237 
238     using remove_member_volatile = set_qualifiers<
239         qualifiers::ref_flags | remove_volatile_flag<qualifiers::cv_flags>::value>;
240 
241     using remove_member_cv = set_qualifiers<qualifiers::ref_flags>;
242 
243     template<typename U>
244     using apply_member_pointer =
245         Return( BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC U::*)(Args..., ...)
246             BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
247             BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
248             BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
249 
250     template<typename NewReturn>
251     using apply_return = NewReturn(Args..., ...)
252         BOOST_CLBL_TRTS_INCLUDE_QUALIFIERS
253         BOOST_CLBL_TRTS_INCLUDE_TRANSACTION_SAFE
254         BOOST_CLBL_TRTS_NOEXCEPT_SPEC;
255 
256     template<template<class...> class Container>
257     using expand_args = Container<Args...>;
258 
259     using is_member_pointer = std::false_type;
260 };
261