root / lab4 / .minix-src / include / c++ / __functional_base
History | View | Annotate | Download (18.2 KB)
1 | 13 | up20180614 | // -*- C++ -*- |
---|---|---|---|
2 | //===----------------------------------------------------------------------===// |
||
3 | // |
||
4 | // The LLVM Compiler Infrastructure |
||
5 | // |
||
6 | // This file is dual licensed under the MIT and the University of Illinois Open |
||
7 | // Source Licenses. See LICENSE.TXT for details. |
||
8 | // |
||
9 | //===----------------------------------------------------------------------===// |
||
10 | |||
11 | #ifndef _LIBCPP_FUNCTIONAL_BASE |
||
12 | #define _LIBCPP_FUNCTIONAL_BASE |
||
13 | |||
14 | #include <__config> |
||
15 | #include <type_traits> |
||
16 | #include <typeinfo> |
||
17 | #include <exception> |
||
18 | #include <new> |
||
19 | |||
20 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
||
21 | #pragma GCC system_header |
||
22 | #endif |
||
23 | |||
24 | _LIBCPP_BEGIN_NAMESPACE_STD |
||
25 | |||
26 | template <class _Arg, class _Result> |
||
27 | struct _LIBCPP_TYPE_VIS_ONLY unary_function |
||
28 | { |
||
29 | typedef _Arg argument_type; |
||
30 | typedef _Result result_type; |
||
31 | }; |
||
32 | |||
33 | template <class _Arg1, class _Arg2, class _Result> |
||
34 | struct _LIBCPP_TYPE_VIS_ONLY binary_function |
||
35 | { |
||
36 | typedef _Arg1 first_argument_type; |
||
37 | typedef _Arg2 second_argument_type; |
||
38 | typedef _Result result_type; |
||
39 | }; |
||
40 | |||
41 | template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash; |
||
42 | |||
43 | template <class _Tp> |
||
44 | struct __has_result_type |
||
45 | { |
||
46 | private: |
||
47 | struct __two {char __lx; char __lxx;}; |
||
48 | template <class _Up> static __two __test(...); |
||
49 | template <class _Up> static char __test(typename _Up::result_type* = 0); |
||
50 | public: |
||
51 | static const bool value = sizeof(__test<_Tp>(0)) == 1; |
||
52 | }; |
||
53 | |||
54 | #if _LIBCPP_STD_VER > 11 |
||
55 | template <class _Tp = void> |
||
56 | #else |
||
57 | template <class _Tp> |
||
58 | #endif |
||
59 | struct _LIBCPP_TYPE_VIS_ONLY less : binary_function<_Tp, _Tp, bool> |
||
60 | { |
||
61 | _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY |
||
62 | bool operator()(const _Tp& __x, const _Tp& __y) const |
||
63 | {return __x < __y;} |
||
64 | }; |
||
65 | |||
66 | #if _LIBCPP_STD_VER > 11 |
||
67 | template <> |
||
68 | struct _LIBCPP_TYPE_VIS_ONLY less<void> |
||
69 | { |
||
70 | template <class _T1, class _T2> |
||
71 | _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY |
||
72 | auto operator()(_T1&& __t, _T2&& __u) const |
||
73 | _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u))) |
||
74 | -> decltype (_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u)) |
||
75 | { return _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u); } |
||
76 | typedef void is_transparent; |
||
77 | }; |
||
78 | #endif |
||
79 | |||
80 | // addressof |
||
81 | |||
82 | template <class _Tp> |
||
83 | inline _LIBCPP_INLINE_VISIBILITY |
||
84 | _Tp* |
||
85 | addressof(_Tp& __x) _NOEXCEPT |
||
86 | { |
||
87 | return (_Tp*)&reinterpret_cast<const volatile char&>(__x); |
||
88 | } |
||
89 | |||
90 | #if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF) |
||
91 | // Objective-C++ Automatic Reference Counting uses qualified pointers |
||
92 | // that require special addressof() signatures. When |
||
93 | // _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler |
||
94 | // itself is providing these definitions. Otherwise, we provide them. |
||
95 | template <class _Tp> |
||
96 | inline _LIBCPP_INLINE_VISIBILITY |
||
97 | __strong _Tp* |
||
98 | addressof(__strong _Tp& __x) _NOEXCEPT |
||
99 | { |
||
100 | return &__x; |
||
101 | } |
||
102 | |||
103 | #ifdef _LIBCPP_HAS_OBJC_ARC_WEAK |
||
104 | template <class _Tp> |
||
105 | inline _LIBCPP_INLINE_VISIBILITY |
||
106 | __weak _Tp* |
||
107 | addressof(__weak _Tp& __x) _NOEXCEPT |
||
108 | { |
||
109 | return &__x; |
||
110 | } |
||
111 | #endif |
||
112 | |||
113 | template <class _Tp> |
||
114 | inline _LIBCPP_INLINE_VISIBILITY |
||
115 | __autoreleasing _Tp* |
||
116 | addressof(__autoreleasing _Tp& __x) _NOEXCEPT |
||
117 | { |
||
118 | return &__x; |
||
119 | } |
||
120 | |||
121 | template <class _Tp> |
||
122 | inline _LIBCPP_INLINE_VISIBILITY |
||
123 | __unsafe_unretained _Tp* |
||
124 | addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT |
||
125 | { |
||
126 | return &__x; |
||
127 | } |
||
128 | #endif |
||
129 | |||
130 | |||
131 | // __weak_result_type |
||
132 | |||
133 | template <class _Tp> |
||
134 | struct __derives_from_unary_function |
||
135 | { |
||
136 | private: |
||
137 | struct __two {char __lx; char __lxx;}; |
||
138 | static __two __test(...); |
||
139 | template <class _Ap, class _Rp> |
||
140 | static unary_function<_Ap, _Rp> |
||
141 | __test(const volatile unary_function<_Ap, _Rp>*); |
||
142 | public: |
||
143 | static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; |
||
144 | typedef decltype(__test((_Tp*)0)) type; |
||
145 | }; |
||
146 | |||
147 | template <class _Tp> |
||
148 | struct __derives_from_binary_function |
||
149 | { |
||
150 | private: |
||
151 | struct __two {char __lx; char __lxx;}; |
||
152 | static __two __test(...); |
||
153 | template <class _A1, class _A2, class _Rp> |
||
154 | static binary_function<_A1, _A2, _Rp> |
||
155 | __test(const volatile binary_function<_A1, _A2, _Rp>*); |
||
156 | public: |
||
157 | static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; |
||
158 | typedef decltype(__test((_Tp*)0)) type; |
||
159 | }; |
||
160 | |||
161 | template <class _Tp, bool = __derives_from_unary_function<_Tp>::value> |
||
162 | struct __maybe_derive_from_unary_function // bool is true |
||
163 | : public __derives_from_unary_function<_Tp>::type |
||
164 | { |
||
165 | }; |
||
166 | |||
167 | template <class _Tp> |
||
168 | struct __maybe_derive_from_unary_function<_Tp, false> |
||
169 | { |
||
170 | }; |
||
171 | |||
172 | template <class _Tp, bool = __derives_from_binary_function<_Tp>::value> |
||
173 | struct __maybe_derive_from_binary_function // bool is true |
||
174 | : public __derives_from_binary_function<_Tp>::type |
||
175 | { |
||
176 | }; |
||
177 | |||
178 | template <class _Tp> |
||
179 | struct __maybe_derive_from_binary_function<_Tp, false> |
||
180 | { |
||
181 | }; |
||
182 | |||
183 | template <class _Tp, bool = __has_result_type<_Tp>::value> |
||
184 | struct __weak_result_type_imp // bool is true |
||
185 | : public __maybe_derive_from_unary_function<_Tp>, |
||
186 | public __maybe_derive_from_binary_function<_Tp> |
||
187 | { |
||
188 | typedef typename _Tp::result_type result_type; |
||
189 | }; |
||
190 | |||
191 | template <class _Tp> |
||
192 | struct __weak_result_type_imp<_Tp, false> |
||
193 | : public __maybe_derive_from_unary_function<_Tp>, |
||
194 | public __maybe_derive_from_binary_function<_Tp> |
||
195 | { |
||
196 | }; |
||
197 | |||
198 | template <class _Tp> |
||
199 | struct __weak_result_type |
||
200 | : public __weak_result_type_imp<_Tp> |
||
201 | { |
||
202 | }; |
||
203 | |||
204 | // 0 argument case |
||
205 | |||
206 | template <class _Rp> |
||
207 | struct __weak_result_type<_Rp ()> |
||
208 | { |
||
209 | typedef _Rp result_type; |
||
210 | }; |
||
211 | |||
212 | template <class _Rp> |
||
213 | struct __weak_result_type<_Rp (&)()> |
||
214 | { |
||
215 | typedef _Rp result_type; |
||
216 | }; |
||
217 | |||
218 | template <class _Rp> |
||
219 | struct __weak_result_type<_Rp (*)()> |
||
220 | { |
||
221 | typedef _Rp result_type; |
||
222 | }; |
||
223 | |||
224 | // 1 argument case |
||
225 | |||
226 | template <class _Rp, class _A1> |
||
227 | struct __weak_result_type<_Rp (_A1)> |
||
228 | : public unary_function<_A1, _Rp> |
||
229 | { |
||
230 | }; |
||
231 | |||
232 | template <class _Rp, class _A1> |
||
233 | struct __weak_result_type<_Rp (&)(_A1)> |
||
234 | : public unary_function<_A1, _Rp> |
||
235 | { |
||
236 | }; |
||
237 | |||
238 | template <class _Rp, class _A1> |
||
239 | struct __weak_result_type<_Rp (*)(_A1)> |
||
240 | : public unary_function<_A1, _Rp> |
||
241 | { |
||
242 | }; |
||
243 | |||
244 | template <class _Rp, class _Cp> |
||
245 | struct __weak_result_type<_Rp (_Cp::*)()> |
||
246 | : public unary_function<_Cp*, _Rp> |
||
247 | { |
||
248 | }; |
||
249 | |||
250 | template <class _Rp, class _Cp> |
||
251 | struct __weak_result_type<_Rp (_Cp::*)() const> |
||
252 | : public unary_function<const _Cp*, _Rp> |
||
253 | { |
||
254 | }; |
||
255 | |||
256 | template <class _Rp, class _Cp> |
||
257 | struct __weak_result_type<_Rp (_Cp::*)() volatile> |
||
258 | : public unary_function<volatile _Cp*, _Rp> |
||
259 | { |
||
260 | }; |
||
261 | |||
262 | template <class _Rp, class _Cp> |
||
263 | struct __weak_result_type<_Rp (_Cp::*)() const volatile> |
||
264 | : public unary_function<const volatile _Cp*, _Rp> |
||
265 | { |
||
266 | }; |
||
267 | |||
268 | // 2 argument case |
||
269 | |||
270 | template <class _Rp, class _A1, class _A2> |
||
271 | struct __weak_result_type<_Rp (_A1, _A2)> |
||
272 | : public binary_function<_A1, _A2, _Rp> |
||
273 | { |
||
274 | }; |
||
275 | |||
276 | template <class _Rp, class _A1, class _A2> |
||
277 | struct __weak_result_type<_Rp (*)(_A1, _A2)> |
||
278 | : public binary_function<_A1, _A2, _Rp> |
||
279 | { |
||
280 | }; |
||
281 | |||
282 | template <class _Rp, class _A1, class _A2> |
||
283 | struct __weak_result_type<_Rp (&)(_A1, _A2)> |
||
284 | : public binary_function<_A1, _A2, _Rp> |
||
285 | { |
||
286 | }; |
||
287 | |||
288 | template <class _Rp, class _Cp, class _A1> |
||
289 | struct __weak_result_type<_Rp (_Cp::*)(_A1)> |
||
290 | : public binary_function<_Cp*, _A1, _Rp> |
||
291 | { |
||
292 | }; |
||
293 | |||
294 | template <class _Rp, class _Cp, class _A1> |
||
295 | struct __weak_result_type<_Rp (_Cp::*)(_A1) const> |
||
296 | : public binary_function<const _Cp*, _A1, _Rp> |
||
297 | { |
||
298 | }; |
||
299 | |||
300 | template <class _Rp, class _Cp, class _A1> |
||
301 | struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile> |
||
302 | : public binary_function<volatile _Cp*, _A1, _Rp> |
||
303 | { |
||
304 | }; |
||
305 | |||
306 | template <class _Rp, class _Cp, class _A1> |
||
307 | struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile> |
||
308 | : public binary_function<const volatile _Cp*, _A1, _Rp> |
||
309 | { |
||
310 | }; |
||
311 | |||
312 | |||
313 | #ifndef _LIBCPP_HAS_NO_VARIADICS |
||
314 | // 3 or more arguments |
||
315 | |||
316 | template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> |
||
317 | struct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)> |
||
318 | { |
||
319 | typedef _Rp result_type; |
||
320 | }; |
||
321 | |||
322 | template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> |
||
323 | struct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)> |
||
324 | { |
||
325 | typedef _Rp result_type; |
||
326 | }; |
||
327 | |||
328 | template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> |
||
329 | struct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)> |
||
330 | { |
||
331 | typedef _Rp result_type; |
||
332 | }; |
||
333 | |||
334 | template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> |
||
335 | struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)> |
||
336 | { |
||
337 | typedef _Rp result_type; |
||
338 | }; |
||
339 | |||
340 | template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> |
||
341 | struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const> |
||
342 | { |
||
343 | typedef _Rp result_type; |
||
344 | }; |
||
345 | |||
346 | template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> |
||
347 | struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile> |
||
348 | { |
||
349 | typedef _Rp result_type; |
||
350 | }; |
||
351 | |||
352 | template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> |
||
353 | struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile> |
||
354 | { |
||
355 | typedef _Rp result_type; |
||
356 | }; |
||
357 | |||
358 | #endif // _LIBCPP_HAS_NO_VARIADICS |
||
359 | |||
360 | // __invoke |
||
361 | |||
362 | #ifndef _LIBCPP_HAS_NO_VARIADICS |
||
363 | |||
364 | // bullets 1 and 2 |
||
365 | |||
366 | template <class _Fp, class _A0, class ..._Args, |
||
367 | class> |
||
368 | inline _LIBCPP_INLINE_VISIBILITY |
||
369 | auto |
||
370 | __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) |
||
371 | -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...)) |
||
372 | { |
||
373 | return (_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...); |
||
374 | } |
||
375 | |||
376 | template <class _Fp, class _A0, class ..._Args, |
||
377 | class> |
||
378 | inline _LIBCPP_INLINE_VISIBILITY |
||
379 | auto |
||
380 | __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) |
||
381 | -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...)) |
||
382 | { |
||
383 | return ((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...); |
||
384 | } |
||
385 | |||
386 | // bullets 3 and 4 |
||
387 | |||
388 | template <class _Fp, class _A0, |
||
389 | class> |
||
390 | inline _LIBCPP_INLINE_VISIBILITY |
||
391 | auto |
||
392 | __invoke(_Fp&& __f, _A0&& __a0) |
||
393 | -> decltype(_VSTD::forward<_A0>(__a0).*__f) |
||
394 | { |
||
395 | return _VSTD::forward<_A0>(__a0).*__f; |
||
396 | } |
||
397 | |||
398 | template <class _Fp, class _A0, |
||
399 | class> |
||
400 | inline _LIBCPP_INLINE_VISIBILITY |
||
401 | auto |
||
402 | __invoke(_Fp&& __f, _A0&& __a0) |
||
403 | -> decltype((*_VSTD::forward<_A0>(__a0)).*__f) |
||
404 | { |
||
405 | return (*_VSTD::forward<_A0>(__a0)).*__f; |
||
406 | } |
||
407 | |||
408 | // bullet 5 |
||
409 | |||
410 | template <class _Fp, class ..._Args> |
||
411 | inline _LIBCPP_INLINE_VISIBILITY |
||
412 | auto |
||
413 | __invoke(_Fp&& __f, _Args&& ...__args) |
||
414 | -> decltype(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...)) |
||
415 | { |
||
416 | return _VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...); |
||
417 | } |
||
418 | template <class _Tp, class ..._Args> |
||
419 | struct __invoke_return |
||
420 | { |
||
421 | typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type; |
||
422 | }; |
||
423 | |||
424 | #else // _LIBCPP_HAS_NO_VARIADICS |
||
425 | |||
426 | #include <__functional_base_03> |
||
427 | |||
428 | #endif // _LIBCPP_HAS_NO_VARIADICS |
||
429 | |||
430 | |||
431 | template <class _Ret> |
||
432 | struct __invoke_void_return_wrapper |
||
433 | { |
||
434 | #ifndef _LIBCPP_HAS_NO_VARIADICS |
||
435 | template <class ..._Args> |
||
436 | static _Ret __call(_Args&&... __args) { |
||
437 | return __invoke(_VSTD::forward<_Args>(__args)...); |
||
438 | } |
||
439 | #else |
||
440 | template <class _Fn> |
||
441 | static _Ret __call(_Fn __f) { |
||
442 | return __invoke(__f); |
||
443 | } |
||
444 | |||
445 | template <class _Fn, class _A0> |
||
446 | static _Ret __call(_Fn __f, _A0& __a0) { |
||
447 | return __invoke(__f, __a0); |
||
448 | } |
||
449 | |||
450 | template <class _Fn, class _A0, class _A1> |
||
451 | static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1) { |
||
452 | return __invoke(__f, __a0, __a1); |
||
453 | } |
||
454 | |||
455 | template <class _Fn, class _A0, class _A1, class _A2> |
||
456 | static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2){ |
||
457 | return __invoke(__f, __a0, __a1, __a2); |
||
458 | } |
||
459 | #endif |
||
460 | }; |
||
461 | |||
462 | template <> |
||
463 | struct __invoke_void_return_wrapper<void> |
||
464 | { |
||
465 | #ifndef _LIBCPP_HAS_NO_VARIADICS |
||
466 | template <class ..._Args> |
||
467 | static void __call(_Args&&... __args) { |
||
468 | __invoke(_VSTD::forward<_Args>(__args)...); |
||
469 | } |
||
470 | #else |
||
471 | template <class _Fn> |
||
472 | static void __call(_Fn __f) { |
||
473 | __invoke(__f); |
||
474 | } |
||
475 | |||
476 | template <class _Fn, class _A0> |
||
477 | static void __call(_Fn __f, _A0& __a0) { |
||
478 | __invoke(__f, __a0); |
||
479 | } |
||
480 | |||
481 | template <class _Fn, class _A0, class _A1> |
||
482 | static void __call(_Fn __f, _A0& __a0, _A1& __a1) { |
||
483 | __invoke(__f, __a0, __a1); |
||
484 | } |
||
485 | |||
486 | template <class _Fn, class _A0, class _A1, class _A2> |
||
487 | static void __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2) { |
||
488 | __invoke(__f, __a0, __a1, __a2); |
||
489 | } |
||
490 | #endif |
||
491 | }; |
||
492 | |||
493 | template <class _Tp> |
||
494 | class _LIBCPP_TYPE_VIS_ONLY reference_wrapper |
||
495 | : public __weak_result_type<_Tp> |
||
496 | { |
||
497 | public: |
||
498 | // types |
||
499 | typedef _Tp type; |
||
500 | private: |
||
501 | type* __f_; |
||
502 | |||
503 | public: |
||
504 | // construct/copy/destroy |
||
505 | _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT |
||
506 | : __f_(_VSTD::addressof(__f)) {} |
||
507 | #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
||
508 | private: reference_wrapper(type&&); public: // = delete; // do not bind to temps |
||
509 | #endif |
||
510 | |||
511 | // access |
||
512 | _LIBCPP_INLINE_VISIBILITY operator type& () const _NOEXCEPT {return *__f_;} |
||
513 | _LIBCPP_INLINE_VISIBILITY type& get() const _NOEXCEPT {return *__f_;} |
||
514 | |||
515 | #ifndef _LIBCPP_HAS_NO_VARIADICS |
||
516 | // invoke |
||
517 | template <class... _ArgTypes> |
||
518 | _LIBCPP_INLINE_VISIBILITY |
||
519 | typename __invoke_of<type&, _ArgTypes...>::type |
||
520 | operator() (_ArgTypes&&... __args) const |
||
521 | { |
||
522 | return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...); |
||
523 | } |
||
524 | #else |
||
525 | |||
526 | _LIBCPP_INLINE_VISIBILITY |
||
527 | typename __invoke_return<type>::type |
||
528 | operator() () const |
||
529 | { |
||
530 | return __invoke(get()); |
||
531 | } |
||
532 | |||
533 | template <class _A0> |
||
534 | _LIBCPP_INLINE_VISIBILITY |
||
535 | typename __invoke_return0<type&, _A0>::type |
||
536 | operator() (_A0& __a0) const |
||
537 | { |
||
538 | return __invoke<type&, _A0>(get(), __a0); |
||
539 | } |
||
540 | |||
541 | template <class _A0, class _A1> |
||
542 | _LIBCPP_INLINE_VISIBILITY |
||
543 | typename __invoke_return1<type&, _A0, _A1>::type |
||
544 | operator() (_A0& __a0, _A1& __a1) const |
||
545 | { |
||
546 | return __invoke<type&, _A0, _A1>(get(), __a0, __a1); |
||
547 | } |
||
548 | |||
549 | template <class _A0, class _A1, class _A2> |
||
550 | _LIBCPP_INLINE_VISIBILITY |
||
551 | typename __invoke_return2<type&, _A0, _A1, _A2>::type |
||
552 | operator() (_A0& __a0, _A1& __a1, _A2& __a2) const |
||
553 | { |
||
554 | return __invoke<type&, _A0, _A1, _A2>(get(), __a0, __a1, __a2); |
||
555 | } |
||
556 | #endif // _LIBCPP_HAS_NO_VARIADICS |
||
557 | }; |
||
558 | |||
559 | template <class _Tp> struct __is_reference_wrapper_impl : public false_type {}; |
||
560 | template <class _Tp> struct __is_reference_wrapper_impl<reference_wrapper<_Tp> > : public true_type {}; |
||
561 | template <class _Tp> struct __is_reference_wrapper |
||
562 | : public __is_reference_wrapper_impl<typename remove_cv<_Tp>::type> {}; |
||
563 | |||
564 | template <class _Tp> |
||
565 | inline _LIBCPP_INLINE_VISIBILITY |
||
566 | reference_wrapper<_Tp> |
||
567 | ref(_Tp& __t) _NOEXCEPT |
||
568 | { |
||
569 | return reference_wrapper<_Tp>(__t); |
||
570 | } |
||
571 | |||
572 | template <class _Tp> |
||
573 | inline _LIBCPP_INLINE_VISIBILITY |
||
574 | reference_wrapper<_Tp> |
||
575 | ref(reference_wrapper<_Tp> __t) _NOEXCEPT |
||
576 | { |
||
577 | return ref(__t.get()); |
||
578 | } |
||
579 | |||
580 | template <class _Tp> |
||
581 | inline _LIBCPP_INLINE_VISIBILITY |
||
582 | reference_wrapper<const _Tp> |
||
583 | cref(const _Tp& __t) _NOEXCEPT |
||
584 | { |
||
585 | return reference_wrapper<const _Tp>(__t); |
||
586 | } |
||
587 | |||
588 | template <class _Tp> |
||
589 | inline _LIBCPP_INLINE_VISIBILITY |
||
590 | reference_wrapper<const _Tp> |
||
591 | cref(reference_wrapper<_Tp> __t) _NOEXCEPT |
||
592 | { |
||
593 | return cref(__t.get()); |
||
594 | } |
||
595 | |||
596 | #ifndef _LIBCPP_HAS_NO_VARIADICS |
||
597 | #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
||
598 | #ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS |
||
599 | |||
600 | template <class _Tp> void ref(const _Tp&&) = delete; |
||
601 | template <class _Tp> void cref(const _Tp&&) = delete; |
||
602 | |||
603 | #else // _LIBCPP_HAS_NO_DELETED_FUNCTIONS |
||
604 | |||
605 | template <class _Tp> void ref(const _Tp&&);// = delete; |
||
606 | template <class _Tp> void cref(const _Tp&&);// = delete; |
||
607 | |||
608 | #endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS |
||
609 | |||
610 | #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
||
611 | |||
612 | #endif // _LIBCPP_HAS_NO_VARIADICS |
||
613 | |||
614 | #if _LIBCPP_STD_VER > 11 |
||
615 | template <class _Tp1, class _Tp2 = void> |
||
616 | struct __is_transparent |
||
617 | { |
||
618 | private: |
||
619 | struct __two {char __lx; char __lxx;}; |
||
620 | template <class _Up> static __two __test(...); |
||
621 | template <class _Up> static char __test(typename _Up::is_transparent* = 0); |
||
622 | public: |
||
623 | static const bool value = sizeof(__test<_Tp1>(0)) == 1; |
||
624 | }; |
||
625 | #endif |
||
626 | |||
627 | // allocator_arg_t |
||
628 | |||
629 | struct _LIBCPP_TYPE_VIS_ONLY allocator_arg_t { }; |
||
630 | |||
631 | #if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_MEMORY) |
||
632 | extern const allocator_arg_t allocator_arg; |
||
633 | #else |
||
634 | constexpr allocator_arg_t allocator_arg = allocator_arg_t(); |
||
635 | #endif |
||
636 | |||
637 | // uses_allocator |
||
638 | |||
639 | template <class _Tp> |
||
640 | struct __has_allocator_type |
||
641 | { |
||
642 | private: |
||
643 | struct __two {char __lx; char __lxx;}; |
||
644 | template <class _Up> static __two __test(...); |
||
645 | template <class _Up> static char __test(typename _Up::allocator_type* = 0); |
||
646 | public: |
||
647 | static const bool value = sizeof(__test<_Tp>(0)) == 1; |
||
648 | }; |
||
649 | |||
650 | template <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value> |
||
651 | struct __uses_allocator |
||
652 | : public integral_constant<bool, |
||
653 | is_convertible<_Alloc, typename _Tp::allocator_type>::value> |
||
654 | { |
||
655 | }; |
||
656 | |||
657 | template <class _Tp, class _Alloc> |
||
658 | struct __uses_allocator<_Tp, _Alloc, false> |
||
659 | : public false_type |
||
660 | { |
||
661 | }; |
||
662 | |||
663 | template <class _Tp, class _Alloc> |
||
664 | struct _LIBCPP_TYPE_VIS_ONLY uses_allocator |
||
665 | : public __uses_allocator<_Tp, _Alloc> |
||
666 | { |
||
667 | }; |
||
668 | |||
669 | #ifndef _LIBCPP_HAS_NO_VARIADICS |
||
670 | |||
671 | // allocator construction |
||
672 | |||
673 | template <class _Tp, class _Alloc, class ..._Args> |
||
674 | struct __uses_alloc_ctor_imp |
||
675 | { |
||
676 | static const bool __ua = uses_allocator<_Tp, _Alloc>::value; |
||
677 | static const bool __ic = |
||
678 | is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value; |
||
679 | static const int value = __ua ? 2 - __ic : 0; |
||
680 | }; |
||
681 | |||
682 | template <class _Tp, class _Alloc, class ..._Args> |
||
683 | struct __uses_alloc_ctor |
||
684 | : integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value> |
||
685 | {}; |
||
686 | |||
687 | template <class _Tp, class _Allocator, class... _Args> |
||
688 | inline _LIBCPP_INLINE_VISIBILITY |
||
689 | void __user_alloc_construct_impl (integral_constant<int, 0>, _Tp *__storage, const _Allocator &, _Args &&... __args ) |
||
690 | { |
||
691 | new (__storage) _Tp (_VSTD::forward<_Args>(__args)...); |
||
692 | } |
||
693 | |||
694 | template <class _Tp, class _Allocator, class... _Args> |
||
695 | inline _LIBCPP_INLINE_VISIBILITY |
||
696 | void __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, const _Allocator &__a, _Args &&... __args ) |
||
697 | { |
||
698 | new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...); |
||
699 | } |
||
700 | |||
701 | template <class _Tp, class _Allocator, class... _Args> |
||
702 | inline _LIBCPP_INLINE_VISIBILITY |
||
703 | void __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, const _Allocator &__a, _Args &&... __args ) |
||
704 | { |
||
705 | new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a); |
||
706 | } |
||
707 | |||
708 | template <class _Tp, class _Allocator, class... _Args> |
||
709 | inline _LIBCPP_INLINE_VISIBILITY |
||
710 | void __user_alloc_construct (_Tp *__storage, const _Allocator &__a, _Args &&... __args) |
||
711 | { |
||
712 | __user_alloc_construct_impl( |
||
713 | __uses_alloc_ctor<_Tp, _Allocator>(), |
||
714 | __storage, __a, _VSTD::forward<_Args>(__args)... |
||
715 | ); |
||
716 | } |
||
717 | #endif // _LIBCPP_HAS_NO_VARIADICS |
||
718 | |||
719 | _LIBCPP_END_NAMESPACE_STD |
||
720 | |||
721 | #endif // _LIBCPP_FUNCTIONAL_BASE |