]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/callable_traits/test/is_invocable_r.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / callable_traits / test / is_invocable_r.cpp
1 /*
2 Copyright Barrett Adair 2016-2017
3 Distributed under the Boost Software License, Version 1.0.
4 (See accompanying file LICENSE.md or copy at http ://boost.org/LICENSE_1_0.txt)
5 */
6
7 #include <type_traits>
8 #include <functional>
9 #include <utility>
10 #include <boost/callable_traits/is_invocable.hpp>
11 #include "test.hpp"
12
13 #ifdef BOOST_CLBL_TRTS_GCC_OLDER_THAN_4_9_2
14 //gcc >= 4.8 doesn't like the invoke_case pattern used here
15 int main(){}
16 #else
17
18 template<typename T>
19 struct tag {
20 using type = T;
21 };
22
23 template<bool Expect, typename Ret, typename... Args>
24 struct invoke_case {
25 template<typename Callable>
26 void operator()(tag<Callable>) const {
27 CT_ASSERT((Expect == boost::callable_traits::is_invocable_r<Ret, Callable, Args...>()));
28 }
29 };
30
31 template<typename Callable, typename... InvokeCases>
32 void run_tests() {
33 using ignored = int[];
34 ignored x {(InvokeCases{}(tag<Callable>{}),0)..., 0};
35 (void)x;
36 }
37
38 struct foo {};
39
40 int main() {
41
42 run_tests<void(foo::*)()
43 ,invoke_case<true, void, foo>
44 ,invoke_case<true, void, foo*>
45 ,invoke_case<true, void, foo&>
46 ,invoke_case<true, void, foo&&>
47 ,invoke_case<true, void, std::reference_wrapper<foo>>
48 ,invoke_case<false, int, foo>
49 ,invoke_case<false, int, foo*>
50 ,invoke_case<false, int, foo&>
51 ,invoke_case<false, int, foo&&>
52 ,invoke_case<false, int, std::reference_wrapper<foo>>
53 ,invoke_case<false, void, foo const>
54 ,invoke_case<false, void, foo const*>
55 ,invoke_case<false, void, foo const&>
56 ,invoke_case<false, void, foo const&&>
57 ,invoke_case<false, void, std::reference_wrapper<foo const>>
58 ,invoke_case<false, void, foo, int>
59 ,invoke_case<false, void, foo*, int>
60 ,invoke_case<false, void, foo&, int>
61 ,invoke_case<false, void, foo&&, int>
62 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
63 ,invoke_case<false, int, foo const>
64 ,invoke_case<false, int, foo const*>
65 ,invoke_case<false, int, foo const&>
66 ,invoke_case<false, int, foo const&&>
67 ,invoke_case<false, int, std::reference_wrapper<foo const>>
68 ,invoke_case<false, int, foo, int>
69 ,invoke_case<false, int, foo*, int>
70 ,invoke_case<false, int, foo&, int>
71 ,invoke_case<false, int, foo&&, int>
72 ,invoke_case<false, int, std::reference_wrapper<foo>, int>
73 >();
74
75 run_tests<char(foo::*)()
76 ,invoke_case<false, void, foo>
77 ,invoke_case<false, void, foo*>
78 ,invoke_case<false, void, foo&>
79 ,invoke_case<false, void, foo&&>
80 ,invoke_case<false, void, std::reference_wrapper<foo>>
81 ,invoke_case<true, int, foo>
82 ,invoke_case<true, int, foo*>
83 ,invoke_case<true, int, foo&>
84 ,invoke_case<true, int, foo&&>
85 ,invoke_case<true, int, std::reference_wrapper<foo>>
86 >();
87
88 run_tests<void(foo::*)() LREF
89 ,invoke_case<false, void, foo>
90 ,invoke_case<true, void, foo*>
91 ,invoke_case<true, void, foo&>
92 ,invoke_case<false, int, foo*>
93 ,invoke_case<false, int, foo&>
94 ,invoke_case<false, void, foo&&>
95 ,invoke_case<true, void, std::reference_wrapper<foo>>
96 ,invoke_case<false, int, std::reference_wrapper<foo>>
97 ,invoke_case<false, void, foo const>
98 ,invoke_case<false, void, foo const*>
99 ,invoke_case<false, void, foo const&>
100 ,invoke_case<false, void, foo const&&>
101 ,invoke_case<false, void, std::reference_wrapper<foo const>>
102 ,invoke_case<false, void, foo, int>
103 ,invoke_case<false, void, foo*, int>
104 ,invoke_case<false, void, foo&, int>
105 ,invoke_case<false, void, foo&&, int>
106 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
107 >();
108
109 run_tests<void(foo::*)() RREF
110 ,invoke_case<true, void, foo>
111 ,invoke_case<false, int, foo>
112 ,invoke_case<false, void, foo*>
113 ,invoke_case<false, void, foo&>
114 ,invoke_case<true, void, foo&&>
115 ,invoke_case<false, int, foo&&>
116 ,invoke_case<false, void, std::reference_wrapper<foo>>
117 ,invoke_case<false, void, foo const>
118 ,invoke_case<false, void, foo const*>
119 ,invoke_case<false, void, foo const&>
120 ,invoke_case<false, void, foo const&&>
121 ,invoke_case<false, void, std::reference_wrapper<foo const>>
122 ,invoke_case<false, void, foo, int>
123 ,invoke_case<false, void, foo*, int>
124 ,invoke_case<false, void, foo&, int>
125 ,invoke_case<false, void, foo&&, int>
126 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
127 >();
128
129 run_tests<void(foo::*)() const
130 ,invoke_case<true, void, foo>
131 ,invoke_case<true, void, foo*>
132 ,invoke_case<true, void, foo&>
133 ,invoke_case<true, void, foo&&>
134 ,invoke_case<true, void, std::reference_wrapper<foo>>
135 ,invoke_case<true, void, foo const>
136 ,invoke_case<true, void, foo const*>
137 ,invoke_case<true, void, foo const&>
138 ,invoke_case<true, void, foo const&&>
139 ,invoke_case<true, void, std::reference_wrapper<foo const>>
140 ,invoke_case<false, int, foo>
141 ,invoke_case<false, int, foo*>
142 ,invoke_case<false, int, foo&>
143 ,invoke_case<false, int, foo&&>
144 ,invoke_case<false, int, std::reference_wrapper<foo>>
145 ,invoke_case<false, int, foo const>
146 ,invoke_case<false, int, foo const*>
147 ,invoke_case<false, int, foo const&>
148 ,invoke_case<false, int, foo const&&>
149 ,invoke_case<false, int, std::reference_wrapper<foo const>>
150 ,invoke_case<false, void, foo, int>
151 ,invoke_case<false, void, foo*, int>
152 ,invoke_case<false, void, foo&, int>
153 ,invoke_case<false, void, foo&&, int>
154 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
155 >();
156
157 // MSVC doesn't handle cv + ref qualifiers in expression sfinae correctly
158 #ifndef BOOST_CLBL_TRTS_MSVC
159
160 run_tests<void(foo::*)() const LREF
161 ,invoke_case<false, void, foo>
162 ,invoke_case<true, void, foo*>
163 ,invoke_case<true, void, foo&>
164 ,invoke_case<false, int, foo*>
165 ,invoke_case<false, int, foo&>
166 ,invoke_case<false, void, foo&&>
167 ,invoke_case<true, void, std::reference_wrapper<foo>>
168 ,invoke_case<false, int, std::reference_wrapper<foo>>
169 ,invoke_case<false, void, foo const>
170 ,invoke_case<true, void, foo const*>
171 ,invoke_case<true, void, foo const&>
172 ,invoke_case<false, int, foo const*>
173 ,invoke_case<false, int, foo const&>
174 ,invoke_case<false, void, foo const&&>
175 ,invoke_case<true, void, std::reference_wrapper<foo const>>
176 ,invoke_case<false, int, std::reference_wrapper<foo const>>
177 ,invoke_case<false, void, foo, int>
178 ,invoke_case<false, void, foo*, int>
179 ,invoke_case<false, void, foo&, int>
180 ,invoke_case<false, void, foo&&, int>
181 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
182 >();
183
184 run_tests<void(foo::*)() const RREF
185 ,invoke_case<true, void, foo>
186 ,invoke_case<false, int, foo>
187 ,invoke_case<false, void, foo*>
188 ,invoke_case<false, void, foo&>
189 ,invoke_case<true, void, foo&&>
190 ,invoke_case<false, int, foo&&>
191 ,invoke_case<false, void, std::reference_wrapper<foo>>
192 ,invoke_case<true, void, foo const>
193 ,invoke_case<false, int, foo const>
194 ,invoke_case<false, void, foo const*>
195 ,invoke_case<false, void, foo const&>
196 ,invoke_case<true, void, foo const&&>
197 ,invoke_case<false, int, foo const&&>
198 ,invoke_case<false, void, std::reference_wrapper<foo const>>
199 ,invoke_case<false, void, foo, int>
200 ,invoke_case<false, void, foo*, int>
201 ,invoke_case<false, void, foo&, int>
202 ,invoke_case<false, void, foo&&, int>
203 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
204 >();
205
206 #endif // #ifndef BOOST_CLBL_TRTS_MSVC
207
208 run_tests<int
209 ,invoke_case<false, void, foo>
210 ,invoke_case<false, void, foo*>
211 ,invoke_case<false, void, foo&>
212 ,invoke_case<false, void, foo&&>
213 ,invoke_case<false, void, std::reference_wrapper<foo>>
214 ,invoke_case<false, void, foo const>
215 ,invoke_case<false, void, foo const*>
216 ,invoke_case<false, void, foo const&>
217 ,invoke_case<false, void, foo const&&>
218 ,invoke_case<false, void, std::reference_wrapper<foo const>>
219 ,invoke_case<false, void, foo, int>
220 ,invoke_case<false, void, foo*, int>
221 ,invoke_case<false, void, foo&, int>
222 ,invoke_case<false, void, foo&&, int>
223 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
224 >();
225
226 auto f = [](int){};
227
228 run_tests<decltype(f)
229 ,invoke_case<true, void, int>
230 ,invoke_case<true, void, char>
231 ,invoke_case<false, int, int>
232 ,invoke_case<false, int, char>
233 ,invoke_case<false, void, void*>
234 >();
235
236 run_tests<void(int)
237 ,invoke_case<true, void, int>
238 ,invoke_case<true, void, char>
239 ,invoke_case<false, int, int>
240 ,invoke_case<false, int, char>
241 ,invoke_case<false, void, void*>
242 >();
243
244 run_tests<void()
245 ,invoke_case<false, void, int>
246 ,invoke_case<false, void, char>
247 ,invoke_case<false, void, void*>
248 >();
249
250 run_tests<void
251 ,invoke_case<false, void, foo>
252 ,invoke_case<false, void, foo*>
253 ,invoke_case<false, void, foo&>
254 ,invoke_case<false, void, foo&&>
255 ,invoke_case<false, void, std::reference_wrapper<foo>>
256 ,invoke_case<false, void, foo const>
257 ,invoke_case<false, void, foo const*>
258 ,invoke_case<false, void, foo const&>
259 ,invoke_case<false, void, foo const&&>
260 ,invoke_case<false, void, std::reference_wrapper<foo const>>
261 ,invoke_case<false, void, foo, int>
262 ,invoke_case<false, void, foo*, int>
263 ,invoke_case<false, void, foo&, int>
264 ,invoke_case<false, void, foo&&, int>
265 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
266 >();
267
268
269 run_tests<int
270 ,invoke_case<false, void, foo>
271 ,invoke_case<false, void, foo*>
272 ,invoke_case<false, void, foo&>
273 ,invoke_case<false, void, foo&&>
274 ,invoke_case<false, void, std::reference_wrapper<foo>>
275 ,invoke_case<false, void, foo const>
276 ,invoke_case<false, void, foo const*>
277 ,invoke_case<false, void, foo const&>
278 ,invoke_case<false, void, foo const&&>
279 ,invoke_case<false, void, std::reference_wrapper<foo const>>
280 ,invoke_case<false, void, foo, int>
281 ,invoke_case<false, void, foo*, int>
282 ,invoke_case<false, void, foo&, int>
283 ,invoke_case<false, void, foo&&, int>
284 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
285 >();
286
287 run_tests<void*
288 ,invoke_case<false, void, foo>
289 ,invoke_case<false, void, foo*>
290 ,invoke_case<false, void, foo&>
291 ,invoke_case<false, void, foo&&>
292 ,invoke_case<false, void, std::reference_wrapper<foo>>
293 ,invoke_case<false, void, foo const>
294 ,invoke_case<false, void, foo const*>
295 ,invoke_case<false, void, foo const&>
296 ,invoke_case<false, void, foo const&&>
297 ,invoke_case<false, void, std::reference_wrapper<foo const>>
298 ,invoke_case<false, void, foo, int>
299 ,invoke_case<false, void, foo*, int>
300 ,invoke_case<false, void, foo&, int>
301 ,invoke_case<false, void, foo&&, int>
302 ,invoke_case<false, void, std::reference_wrapper<foo>, int>
303 >();
304 }
305
306 #endif //#ifdef BOOST_CLBL_TRTS_GCC_OLDER_THAN_4_9_2