]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/include/tr1/functional
libstdc++: Add attribute to features deprecated in C++17 [PR91260]
[thirdparty/gcc.git] / libstdc++-v3 / include / tr1 / functional
1 // TR1 functional header -*- C++ -*-
2
3 // Copyright (C) 2004-2022 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24
25 /** @file tr1/functional
26 * This is a TR1 C++ Library header.
27 */
28
29 #ifndef _GLIBCXX_TR1_FUNCTIONAL
30 #define _GLIBCXX_TR1_FUNCTIONAL 1
31
32 #pragma GCC system_header
33
34 #include <functional> // for std::_Placeholder, std::_Bind, std::_Bind_result
35
36 #include <typeinfo>
37 #include <new>
38 #include <tr1/tuple>
39 #include <tr1/type_traits>
40 #include <bits/stringfwd.h>
41 #include <tr1/functional_hash.h>
42 #include <ext/type_traits.h>
43 #include <bits/move.h> // for std::__addressof
44
45 namespace std _GLIBCXX_VISIBILITY(default)
46 {
47 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48
49 #if __cplusplus < 201103L
50 // In C++98 mode, <functional> doesn't declare std::placeholders::_1 etc.
51 // because they are not reserved names in C++98. However, they are reserved
52 // by <tr1/functional> so we can declare them here, in order to redeclare
53 // them in the std::tr1::placeholders namespace below.
54 namespace placeholders
55 {
56 extern const _Placeholder<1> _1;
57 extern const _Placeholder<2> _2;
58 extern const _Placeholder<3> _3;
59 extern const _Placeholder<4> _4;
60 extern const _Placeholder<5> _5;
61 extern const _Placeholder<6> _6;
62 extern const _Placeholder<7> _7;
63 extern const _Placeholder<8> _8;
64 extern const _Placeholder<9> _9;
65 extern const _Placeholder<10> _10;
66 extern const _Placeholder<11> _11;
67 extern const _Placeholder<12> _12;
68 extern const _Placeholder<13> _13;
69 extern const _Placeholder<14> _14;
70 extern const _Placeholder<15> _15;
71 extern const _Placeholder<16> _16;
72 extern const _Placeholder<17> _17;
73 extern const _Placeholder<18> _18;
74 extern const _Placeholder<19> _19;
75 extern const _Placeholder<20> _20;
76 extern const _Placeholder<21> _21;
77 extern const _Placeholder<22> _22;
78 extern const _Placeholder<23> _23;
79 extern const _Placeholder<24> _24;
80 extern const _Placeholder<25> _25;
81 extern const _Placeholder<26> _26;
82 extern const _Placeholder<27> _27;
83 extern const _Placeholder<28> _28;
84 extern const _Placeholder<29> _29;
85 }
86 #endif // C++98
87
88 namespace tr1
89 {
90 template<typename _MemberPointer>
91 class _Mem_fn;
92 template<typename _Tp, typename _Class>
93 _Mem_fn<_Tp _Class::*>
94 mem_fn(_Tp _Class::*);
95
96 /**
97 * Actual implementation of _Has_result_type, which uses SFINAE to
98 * determine if the type _Tp has a publicly-accessible member type
99 * result_type.
100 */
101 template<typename _Tp>
102 class _Has_result_type_helper : __sfinae_types
103 {
104 template<typename _Up>
105 struct _Wrap_type
106 { };
107
108 template<typename _Up>
109 static __one __test(_Wrap_type<typename _Up::result_type>*);
110
111 template<typename _Up>
112 static __two __test(...);
113
114 public:
115 static const bool value = sizeof(__test<_Tp>(0)) == 1;
116 };
117
118 template<typename _Tp>
119 struct _Has_result_type
120 : integral_constant<bool,
121 _Has_result_type_helper<typename remove_cv<_Tp>::type>::value>
122 { };
123
124 /**
125 *
126 */
127 /// If we have found a result_type, extract it.
128 template<bool _Has_result_type, typename _Functor>
129 struct _Maybe_get_result_type
130 { };
131
132 template<typename _Functor>
133 struct _Maybe_get_result_type<true, _Functor>
134 {
135 typedef typename _Functor::result_type result_type;
136 };
137
138 /**
139 * Base class for any function object that has a weak result type, as
140 * defined in 3.3/3 of TR1.
141 */
142 template<typename _Functor>
143 struct _Weak_result_type_impl
144 : _Maybe_get_result_type<_Has_result_type<_Functor>::value, _Functor>
145 {
146 };
147
148 /// Retrieve the result type for a function type.
149 template<typename _Res, typename... _ArgTypes>
150 struct _Weak_result_type_impl<_Res(_ArgTypes...)>
151 {
152 typedef _Res result_type;
153 };
154
155 /// Retrieve the result type for a function reference.
156 template<typename _Res, typename... _ArgTypes>
157 struct _Weak_result_type_impl<_Res(&)(_ArgTypes...)>
158 {
159 typedef _Res result_type;
160 };
161
162 /// Retrieve the result type for a function pointer.
163 template<typename _Res, typename... _ArgTypes>
164 struct _Weak_result_type_impl<_Res(*)(_ArgTypes...)>
165 {
166 typedef _Res result_type;
167 };
168
169 /// Retrieve result type for a member function pointer.
170 template<typename _Res, typename _Class, typename... _ArgTypes>
171 struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)>
172 {
173 typedef _Res result_type;
174 };
175
176 /// Retrieve result type for a const member function pointer.
177 template<typename _Res, typename _Class, typename... _ArgTypes>
178 struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) const>
179 {
180 typedef _Res result_type;
181 };
182
183 /// Retrieve result type for a volatile member function pointer.
184 template<typename _Res, typename _Class, typename... _ArgTypes>
185 struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) volatile>
186 {
187 typedef _Res result_type;
188 };
189
190 /// Retrieve result type for a const volatile member function pointer.
191 template<typename _Res, typename _Class, typename... _ArgTypes>
192 struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)const volatile>
193 {
194 typedef _Res result_type;
195 };
196
197 /**
198 * Strip top-level cv-qualifiers from the function object and let
199 * _Weak_result_type_impl perform the real work.
200 */
201 template<typename _Functor>
202 struct _Weak_result_type
203 : _Weak_result_type_impl<typename remove_cv<_Functor>::type>
204 {
205 };
206
207 template<typename _Signature>
208 class result_of;
209
210 /**
211 * Actual implementation of result_of. When _Has_result_type is
212 * true, gets its result from _Weak_result_type. Otherwise, uses
213 * the function object's member template result to extract the
214 * result type.
215 */
216 template<bool _Has_result_type, typename _Signature>
217 struct _Result_of_impl;
218
219 // Handle member data pointers using _Mem_fn's logic
220 template<typename _Res, typename _Class, typename _T1>
221 struct _Result_of_impl<false, _Res _Class::*(_T1)>
222 {
223 typedef typename _Mem_fn<_Res _Class::*>
224 ::template _Result_type<_T1>::type type;
225 };
226
227 /**
228 * Determine whether we can determine a result type from @c Functor
229 * alone.
230 */
231 template<typename _Functor, typename... _ArgTypes>
232 class result_of<_Functor(_ArgTypes...)>
233 : public _Result_of_impl<
234 _Has_result_type<_Weak_result_type<_Functor> >::value,
235 _Functor(_ArgTypes...)>
236 {
237 };
238
239 /// We already know the result type for @c Functor; use it.
240 template<typename _Functor, typename... _ArgTypes>
241 struct _Result_of_impl<true, _Functor(_ArgTypes...)>
242 {
243 typedef typename _Weak_result_type<_Functor>::result_type type;
244 };
245
246 /**
247 * We need to compute the result type for this invocation the hard
248 * way.
249 */
250 template<typename _Functor, typename... _ArgTypes>
251 struct _Result_of_impl<false, _Functor(_ArgTypes...)>
252 {
253 typedef typename _Functor
254 ::template result<_Functor(_ArgTypes...)>::type type;
255 };
256
257 /**
258 * It is unsafe to access ::result when there are zero arguments, so we
259 * return @c void instead.
260 */
261 template<typename _Functor>
262 struct _Result_of_impl<false, _Functor()>
263 {
264 typedef void type;
265 };
266
267 // Ignore warnings about std::unary_function and std::binary_function.
268 #pragma GCC diagnostic push
269 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
270
271 /// Determines if the type _Tp derives from unary_function.
272 template<typename _Tp>
273 struct _Derives_from_unary_function : __sfinae_types
274 {
275 private:
276 template<typename _T1, typename _Res>
277 static __one __test(const volatile unary_function<_T1, _Res>*);
278
279 // It's tempting to change "..." to const volatile void*, but
280 // that fails when _Tp is a function type.
281 static __two __test(...);
282
283 public:
284 static const bool value = sizeof(__test((_Tp*)0)) == 1;
285 };
286
287 /// Determines if the type _Tp derives from binary_function.
288 template<typename _Tp>
289 struct _Derives_from_binary_function : __sfinae_types
290 {
291 private:
292 template<typename _T1, typename _T2, typename _Res>
293 static __one __test(const volatile binary_function<_T1, _T2, _Res>*);
294
295 // It's tempting to change "..." to const volatile void*, but
296 // that fails when _Tp is a function type.
297 static __two __test(...);
298
299 public:
300 static const bool value = sizeof(__test((_Tp*)0)) == 1;
301 };
302
303 /// Turns a function type into a function pointer type
304 template<typename _Tp, bool _IsFunctionType = is_function<_Tp>::value>
305 struct _Function_to_function_pointer
306 {
307 typedef _Tp type;
308 };
309
310 template<typename _Tp>
311 struct _Function_to_function_pointer<_Tp, true>
312 {
313 typedef _Tp* type;
314 };
315
316 /**
317 * Invoke a function object, which may be either a member pointer or a
318 * function object. The first parameter will tell which.
319 */
320 template<typename _Functor, typename... _Args>
321 inline
322 typename __gnu_cxx::__enable_if<
323 (!is_member_pointer<_Functor>::value
324 && !is_function<_Functor>::value
325 && !is_function<typename remove_pointer<_Functor>::type>::value),
326 typename result_of<_Functor(_Args...)>::type
327 >::__type
328 __invoke(_Functor& __f, _Args&... __args)
329 {
330 return __f(__args...);
331 }
332
333 template<typename _Functor, typename... _Args>
334 inline
335 typename __gnu_cxx::__enable_if<
336 (is_member_pointer<_Functor>::value
337 && !is_function<_Functor>::value
338 && !is_function<typename remove_pointer<_Functor>::type>::value),
339 typename result_of<_Functor(_Args...)>::type
340 >::__type
341 __invoke(_Functor& __f, _Args&... __args)
342 {
343 return mem_fn(__f)(__args...);
344 }
345
346 // To pick up function references (that will become function pointers)
347 template<typename _Functor, typename... _Args>
348 inline
349 typename __gnu_cxx::__enable_if<
350 (is_pointer<_Functor>::value
351 && is_function<typename remove_pointer<_Functor>::type>::value),
352 typename result_of<_Functor(_Args...)>::type
353 >::__type
354 __invoke(_Functor __f, _Args&... __args)
355 {
356 return __f(__args...);
357 }
358
359 /**
360 * Knowing which of unary_function and binary_function _Tp derives
361 * from, derives from the same and ensures that reference_wrapper
362 * will have a weak result type. See cases below.
363 */
364 template<bool _Unary, bool _Binary, typename _Tp>
365 struct _Reference_wrapper_base_impl;
366
367 // Not a unary_function or binary_function, so try a weak result type.
368 template<typename _Tp>
369 struct _Reference_wrapper_base_impl<false, false, _Tp>
370 : _Weak_result_type<_Tp>
371 { };
372
373 // unary_function but not binary_function
374 template<typename _Tp>
375 struct _Reference_wrapper_base_impl<true, false, _Tp>
376 : unary_function<typename _Tp::argument_type,
377 typename _Tp::result_type>
378 { };
379
380 // binary_function but not unary_function
381 template<typename _Tp>
382 struct _Reference_wrapper_base_impl<false, true, _Tp>
383 : binary_function<typename _Tp::first_argument_type,
384 typename _Tp::second_argument_type,
385 typename _Tp::result_type>
386 { };
387
388 // Both unary_function and binary_function. Import result_type to
389 // avoid conflicts.
390 template<typename _Tp>
391 struct _Reference_wrapper_base_impl<true, true, _Tp>
392 : unary_function<typename _Tp::argument_type,
393 typename _Tp::result_type>,
394 binary_function<typename _Tp::first_argument_type,
395 typename _Tp::second_argument_type,
396 typename _Tp::result_type>
397 {
398 typedef typename _Tp::result_type result_type;
399 };
400
401 /**
402 * Derives from unary_function or binary_function when it
403 * can. Specializations handle all of the easy cases. The primary
404 * template determines what to do with a class type, which may
405 * derive from both unary_function and binary_function.
406 */
407 template<typename _Tp>
408 struct _Reference_wrapper_base
409 : _Reference_wrapper_base_impl<
410 _Derives_from_unary_function<_Tp>::value,
411 _Derives_from_binary_function<_Tp>::value,
412 _Tp>
413 { };
414
415 // - a function type (unary)
416 template<typename _Res, typename _T1>
417 struct _Reference_wrapper_base<_Res(_T1)>
418 : unary_function<_T1, _Res>
419 { };
420
421 // - a function type (binary)
422 template<typename _Res, typename _T1, typename _T2>
423 struct _Reference_wrapper_base<_Res(_T1, _T2)>
424 : binary_function<_T1, _T2, _Res>
425 { };
426
427 // - a function pointer type (unary)
428 template<typename _Res, typename _T1>
429 struct _Reference_wrapper_base<_Res(*)(_T1)>
430 : unary_function<_T1, _Res>
431 { };
432
433 // - a function pointer type (binary)
434 template<typename _Res, typename _T1, typename _T2>
435 struct _Reference_wrapper_base<_Res(*)(_T1, _T2)>
436 : binary_function<_T1, _T2, _Res>
437 { };
438
439 // - a pointer to member function type (unary, no qualifiers)
440 template<typename _Res, typename _T1>
441 struct _Reference_wrapper_base<_Res (_T1::*)()>
442 : unary_function<_T1*, _Res>
443 { };
444
445 // - a pointer to member function type (binary, no qualifiers)
446 template<typename _Res, typename _T1, typename _T2>
447 struct _Reference_wrapper_base<_Res (_T1::*)(_T2)>
448 : binary_function<_T1*, _T2, _Res>
449 { };
450
451 // - a pointer to member function type (unary, const)
452 template<typename _Res, typename _T1>
453 struct _Reference_wrapper_base<_Res (_T1::*)() const>
454 : unary_function<const _T1*, _Res>
455 { };
456
457 // - a pointer to member function type (binary, const)
458 template<typename _Res, typename _T1, typename _T2>
459 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const>
460 : binary_function<const _T1*, _T2, _Res>
461 { };
462
463 // - a pointer to member function type (unary, volatile)
464 template<typename _Res, typename _T1>
465 struct _Reference_wrapper_base<_Res (_T1::*)() volatile>
466 : unary_function<volatile _T1*, _Res>
467 { };
468
469 // - a pointer to member function type (binary, volatile)
470 template<typename _Res, typename _T1, typename _T2>
471 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) volatile>
472 : binary_function<volatile _T1*, _T2, _Res>
473 { };
474
475 // - a pointer to member function type (unary, const volatile)
476 template<typename _Res, typename _T1>
477 struct _Reference_wrapper_base<_Res (_T1::*)() const volatile>
478 : unary_function<const volatile _T1*, _Res>
479 { };
480
481 // - a pointer to member function type (binary, const volatile)
482 template<typename _Res, typename _T1, typename _T2>
483 struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const volatile>
484 : binary_function<const volatile _T1*, _T2, _Res>
485 { };
486
487 /// reference_wrapper
488 template<typename _Tp>
489 class reference_wrapper
490 : public _Reference_wrapper_base<typename remove_cv<_Tp>::type>
491 {
492 // If _Tp is a function type, we can't form result_of<_Tp(...)>,
493 // so turn it into a function pointer type.
494 typedef typename _Function_to_function_pointer<_Tp>::type
495 _M_func_type;
496
497 _Tp* _M_data;
498 public:
499 typedef _Tp type;
500
501 explicit
502 reference_wrapper(_Tp& __indata)
503 : _M_data(std::__addressof(__indata))
504 { }
505
506 reference_wrapper(const reference_wrapper<_Tp>& __inref):
507 _M_data(__inref._M_data)
508 { }
509
510 reference_wrapper&
511 operator=(const reference_wrapper<_Tp>& __inref)
512 {
513 _M_data = __inref._M_data;
514 return *this;
515 }
516
517 operator _Tp&() const
518 { return this->get(); }
519
520 _Tp&
521 get() const
522 { return *_M_data; }
523
524 template<typename... _Args>
525 typename result_of<_M_func_type(_Args...)>::type
526 operator()(_Args&... __args) const
527 {
528 return __invoke(get(), __args...);
529 }
530 };
531
532
533 // Denotes a reference should be taken to a variable.
534 template<typename _Tp>
535 inline reference_wrapper<_Tp>
536 ref(_Tp& __t)
537 { return reference_wrapper<_Tp>(__t); }
538
539 // Denotes a const reference should be taken to a variable.
540 template<typename _Tp>
541 inline reference_wrapper<const _Tp>
542 cref(const _Tp& __t)
543 { return reference_wrapper<const _Tp>(__t); }
544
545 template<typename _Tp>
546 inline reference_wrapper<_Tp>
547 ref(reference_wrapper<_Tp> __t)
548 { return ref(__t.get()); }
549
550 template<typename _Tp>
551 inline reference_wrapper<const _Tp>
552 cref(reference_wrapper<_Tp> __t)
553 { return cref(__t.get()); }
554
555 template<typename _Tp, bool>
556 struct _Mem_fn_const_or_non
557 {
558 typedef const _Tp& type;
559 };
560
561 template<typename _Tp>
562 struct _Mem_fn_const_or_non<_Tp, false>
563 {
564 typedef _Tp& type;
565 };
566
567 /**
568 * Derives from @c unary_function or @c binary_function, or perhaps
569 * nothing, depending on the number of arguments provided. The
570 * primary template is the basis case, which derives nothing.
571 */
572 template<typename _Res, typename... _ArgTypes>
573 struct _Maybe_unary_or_binary_function { };
574
575 /// Derives from @c unary_function, as appropriate.
576 template<typename _Res, typename _T1>
577 struct _Maybe_unary_or_binary_function<_Res, _T1>
578 : std::unary_function<_T1, _Res> { };
579
580 /// Derives from @c binary_function, as appropriate.
581 template<typename _Res, typename _T1, typename _T2>
582 struct _Maybe_unary_or_binary_function<_Res, _T1, _T2>
583 : std::binary_function<_T1, _T2, _Res> { };
584
585 /// Implementation of @c mem_fn for member function pointers.
586 template<typename _Res, typename _Class, typename... _ArgTypes>
587 class _Mem_fn<_Res (_Class::*)(_ArgTypes...)>
588 : public _Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...>
589 {
590 typedef _Res (_Class::*_Functor)(_ArgTypes...);
591
592 template<typename _Tp>
593 _Res
594 _M_call(_Tp& __object, const volatile _Class *,
595 _ArgTypes... __args) const
596 { return (__object.*__pmf)(__args...); }
597
598 template<typename _Tp>
599 _Res
600 _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const
601 { return ((*__ptr).*__pmf)(__args...); }
602
603 public:
604 typedef _Res result_type;
605
606 explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
607
608 // Handle objects
609 _Res
610 operator()(_Class& __object, _ArgTypes... __args) const
611 { return (__object.*__pmf)(__args...); }
612
613 // Handle pointers
614 _Res
615 operator()(_Class* __object, _ArgTypes... __args) const
616 { return (__object->*__pmf)(__args...); }
617
618 // Handle smart pointers, references and pointers to derived
619 template<typename _Tp>
620 _Res
621 operator()(_Tp& __object, _ArgTypes... __args) const
622 { return _M_call(__object, &__object, __args...); }
623
624 private:
625 _Functor __pmf;
626 };
627
628 /// Implementation of @c mem_fn for const member function pointers.
629 template<typename _Res, typename _Class, typename... _ArgTypes>
630 class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const>
631 : public _Maybe_unary_or_binary_function<_Res, const _Class*,
632 _ArgTypes...>
633 {
634 typedef _Res (_Class::*_Functor)(_ArgTypes...) const;
635
636 template<typename _Tp>
637 _Res
638 _M_call(_Tp& __object, const volatile _Class *,
639 _ArgTypes... __args) const
640 { return (__object.*__pmf)(__args...); }
641
642 template<typename _Tp>
643 _Res
644 _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const
645 { return ((*__ptr).*__pmf)(__args...); }
646
647 public:
648 typedef _Res result_type;
649
650 explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
651
652 // Handle objects
653 _Res
654 operator()(const _Class& __object, _ArgTypes... __args) const
655 { return (__object.*__pmf)(__args...); }
656
657 // Handle pointers
658 _Res
659 operator()(const _Class* __object, _ArgTypes... __args) const
660 { return (__object->*__pmf)(__args...); }
661
662 // Handle smart pointers, references and pointers to derived
663 template<typename _Tp>
664 _Res operator()(_Tp& __object, _ArgTypes... __args) const
665 { return _M_call(__object, &__object, __args...); }
666
667 private:
668 _Functor __pmf;
669 };
670
671 /// Implementation of @c mem_fn for volatile member function pointers.
672 template<typename _Res, typename _Class, typename... _ArgTypes>
673 class _Mem_fn<_Res (_Class::*)(_ArgTypes...) volatile>
674 : public _Maybe_unary_or_binary_function<_Res, volatile _Class*,
675 _ArgTypes...>
676 {
677 typedef _Res (_Class::*_Functor)(_ArgTypes...) volatile;
678
679 template<typename _Tp>
680 _Res
681 _M_call(_Tp& __object, const volatile _Class *,
682 _ArgTypes... __args) const
683 { return (__object.*__pmf)(__args...); }
684
685 template<typename _Tp>
686 _Res
687 _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const
688 { return ((*__ptr).*__pmf)(__args...); }
689
690 public:
691 typedef _Res result_type;
692
693 explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
694
695 // Handle objects
696 _Res
697 operator()(volatile _Class& __object, _ArgTypes... __args) const
698 { return (__object.*__pmf)(__args...); }
699
700 // Handle pointers
701 _Res
702 operator()(volatile _Class* __object, _ArgTypes... __args) const
703 { return (__object->*__pmf)(__args...); }
704
705 // Handle smart pointers, references and pointers to derived
706 template<typename _Tp>
707 _Res
708 operator()(_Tp& __object, _ArgTypes... __args) const
709 { return _M_call(__object, &__object, __args...); }
710
711 private:
712 _Functor __pmf;
713 };
714
715 /// Implementation of @c mem_fn for const volatile member function pointers.
716 template<typename _Res, typename _Class, typename... _ArgTypes>
717 class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const volatile>
718 : public _Maybe_unary_or_binary_function<_Res, const volatile _Class*,
719 _ArgTypes...>
720 {
721 typedef _Res (_Class::*_Functor)(_ArgTypes...) const volatile;
722
723 template<typename _Tp>
724 _Res
725 _M_call(_Tp& __object, const volatile _Class *,
726 _ArgTypes... __args) const
727 { return (__object.*__pmf)(__args...); }
728
729 template<typename _Tp>
730 _Res
731 _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const
732 { return ((*__ptr).*__pmf)(__args...); }
733
734 public:
735 typedef _Res result_type;
736
737 explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
738
739 // Handle objects
740 _Res
741 operator()(const volatile _Class& __object, _ArgTypes... __args) const
742 { return (__object.*__pmf)(__args...); }
743
744 // Handle pointers
745 _Res
746 operator()(const volatile _Class* __object, _ArgTypes... __args) const
747 { return (__object->*__pmf)(__args...); }
748
749 // Handle smart pointers, references and pointers to derived
750 template<typename _Tp>
751 _Res operator()(_Tp& __object, _ArgTypes... __args) const
752 { return _M_call(__object, &__object, __args...); }
753
754 private:
755 _Functor __pmf;
756 };
757
758
759 template<typename _Res, typename _Class>
760 class _Mem_fn<_Res _Class::*>
761 {
762 // This bit of genius is due to Peter Dimov, improved slightly by
763 // Douglas Gregor.
764 template<typename _Tp>
765 _Res&
766 _M_call(_Tp& __object, _Class *) const
767 { return __object.*__pm; }
768
769 template<typename _Tp, typename _Up>
770 _Res&
771 _M_call(_Tp& __object, _Up * const *) const
772 { return (*__object).*__pm; }
773
774 template<typename _Tp, typename _Up>
775 const _Res&
776 _M_call(_Tp& __object, const _Up * const *) const
777 { return (*__object).*__pm; }
778
779 template<typename _Tp>
780 const _Res&
781 _M_call(_Tp& __object, const _Class *) const
782 { return __object.*__pm; }
783
784 template<typename _Tp>
785 const _Res&
786 _M_call(_Tp& __ptr, const volatile void*) const
787 { return (*__ptr).*__pm; }
788
789 template<typename _Tp> static _Tp& __get_ref();
790
791 template<typename _Tp>
792 static __sfinae_types::__one __check_const(_Tp&, _Class*);
793 template<typename _Tp, typename _Up>
794 static __sfinae_types::__one __check_const(_Tp&, _Up * const *);
795 template<typename _Tp, typename _Up>
796 static __sfinae_types::__two __check_const(_Tp&, const _Up * const *);
797 template<typename _Tp>
798 static __sfinae_types::__two __check_const(_Tp&, const _Class*);
799 template<typename _Tp>
800 static __sfinae_types::__two __check_const(_Tp&, const volatile void*);
801
802 public:
803 template<typename _Tp>
804 struct _Result_type
805 : _Mem_fn_const_or_non<_Res,
806 (sizeof(__sfinae_types::__two)
807 == sizeof(__check_const<_Tp>(__get_ref<_Tp>(), (_Tp*)0)))>
808 { };
809
810 template<typename _Signature>
811 struct result;
812
813 template<typename _CVMem, typename _Tp>
814 struct result<_CVMem(_Tp)>
815 : public _Result_type<_Tp> { };
816
817 template<typename _CVMem, typename _Tp>
818 struct result<_CVMem(_Tp&)>
819 : public _Result_type<_Tp> { };
820
821 explicit
822 _Mem_fn(_Res _Class::*__pm) : __pm(__pm) { }
823
824 // Handle objects
825 _Res&
826 operator()(_Class& __object) const
827 { return __object.*__pm; }
828
829 const _Res&
830 operator()(const _Class& __object) const
831 { return __object.*__pm; }
832
833 // Handle pointers
834 _Res&
835 operator()(_Class* __object) const
836 { return __object->*__pm; }
837
838 const _Res&
839 operator()(const _Class* __object) const
840 { return __object->*__pm; }
841
842 // Handle smart pointers and derived
843 template<typename _Tp>
844 typename _Result_type<_Tp>::type
845 operator()(_Tp& __unknown) const
846 { return _M_call(__unknown, &__unknown); }
847
848 private:
849 _Res _Class::*__pm;
850 };
851
852 /**
853 * @brief Returns a function object that forwards to the member
854 * pointer @a pm.
855 */
856 template<typename _Tp, typename _Class>
857 inline _Mem_fn<_Tp _Class::*>
858 mem_fn(_Tp _Class::* __pm)
859 {
860 return _Mem_fn<_Tp _Class::*>(__pm);
861 }
862
863 /**
864 * @brief Determines if the given type _Tp is a function object
865 * should be treated as a subexpression when evaluating calls to
866 * function objects returned by bind(). [TR1 3.6.1]
867 */
868 template<typename _Tp>
869 struct is_bind_expression
870 { static const bool value = false; };
871
872 template<typename _Tp>
873 const bool is_bind_expression<_Tp>::value;
874
875 /**
876 * @brief Determines if the given type _Tp is a placeholder in a
877 * bind() expression and, if so, which placeholder it is. [TR1 3.6.2]
878 */
879 template<typename _Tp>
880 struct is_placeholder
881 { static const int value = 0; };
882
883 template<typename _Tp>
884 const int is_placeholder<_Tp>::value;
885
886 /// The type of placeholder objects defined by libstdc++.
887 using ::std::_Placeholder;
888
889 /** @namespace std::tr1::placeholders
890 * @brief Sub-namespace for tr1/functional.
891 */
892 namespace placeholders
893 {
894 // The C++11 std::placeholders are already exported from the library.
895 // Reusing them here avoids needing to export additional symbols for
896 // the TR1 placeholders, and avoids ODR violations due to defining
897 // them with internal linkage (as we used to do).
898 using namespace ::std::placeholders;
899 }
900
901 /**
902 * Partial specialization of is_placeholder that provides the placeholder
903 * number for the placeholder objects defined by libstdc++.
904 */
905 template<int _Num>
906 struct is_placeholder<_Placeholder<_Num> >
907 : integral_constant<int, _Num>
908 { };
909
910 template<int _Num>
911 struct is_placeholder<const _Placeholder<_Num> >
912 : integral_constant<int, _Num>
913 { };
914
915 /**
916 * Stores a tuple of indices. Used by bind() to extract the elements
917 * in a tuple.
918 */
919 template<int... _Indexes>
920 struct _Index_tuple { };
921
922 /// Builds an _Index_tuple<0, 1, 2, ..., _Num-1>.
923 template<std::size_t _Num, typename _Tuple = _Index_tuple<> >
924 struct _Build_index_tuple;
925
926 template<std::size_t _Num, int... _Indexes>
927 struct _Build_index_tuple<_Num, _Index_tuple<_Indexes...> >
928 : _Build_index_tuple<_Num - 1,
929 _Index_tuple<_Indexes..., sizeof...(_Indexes)> >
930 {
931 };
932
933 template<int... _Indexes>
934 struct _Build_index_tuple<0, _Index_tuple<_Indexes...> >
935 {
936 typedef _Index_tuple<_Indexes...> __type;
937 };
938
939 /**
940 * Used by _Safe_tuple_element to indicate that there is no tuple
941 * element at this position.
942 */
943 struct _No_tuple_element;
944
945 /**
946 * Implementation helper for _Safe_tuple_element. This primary
947 * template handles the case where it is safe to use @c
948 * tuple_element.
949 */
950 template<int __i, typename _Tuple, bool _IsSafe>
951 struct _Safe_tuple_element_impl
952 : tuple_element<__i, _Tuple> { };
953
954 /**
955 * Implementation helper for _Safe_tuple_element. This partial
956 * specialization handles the case where it is not safe to use @c
957 * tuple_element. We just return @c _No_tuple_element.
958 */
959 template<int __i, typename _Tuple>
960 struct _Safe_tuple_element_impl<__i, _Tuple, false>
961 {
962 typedef _No_tuple_element type;
963 };
964
965 /**
966 * Like tuple_element, but returns @c _No_tuple_element when
967 * tuple_element would return an error.
968 */
969 template<int __i, typename _Tuple>
970 struct _Safe_tuple_element
971 : _Safe_tuple_element_impl<__i, _Tuple,
972 (__i >= 0 && __i < tuple_size<_Tuple>::value)>
973 {
974 };
975
976 /**
977 * Maps an argument to bind() into an actual argument to the bound
978 * function object [TR1 3.6.3/5]. Only the first parameter should
979 * be specified: the rest are used to determine among the various
980 * implementations. Note that, although this class is a function
981 * object, it isn't entirely normal because it takes only two
982 * parameters regardless of the number of parameters passed to the
983 * bind expression. The first parameter is the bound argument and
984 * the second parameter is a tuple containing references to the
985 * rest of the arguments.
986 */
987 template<typename _Arg,
988 bool _IsBindExp = is_bind_expression<_Arg>::value,
989 bool _IsPlaceholder = (is_placeholder<_Arg>::value > 0)>
990 class _Mu;
991
992 /**
993 * If the argument is reference_wrapper<_Tp>, returns the
994 * underlying reference. [TR1 3.6.3/5 bullet 1]
995 */
996 template<typename _Tp>
997 class _Mu<reference_wrapper<_Tp>, false, false>
998 {
999 public:
1000 typedef _Tp& result_type;
1001
1002 /* Note: This won't actually work for const volatile
1003 * reference_wrappers, because reference_wrapper::get() is const
1004 * but not volatile-qualified. This might be a defect in the TR.
1005 */
1006 template<typename _CVRef, typename _Tuple>
1007 result_type
1008 operator()(_CVRef& __arg, const _Tuple&) const volatile
1009 { return __arg.get(); }
1010 };
1011
1012 /**
1013 * If the argument is a bind expression, we invoke the underlying
1014 * function object with the same cv-qualifiers as we are given and
1015 * pass along all of our arguments (unwrapped). [TR1 3.6.3/5 bullet 2]
1016 */
1017 template<typename _Arg>
1018 class _Mu<_Arg, true, false>
1019 {
1020 public:
1021 template<typename _Signature> class result;
1022
1023 // Determine the result type when we pass the arguments along. This
1024 // involves passing along the cv-qualifiers placed on _Mu and
1025 // unwrapping the argument bundle.
1026 template<typename _CVMu, typename _CVArg, typename... _Args>
1027 class result<_CVMu(_CVArg, tuple<_Args...>)>
1028 : public result_of<_CVArg(_Args...)> { };
1029
1030 template<typename _CVArg, typename... _Args>
1031 typename result_of<_CVArg(_Args...)>::type
1032 operator()(_CVArg& __arg,
1033 const tuple<_Args...>& __tuple) const volatile
1034 {
1035 // Construct an index tuple and forward to __call
1036 typedef typename _Build_index_tuple<sizeof...(_Args)>::__type
1037 _Indexes;
1038 return this->__call(__arg, __tuple, _Indexes());
1039 }
1040
1041 private:
1042 // Invokes the underlying function object __arg by unpacking all
1043 // of the arguments in the tuple.
1044 template<typename _CVArg, typename... _Args, int... _Indexes>
1045 typename result_of<_CVArg(_Args...)>::type
1046 __call(_CVArg& __arg, const tuple<_Args...>& __tuple,
1047 const _Index_tuple<_Indexes...>&) const volatile
1048 {
1049 return __arg(tr1::get<_Indexes>(__tuple)...);
1050 }
1051 };
1052
1053 /**
1054 * If the argument is a placeholder for the Nth argument, returns
1055 * a reference to the Nth argument to the bind function object.
1056 * [TR1 3.6.3/5 bullet 3]
1057 */
1058 template<typename _Arg>
1059 class _Mu<_Arg, false, true>
1060 {
1061 public:
1062 template<typename _Signature> class result;
1063
1064 template<typename _CVMu, typename _CVArg, typename _Tuple>
1065 class result<_CVMu(_CVArg, _Tuple)>
1066 {
1067 // Add a reference, if it hasn't already been done for us.
1068 // This allows us to be a little bit sloppy in constructing
1069 // the tuple that we pass to result_of<...>.
1070 typedef typename _Safe_tuple_element<(is_placeholder<_Arg>::value
1071 - 1), _Tuple>::type
1072 __base_type;
1073
1074 public:
1075 typedef typename add_reference<__base_type>::type type;
1076 };
1077
1078 template<typename _Tuple>
1079 typename result<_Mu(_Arg, _Tuple)>::type
1080 operator()(const volatile _Arg&, const _Tuple& __tuple) const volatile
1081 {
1082 return ::std::tr1::get<(is_placeholder<_Arg>::value - 1)>(__tuple);
1083 }
1084 };
1085
1086 /**
1087 * If the argument is just a value, returns a reference to that
1088 * value. The cv-qualifiers on the reference are the same as the
1089 * cv-qualifiers on the _Mu object. [TR1 3.6.3/5 bullet 4]
1090 */
1091 template<typename _Arg>
1092 class _Mu<_Arg, false, false>
1093 {
1094 public:
1095 template<typename _Signature> struct result;
1096
1097 template<typename _CVMu, typename _CVArg, typename _Tuple>
1098 struct result<_CVMu(_CVArg, _Tuple)>
1099 {
1100 typedef typename add_reference<_CVArg>::type type;
1101 };
1102
1103 // Pick up the cv-qualifiers of the argument
1104 template<typename _CVArg, typename _Tuple>
1105 _CVArg&
1106 operator()(_CVArg& __arg, const _Tuple&) const volatile
1107 { return __arg; }
1108 };
1109
1110 /**
1111 * Maps member pointers into instances of _Mem_fn but leaves all
1112 * other function objects untouched. Used by tr1::bind(). The
1113 * primary template handles the non--member-pointer case.
1114 */
1115 template<typename _Tp>
1116 struct _Maybe_wrap_member_pointer
1117 {
1118 typedef _Tp type;
1119
1120 static const _Tp&
1121 __do_wrap(const _Tp& __x)
1122 { return __x; }
1123 };
1124
1125 /**
1126 * Maps member pointers into instances of _Mem_fn but leaves all
1127 * other function objects untouched. Used by tr1::bind(). This
1128 * partial specialization handles the member pointer case.
1129 */
1130 template<typename _Tp, typename _Class>
1131 struct _Maybe_wrap_member_pointer<_Tp _Class::*>
1132 {
1133 typedef _Mem_fn<_Tp _Class::*> type;
1134
1135 static type
1136 __do_wrap(_Tp _Class::* __pm)
1137 { return type(__pm); }
1138 };
1139
1140 /// Type of the function object returned from bind().
1141 template<typename _Signature>
1142 struct _Bind;
1143
1144 template<typename _Functor, typename... _Bound_args>
1145 class _Bind<_Functor(_Bound_args...)>
1146 : public _Weak_result_type<_Functor>
1147 {
1148 typedef _Bind __self_type;
1149 typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type
1150 _Bound_indexes;
1151
1152 _Functor _M_f;
1153 tuple<_Bound_args...> _M_bound_args;
1154
1155 // Call unqualified
1156 template<typename... _Args, int... _Indexes>
1157 typename result_of<
1158 _Functor(typename result_of<_Mu<_Bound_args>
1159 (_Bound_args, tuple<_Args...>)>::type...)
1160 >::type
1161 __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>)
1162 {
1163 return _M_f(_Mu<_Bound_args>()
1164 (tr1::get<_Indexes>(_M_bound_args), __args)...);
1165 }
1166
1167 // Call as const
1168 template<typename... _Args, int... _Indexes>
1169 typename result_of<
1170 const _Functor(typename result_of<_Mu<_Bound_args>
1171 (const _Bound_args, tuple<_Args...>)
1172 >::type...)>::type
1173 __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) const
1174 {
1175 return _M_f(_Mu<_Bound_args>()
1176 (tr1::get<_Indexes>(_M_bound_args), __args)...);
1177 }
1178
1179 // Call as volatile
1180 template<typename... _Args, int... _Indexes>
1181 typename result_of<
1182 volatile _Functor(typename result_of<_Mu<_Bound_args>
1183 (volatile _Bound_args, tuple<_Args...>)
1184 >::type...)>::type
1185 __call(const tuple<_Args...>& __args,
1186 _Index_tuple<_Indexes...>) volatile
1187 {
1188 return _M_f(_Mu<_Bound_args>()
1189 (tr1::get<_Indexes>(_M_bound_args), __args)...);
1190 }
1191
1192 // Call as const volatile
1193 template<typename... _Args, int... _Indexes>
1194 typename result_of<
1195 const volatile _Functor(typename result_of<_Mu<_Bound_args>
1196 (const volatile _Bound_args,
1197 tuple<_Args...>)
1198 >::type...)>::type
1199 __call(const tuple<_Args...>& __args,
1200 _Index_tuple<_Indexes...>) const volatile
1201 {
1202 return _M_f(_Mu<_Bound_args>()
1203 (tr1::get<_Indexes>(_M_bound_args), __args)...);
1204 }
1205
1206 public:
1207 explicit _Bind(_Functor __f, _Bound_args... __bound_args)
1208 : _M_f(__f), _M_bound_args(__bound_args...) { }
1209
1210 // Call unqualified
1211 template<typename... _Args>
1212 typename result_of<
1213 _Functor(typename result_of<_Mu<_Bound_args>
1214 (_Bound_args, tuple<_Args...>)>::type...)
1215 >::type
1216 operator()(_Args&... __args)
1217 {
1218 return this->__call(tr1::tie(__args...), _Bound_indexes());
1219 }
1220
1221 // Call as const
1222 template<typename... _Args>
1223 typename result_of<
1224 const _Functor(typename result_of<_Mu<_Bound_args>
1225 (const _Bound_args, tuple<_Args...>)>::type...)
1226 >::type
1227 operator()(_Args&... __args) const
1228 {
1229 return this->__call(tr1::tie(__args...), _Bound_indexes());
1230 }
1231
1232
1233 // Call as volatile
1234 template<typename... _Args>
1235 typename result_of<
1236 volatile _Functor(typename result_of<_Mu<_Bound_args>
1237 (volatile _Bound_args, tuple<_Args...>)>::type...)
1238 >::type
1239 operator()(_Args&... __args) volatile
1240 {
1241 return this->__call(tr1::tie(__args...), _Bound_indexes());
1242 }
1243
1244
1245 // Call as const volatile
1246 template<typename... _Args>
1247 typename result_of<
1248 const volatile _Functor(typename result_of<_Mu<_Bound_args>
1249 (const volatile _Bound_args,
1250 tuple<_Args...>)>::type...)
1251 >::type
1252 operator()(_Args&... __args) const volatile
1253 {
1254 return this->__call(tr1::tie(__args...), _Bound_indexes());
1255 }
1256 };
1257
1258 /// Type of the function object returned from bind<R>().
1259 template<typename _Result, typename _Signature>
1260 struct _Bind_result;
1261
1262 template<typename _Result, typename _Functor, typename... _Bound_args>
1263 class _Bind_result<_Result, _Functor(_Bound_args...)>
1264 {
1265 typedef _Bind_result __self_type;
1266 typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type
1267 _Bound_indexes;
1268
1269 _Functor _M_f;
1270 tuple<_Bound_args...> _M_bound_args;
1271
1272 // Call unqualified
1273 template<typename... _Args, int... _Indexes>
1274 _Result
1275 __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>)
1276 {
1277 return _M_f(_Mu<_Bound_args>()
1278 (tr1::get<_Indexes>(_M_bound_args), __args)...);
1279 }
1280
1281 // Call as const
1282 template<typename... _Args, int... _Indexes>
1283 _Result
1284 __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) const
1285 {
1286 return _M_f(_Mu<_Bound_args>()
1287 (tr1::get<_Indexes>(_M_bound_args), __args)...);
1288 }
1289
1290 // Call as volatile
1291 template<typename... _Args, int... _Indexes>
1292 _Result
1293 __call(const tuple<_Args...>& __args,
1294 _Index_tuple<_Indexes...>) volatile
1295 {
1296 return _M_f(_Mu<_Bound_args>()
1297 (tr1::get<_Indexes>(_M_bound_args), __args)...);
1298 }
1299
1300 // Call as const volatile
1301 template<typename... _Args, int... _Indexes>
1302 _Result
1303 __call(const tuple<_Args...>& __args,
1304 _Index_tuple<_Indexes...>) const volatile
1305 {
1306 return _M_f(_Mu<_Bound_args>()
1307 (tr1::get<_Indexes>(_M_bound_args), __args)...);
1308 }
1309
1310 public:
1311 typedef _Result result_type;
1312
1313 explicit
1314 _Bind_result(_Functor __f, _Bound_args... __bound_args)
1315 : _M_f(__f), _M_bound_args(__bound_args...) { }
1316
1317 // Call unqualified
1318 template<typename... _Args>
1319 result_type
1320 operator()(_Args&... __args)
1321 {
1322 return this->__call(tr1::tie(__args...), _Bound_indexes());
1323 }
1324
1325 // Call as const
1326 template<typename... _Args>
1327 result_type
1328 operator()(_Args&... __args) const
1329 {
1330 return this->__call(tr1::tie(__args...), _Bound_indexes());
1331 }
1332
1333 // Call as volatile
1334 template<typename... _Args>
1335 result_type
1336 operator()(_Args&... __args) volatile
1337 {
1338 return this->__call(tr1::tie(__args...), _Bound_indexes());
1339 }
1340
1341 // Call as const volatile
1342 template<typename... _Args>
1343 result_type
1344 operator()(_Args&... __args) const volatile
1345 {
1346 return this->__call(tr1::tie(__args...), _Bound_indexes());
1347 }
1348 };
1349
1350 /// Class template _Bind is always a bind expression.
1351 template<typename _Signature>
1352 struct is_bind_expression<_Bind<_Signature> >
1353 { static const bool value = true; };
1354
1355 template<typename _Signature>
1356 const bool is_bind_expression<_Bind<_Signature> >::value;
1357
1358 /// Class template _Bind is always a bind expression.
1359 template<typename _Signature>
1360 struct is_bind_expression<const _Bind<_Signature> >
1361 { static const bool value = true; };
1362
1363 template<typename _Signature>
1364 const bool is_bind_expression<const _Bind<_Signature> >::value;
1365
1366 /// Class template _Bind is always a bind expression.
1367 template<typename _Signature>
1368 struct is_bind_expression<volatile _Bind<_Signature> >
1369 { static const bool value = true; };
1370
1371 template<typename _Signature>
1372 const bool is_bind_expression<volatile _Bind<_Signature> >::value;
1373
1374 /// Class template _Bind is always a bind expression.
1375 template<typename _Signature>
1376 struct is_bind_expression<const volatile _Bind<_Signature> >
1377 { static const bool value = true; };
1378
1379 template<typename _Signature>
1380 const bool is_bind_expression<const volatile _Bind<_Signature> >::value;
1381
1382 /// Class template _Bind_result is always a bind expression.
1383 template<typename _Result, typename _Signature>
1384 struct is_bind_expression<_Bind_result<_Result, _Signature> >
1385 { static const bool value = true; };
1386
1387 template<typename _Result, typename _Signature>
1388 const bool is_bind_expression<_Bind_result<_Result, _Signature> >::value;
1389
1390 /// Class template _Bind_result is always a bind expression.
1391 template<typename _Result, typename _Signature>
1392 struct is_bind_expression<const _Bind_result<_Result, _Signature> >
1393 { static const bool value = true; };
1394
1395 template<typename _Result, typename _Signature>
1396 const bool
1397 is_bind_expression<const _Bind_result<_Result, _Signature> >::value;
1398
1399 /// Class template _Bind_result is always a bind expression.
1400 template<typename _Result, typename _Signature>
1401 struct is_bind_expression<volatile _Bind_result<_Result, _Signature> >
1402 { static const bool value = true; };
1403
1404 template<typename _Result, typename _Signature>
1405 const bool
1406 is_bind_expression<volatile _Bind_result<_Result, _Signature> >::value;
1407
1408 /// Class template _Bind_result is always a bind expression.
1409 template<typename _Result, typename _Signature>
1410 struct
1411 is_bind_expression<const volatile _Bind_result<_Result, _Signature> >
1412 { static const bool value = true; };
1413
1414 template<typename _Result, typename _Signature>
1415 const bool
1416 is_bind_expression<const volatile _Bind_result<_Result,
1417 _Signature> >::value;
1418
1419 #if __cplusplus >= 201103L
1420 // Specialize tr1::is_bind_expression for std::bind closure types,
1421 // so that they can also work with tr1::bind.
1422
1423 template<typename _Signature>
1424 struct is_bind_expression<std::_Bind<_Signature>>
1425 : true_type { };
1426
1427 template<typename _Signature>
1428 struct is_bind_expression<const std::_Bind<_Signature>>
1429 : true_type { };
1430
1431 template<typename _Signature>
1432 struct is_bind_expression<volatile std::_Bind<_Signature>>
1433 : true_type { };
1434
1435 template<typename _Signature>
1436 struct is_bind_expression<const volatile std::_Bind<_Signature>>
1437 : true_type { };
1438
1439 template<typename _Result, typename _Signature>
1440 struct is_bind_expression<std::_Bind_result<_Result, _Signature>>
1441 : true_type { };
1442
1443 template<typename _Result, typename _Signature>
1444 struct is_bind_expression<const std::_Bind_result<_Result, _Signature>>
1445 : true_type { };
1446
1447 template<typename _Result, typename _Signature>
1448 struct is_bind_expression<volatile std::_Bind_result<_Result, _Signature>>
1449 : true_type { };
1450
1451 template<typename _Result, typename _Signature>
1452 struct is_bind_expression<const volatile std::_Bind_result<_Result,
1453 _Signature>>
1454 : true_type { };
1455 #endif
1456
1457 /// bind
1458 template<typename _Functor, typename... _ArgTypes>
1459 inline
1460 _Bind<typename _Maybe_wrap_member_pointer<_Functor>::type(_ArgTypes...)>
1461 bind(_Functor __f, _ArgTypes... __args)
1462 {
1463 typedef _Maybe_wrap_member_pointer<_Functor> __maybe_type;
1464 typedef typename __maybe_type::type __functor_type;
1465 typedef _Bind<__functor_type(_ArgTypes...)> __result_type;
1466 return __result_type(__maybe_type::__do_wrap(__f), __args...);
1467 }
1468
1469 template<typename _Result, typename _Functor, typename... _ArgTypes>
1470 inline
1471 _Bind_result<_Result,
1472 typename _Maybe_wrap_member_pointer<_Functor>::type
1473 (_ArgTypes...)>
1474 bind(_Functor __f, _ArgTypes... __args)
1475 {
1476 typedef _Maybe_wrap_member_pointer<_Functor> __maybe_type;
1477 typedef typename __maybe_type::type __functor_type;
1478 typedef _Bind_result<_Result, __functor_type(_ArgTypes...)>
1479 __result_type;
1480 return __result_type(__maybe_type::__do_wrap(__f), __args...);
1481 }
1482
1483 /**
1484 * @brief Exception class thrown when class template function's
1485 * operator() is called with an empty target.
1486 * @ingroup exceptions
1487 */
1488 class bad_function_call : public std::exception { };
1489
1490 /**
1491 * The integral constant expression 0 can be converted into a
1492 * pointer to this type. It is used by the function template to
1493 * accept NULL pointers.
1494 */
1495 struct _M_clear_type;
1496
1497 /**
1498 * Trait identifying @a location-invariant types, meaning that the
1499 * address of the object (or any of its members) will not escape.
1500 * Also implies a trivial copy constructor and assignment operator.
1501 */
1502 template<typename _Tp>
1503 struct __is_location_invariant
1504 : integral_constant<bool,
1505 (is_pointer<_Tp>::value
1506 || is_member_pointer<_Tp>::value)>
1507 {
1508 };
1509
1510 class _Undefined_class;
1511
1512 union _Nocopy_types
1513 {
1514 void* _M_object;
1515 const void* _M_const_object;
1516 void (*_M_function_pointer)();
1517 void (_Undefined_class::*_M_member_pointer)();
1518 };
1519
1520 union _Any_data
1521 {
1522 void* _M_access() { return &_M_pod_data[0]; }
1523 const void* _M_access() const { return &_M_pod_data[0]; }
1524
1525 template<typename _Tp>
1526 _Tp&
1527 _M_access()
1528 { return *static_cast<_Tp*>(_M_access()); }
1529
1530 template<typename _Tp>
1531 const _Tp&
1532 _M_access() const
1533 { return *static_cast<const _Tp*>(_M_access()); }
1534
1535 _Nocopy_types _M_unused;
1536 char _M_pod_data[sizeof(_Nocopy_types)];
1537 };
1538
1539 enum _Manager_operation
1540 {
1541 __get_type_info,
1542 __get_functor_ptr,
1543 __clone_functor,
1544 __destroy_functor
1545 };
1546
1547 // Simple type wrapper that helps avoid annoying const problems
1548 // when casting between void pointers and pointers-to-pointers.
1549 template<typename _Tp>
1550 struct _Simple_type_wrapper
1551 {
1552 _Simple_type_wrapper(_Tp __value) : __value(__value) { }
1553
1554 _Tp __value;
1555 };
1556
1557 template<typename _Tp>
1558 struct __is_location_invariant<_Simple_type_wrapper<_Tp> >
1559 : __is_location_invariant<_Tp>
1560 {
1561 };
1562
1563 // Converts a reference to a function object into a callable
1564 // function object.
1565 template<typename _Functor>
1566 inline _Functor&
1567 __callable_functor(_Functor& __f)
1568 { return __f; }
1569
1570 template<typename _Member, typename _Class>
1571 inline _Mem_fn<_Member _Class::*>
1572 __callable_functor(_Member _Class::* &__p)
1573 { return mem_fn(__p); }
1574
1575 template<typename _Member, typename _Class>
1576 inline _Mem_fn<_Member _Class::*>
1577 __callable_functor(_Member _Class::* const &__p)
1578 { return mem_fn(__p); }
1579
1580 template<typename _Signature>
1581 class function;
1582
1583 /// Base class of all polymorphic function object wrappers.
1584 class _Function_base
1585 {
1586 public:
1587 static const std::size_t _M_max_size = sizeof(_Nocopy_types);
1588 static const std::size_t _M_max_align = __alignof__(_Nocopy_types);
1589
1590 template<typename _Functor>
1591 class _Base_manager
1592 {
1593 protected:
1594 static const bool __stored_locally =
1595 (__is_location_invariant<_Functor>::value
1596 && sizeof(_Functor) <= _M_max_size
1597 && __alignof__(_Functor) <= _M_max_align
1598 && (_M_max_align % __alignof__(_Functor) == 0));
1599
1600 typedef integral_constant<bool, __stored_locally> _Local_storage;
1601
1602 // Retrieve a pointer to the function object
1603 static _Functor*
1604 _M_get_pointer(const _Any_data& __source)
1605 {
1606 const _Functor* __ptr =
1607 __stored_locally? std::__addressof(__source._M_access<_Functor>())
1608 /* have stored a pointer */ : __source._M_access<_Functor*>();
1609 return const_cast<_Functor*>(__ptr);
1610 }
1611
1612 // Clone a location-invariant function object that fits within
1613 // an _Any_data structure.
1614 static void
1615 _M_clone(_Any_data& __dest, const _Any_data& __source, true_type)
1616 {
1617 new (__dest._M_access()) _Functor(__source._M_access<_Functor>());
1618 }
1619
1620 // Clone a function object that is not location-invariant or
1621 // that cannot fit into an _Any_data structure.
1622 static void
1623 _M_clone(_Any_data& __dest, const _Any_data& __source, false_type)
1624 {
1625 __dest._M_access<_Functor*>() =
1626 new _Functor(*__source._M_access<_Functor*>());
1627 }
1628
1629 // Destroying a location-invariant object may still require
1630 // destruction.
1631 static void
1632 _M_destroy(_Any_data& __victim, true_type)
1633 {
1634 __victim._M_access<_Functor>().~_Functor();
1635 }
1636
1637 // Destroying an object located on the heap.
1638 static void
1639 _M_destroy(_Any_data& __victim, false_type)
1640 {
1641 delete __victim._M_access<_Functor*>();
1642 }
1643
1644 public:
1645 static bool
1646 _M_manager(_Any_data& __dest, const _Any_data& __source,
1647 _Manager_operation __op)
1648 {
1649 switch (__op)
1650 {
1651 #if __cpp_rtti
1652 case __get_type_info:
1653 __dest._M_access<const type_info*>() = &typeid(_Functor);
1654 break;
1655 #endif
1656 case __get_functor_ptr:
1657 __dest._M_access<_Functor*>() = _M_get_pointer(__source);
1658 break;
1659
1660 case __clone_functor:
1661 _M_clone(__dest, __source, _Local_storage());
1662 break;
1663
1664 case __destroy_functor:
1665 _M_destroy(__dest, _Local_storage());
1666 break;
1667 }
1668 return false;
1669 }
1670
1671 static void
1672 _M_init_functor(_Any_data& __functor, const _Functor& __f)
1673 { _M_init_functor(__functor, __f, _Local_storage()); }
1674
1675 template<typename _Signature>
1676 static bool
1677 _M_not_empty_function(const function<_Signature>& __f)
1678 { return static_cast<bool>(__f); }
1679
1680 template<typename _Tp>
1681 static bool
1682 _M_not_empty_function(const _Tp*& __fp)
1683 { return __fp; }
1684
1685 template<typename _Class, typename _Tp>
1686 static bool
1687 _M_not_empty_function(_Tp _Class::* const& __mp)
1688 { return __mp; }
1689
1690 template<typename _Tp>
1691 static bool
1692 _M_not_empty_function(const _Tp&)
1693 { return true; }
1694
1695 private:
1696 static void
1697 _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type)
1698 { new (__functor._M_access()) _Functor(__f); }
1699
1700 static void
1701 _M_init_functor(_Any_data& __functor, const _Functor& __f, false_type)
1702 { __functor._M_access<_Functor*>() = new _Functor(__f); }
1703 };
1704
1705 template<typename _Functor>
1706 class _Ref_manager : public _Base_manager<_Functor*>
1707 {
1708 typedef _Function_base::_Base_manager<_Functor*> _Base;
1709
1710 public:
1711 static bool
1712 _M_manager(_Any_data& __dest, const _Any_data& __source,
1713 _Manager_operation __op)
1714 {
1715 switch (__op)
1716 {
1717 #if __cpp_rtti
1718 case __get_type_info:
1719 __dest._M_access<const type_info*>() = &typeid(_Functor);
1720 break;
1721 #endif
1722 case __get_functor_ptr:
1723 __dest._M_access<_Functor*>() = *_Base::_M_get_pointer(__source);
1724 return is_const<_Functor>::value;
1725 break;
1726
1727 default:
1728 _Base::_M_manager(__dest, __source, __op);
1729 }
1730 return false;
1731 }
1732
1733 static void
1734 _M_init_functor(_Any_data& __functor, reference_wrapper<_Functor> __f)
1735 {
1736 _Base::_M_init_functor(__functor, std::__addressof(__f.get()));
1737 }
1738 };
1739
1740 _Function_base() : _M_manager(0) { }
1741
1742 ~_Function_base()
1743 {
1744 if (_M_manager)
1745 _M_manager(_M_functor, _M_functor, __destroy_functor);
1746 }
1747
1748
1749 bool _M_empty() const { return !_M_manager; }
1750
1751 typedef bool (*_Manager_type)(_Any_data&, const _Any_data&,
1752 _Manager_operation);
1753
1754 _Any_data _M_functor;
1755 _Manager_type _M_manager;
1756 };
1757
1758 template<typename _Signature, typename _Functor>
1759 class _Function_handler;
1760
1761 template<typename _Res, typename _Functor, typename... _ArgTypes>
1762 class _Function_handler<_Res(_ArgTypes...), _Functor>
1763 : public _Function_base::_Base_manager<_Functor>
1764 {
1765 typedef _Function_base::_Base_manager<_Functor> _Base;
1766
1767 public:
1768 static _Res
1769 _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1770 {
1771 return (*_Base::_M_get_pointer(__functor))(__args...);
1772 }
1773 };
1774
1775 template<typename _Functor, typename... _ArgTypes>
1776 class _Function_handler<void(_ArgTypes...), _Functor>
1777 : public _Function_base::_Base_manager<_Functor>
1778 {
1779 typedef _Function_base::_Base_manager<_Functor> _Base;
1780
1781 public:
1782 static void
1783 _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1784 {
1785 (*_Base::_M_get_pointer(__functor))(__args...);
1786 }
1787 };
1788
1789 template<typename _Res, typename _Functor, typename... _ArgTypes>
1790 class _Function_handler<_Res(_ArgTypes...), reference_wrapper<_Functor> >
1791 : public _Function_base::_Ref_manager<_Functor>
1792 {
1793 typedef _Function_base::_Ref_manager<_Functor> _Base;
1794
1795 public:
1796 static _Res
1797 _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1798 {
1799 return
1800 __callable_functor(**_Base::_M_get_pointer(__functor))(__args...);
1801 }
1802 };
1803
1804 template<typename _Functor, typename... _ArgTypes>
1805 class _Function_handler<void(_ArgTypes...), reference_wrapper<_Functor> >
1806 : public _Function_base::_Ref_manager<_Functor>
1807 {
1808 typedef _Function_base::_Ref_manager<_Functor> _Base;
1809
1810 public:
1811 static void
1812 _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1813 {
1814 __callable_functor(**_Base::_M_get_pointer(__functor))(__args...);
1815 }
1816 };
1817
1818 template<typename _Class, typename _Member, typename _Res,
1819 typename... _ArgTypes>
1820 class _Function_handler<_Res(_ArgTypes...), _Member _Class::*>
1821 : public _Function_handler<void(_ArgTypes...), _Member _Class::*>
1822 {
1823 typedef _Function_handler<void(_ArgTypes...), _Member _Class::*>
1824 _Base;
1825
1826 public:
1827 static _Res
1828 _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1829 {
1830 return tr1::
1831 mem_fn(_Base::_M_get_pointer(__functor)->__value)(__args...);
1832 }
1833 };
1834
1835 template<typename _Class, typename _Member, typename... _ArgTypes>
1836 class _Function_handler<void(_ArgTypes...), _Member _Class::*>
1837 : public _Function_base::_Base_manager<
1838 _Simple_type_wrapper< _Member _Class::* > >
1839 {
1840 typedef _Member _Class::* _Functor;
1841 typedef _Simple_type_wrapper<_Functor> _Wrapper;
1842 typedef _Function_base::_Base_manager<_Wrapper> _Base;
1843
1844 public:
1845 static bool
1846 _M_manager(_Any_data& __dest, const _Any_data& __source,
1847 _Manager_operation __op)
1848 {
1849 switch (__op)
1850 {
1851 #if __cpp_rtti
1852 case __get_type_info:
1853 __dest._M_access<const type_info*>() = &typeid(_Functor);
1854 break;
1855 #endif
1856 case __get_functor_ptr:
1857 __dest._M_access<_Functor*>() =
1858 &_Base::_M_get_pointer(__source)->__value;
1859 break;
1860
1861 default:
1862 _Base::_M_manager(__dest, __source, __op);
1863 }
1864 return false;
1865 }
1866
1867 static void
1868 _M_invoke(const _Any_data& __functor, _ArgTypes... __args)
1869 {
1870 tr1::mem_fn(_Base::_M_get_pointer(__functor)->__value)(__args...);
1871 }
1872 };
1873
1874 /// class function
1875 template<typename _Res, typename... _ArgTypes>
1876 class function<_Res(_ArgTypes...)>
1877 : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>,
1878 private _Function_base
1879 {
1880 #if __cplusplus < 201103L
1881 /// This class is used to implement the safe_bool idiom.
1882 struct _Hidden_type
1883 {
1884 _Hidden_type* _M_bool;
1885 };
1886
1887 /// This typedef is used to implement the safe_bool idiom.
1888 typedef _Hidden_type* _Hidden_type::* _Safe_bool;
1889 #endif
1890
1891 typedef _Res _Signature_type(_ArgTypes...);
1892
1893 struct _Useless { };
1894
1895 public:
1896 typedef _Res result_type;
1897
1898 // [3.7.2.1] construct/copy/destroy
1899
1900 /**
1901 * @brief Default construct creates an empty function call wrapper.
1902 * @post @c !(bool)*this
1903 */
1904 function() : _Function_base() { }
1905
1906 /**
1907 * @brief Default construct creates an empty function call wrapper.
1908 * @post @c !(bool)*this
1909 */
1910 function(_M_clear_type*) : _Function_base() { }
1911
1912 /**
1913 * @brief %Function copy constructor.
1914 * @param x A %function object with identical call signature.
1915 * @post @c (bool)*this == (bool)x
1916 *
1917 * The newly-created %function contains a copy of the target of @a
1918 * x (if it has one).
1919 */
1920 function(const function& __x);
1921
1922 /**
1923 * @brief Builds a %function that targets a copy of the incoming
1924 * function object.
1925 * @param f A %function object that is callable with parameters of
1926 * type @c T1, @c T2, ..., @c TN and returns a value convertible
1927 * to @c Res.
1928 *
1929 * The newly-created %function object will target a copy of @a
1930 * f. If @a f is @c reference_wrapper<F>, then this function
1931 * object will contain a reference to the function object @c
1932 * f.get(). If @a f is a NULL function pointer or NULL
1933 * pointer-to-member, the newly-created object will be empty.
1934 *
1935 * If @a f is a non-NULL function pointer or an object of type @c
1936 * reference_wrapper<F>, this function will not throw.
1937 */
1938 template<typename _Functor>
1939 function(_Functor __f,
1940 typename __gnu_cxx::__enable_if<
1941 !is_integral<_Functor>::value, _Useless>::__type
1942 = _Useless());
1943
1944 /**
1945 * @brief %Function assignment operator.
1946 * @param x A %function with identical call signature.
1947 * @post @c (bool)*this == (bool)x
1948 * @returns @c *this
1949 *
1950 * The target of @a x is copied to @c *this. If @a x has no
1951 * target, then @c *this will be empty.
1952 *
1953 * If @a x targets a function pointer or a reference to a function
1954 * object, then this operation will not throw an %exception.
1955 */
1956 function&
1957 operator=(const function& __x)
1958 {
1959 function(__x).swap(*this);
1960 return *this;
1961 }
1962
1963 /**
1964 * @brief %Function assignment to zero.
1965 * @post @c !(bool)*this
1966 * @returns @c *this
1967 *
1968 * The target of @c *this is deallocated, leaving it empty.
1969 */
1970 function&
1971 operator=(_M_clear_type*)
1972 {
1973 if (_M_manager)
1974 {
1975 _M_manager(_M_functor, _M_functor, __destroy_functor);
1976 _M_manager = 0;
1977 _M_invoker = 0;
1978 }
1979 return *this;
1980 }
1981
1982 /**
1983 * @brief %Function assignment to a new target.
1984 * @param f A %function object that is callable with parameters of
1985 * type @c T1, @c T2, ..., @c TN and returns a value convertible
1986 * to @c Res.
1987 * @return @c *this
1988 *
1989 * This %function object wrapper will target a copy of @a
1990 * f. If @a f is @c reference_wrapper<F>, then this function
1991 * object will contain a reference to the function object @c
1992 * f.get(). If @a f is a NULL function pointer or NULL
1993 * pointer-to-member, @c this object will be empty.
1994 *
1995 * If @a f is a non-NULL function pointer or an object of type @c
1996 * reference_wrapper<F>, this function will not throw.
1997 */
1998 template<typename _Functor>
1999 typename __gnu_cxx::__enable_if<!is_integral<_Functor>::value,
2000 function&>::__type
2001 operator=(_Functor __f)
2002 {
2003 function(__f).swap(*this);
2004 return *this;
2005 }
2006
2007 // [3.7.2.2] function modifiers
2008
2009 /**
2010 * @brief Swap the targets of two %function objects.
2011 * @param f A %function with identical call signature.
2012 *
2013 * Swap the targets of @c this function object and @a f. This
2014 * function will not throw an %exception.
2015 */
2016 void swap(function& __x)
2017 {
2018 std::swap(_M_functor, __x._M_functor);
2019 std::swap(_M_manager, __x._M_manager);
2020 std::swap(_M_invoker, __x._M_invoker);
2021 }
2022
2023 // [3.7.2.3] function capacity
2024
2025 /**
2026 * @brief Determine if the %function wrapper has a target.
2027 *
2028 * @return @c true when this %function object contains a target,
2029 * or @c false when it is empty.
2030 *
2031 * This function will not throw an %exception.
2032 */
2033 #if __cplusplus >= 201103L
2034 explicit operator bool() const
2035 { return !_M_empty(); }
2036 #else
2037 operator _Safe_bool() const
2038 {
2039 if (_M_empty())
2040 return 0;
2041 else
2042 return &_Hidden_type::_M_bool;
2043 }
2044 #endif
2045
2046 // [3.7.2.4] function invocation
2047
2048 /**
2049 * @brief Invokes the function targeted by @c *this.
2050 * @returns the result of the target.
2051 * @throws bad_function_call when @c !(bool)*this
2052 *
2053 * The function call operator invokes the target function object
2054 * stored by @c this.
2055 */
2056 _Res operator()(_ArgTypes... __args) const;
2057
2058 #if __cpp_rtti
2059 // [3.7.2.5] function target access
2060 /**
2061 * @brief Determine the type of the target of this function object
2062 * wrapper.
2063 *
2064 * @returns the type identifier of the target function object, or
2065 * @c typeid(void) if @c !(bool)*this.
2066 *
2067 * This function will not throw an %exception.
2068 */
2069 const type_info& target_type() const;
2070
2071 /**
2072 * @brief Access the stored target function object.
2073 *
2074 * @return Returns a pointer to the stored target function object,
2075 * if @c typeid(Functor).equals(target_type()); otherwise, a NULL
2076 * pointer.
2077 *
2078 * This function will not throw an %exception.
2079 */
2080 template<typename _Functor> _Functor* target();
2081
2082 /// @overload
2083 template<typename _Functor> const _Functor* target() const;
2084 #endif
2085
2086 private:
2087 // [3.7.2.6] undefined operators
2088 template<typename _Function>
2089 void operator==(const function<_Function>&) const;
2090 template<typename _Function>
2091 void operator!=(const function<_Function>&) const;
2092
2093 typedef _Res (*_Invoker_type)(const _Any_data&, _ArgTypes...);
2094 _Invoker_type _M_invoker;
2095 };
2096 #pragma GCC diagnostic pop
2097
2098 template<typename _Res, typename... _ArgTypes>
2099 function<_Res(_ArgTypes...)>::
2100 function(const function& __x)
2101 : _Function_base()
2102 {
2103 if (static_cast<bool>(__x))
2104 {
2105 __x._M_manager(_M_functor, __x._M_functor, __clone_functor);
2106 _M_invoker = __x._M_invoker;
2107 _M_manager = __x._M_manager;
2108 }
2109 }
2110
2111 template<typename _Res, typename... _ArgTypes>
2112 template<typename _Functor>
2113 function<_Res(_ArgTypes...)>::
2114 function(_Functor __f,
2115 typename __gnu_cxx::__enable_if<
2116 !is_integral<_Functor>::value, _Useless>::__type)
2117 : _Function_base()
2118 {
2119 typedef _Function_handler<_Signature_type, _Functor> _My_handler;
2120
2121 if (_My_handler::_M_not_empty_function(__f))
2122 {
2123 _My_handler::_M_init_functor(_M_functor, __f);
2124 _M_invoker = &_My_handler::_M_invoke;
2125 _M_manager = &_My_handler::_M_manager;
2126 }
2127 }
2128
2129 template<typename _Res, typename... _ArgTypes>
2130 _Res
2131 function<_Res(_ArgTypes...)>::
2132 operator()(_ArgTypes... __args) const
2133 {
2134 if (_M_empty())
2135 _GLIBCXX_THROW_OR_ABORT(bad_function_call());
2136 return _M_invoker(_M_functor, __args...);
2137 }
2138
2139 #if __cpp_rtti
2140 template<typename _Res, typename... _ArgTypes>
2141 const type_info&
2142 function<_Res(_ArgTypes...)>::
2143 target_type() const
2144 {
2145 if (_M_manager)
2146 {
2147 _Any_data __typeinfo_result;
2148 _M_manager(__typeinfo_result, _M_functor, __get_type_info);
2149 return *__typeinfo_result._M_access<const type_info*>();
2150 }
2151 else
2152 return typeid(void);
2153 }
2154
2155 template<typename _Res, typename... _ArgTypes>
2156 template<typename _Functor>
2157 _Functor*
2158 function<_Res(_ArgTypes...)>::
2159 target()
2160 {
2161 if (typeid(_Functor) == target_type() && _M_manager)
2162 {
2163 _Any_data __ptr;
2164 if (_M_manager(__ptr, _M_functor, __get_functor_ptr)
2165 && !is_const<_Functor>::value)
2166 return 0;
2167 else
2168 return __ptr._M_access<_Functor*>();
2169 }
2170 else
2171 return 0;
2172 }
2173
2174 template<typename _Res, typename... _ArgTypes>
2175 template<typename _Functor>
2176 const _Functor*
2177 function<_Res(_ArgTypes...)>::
2178 target() const
2179 {
2180 if (typeid(_Functor) == target_type() && _M_manager)
2181 {
2182 _Any_data __ptr;
2183 _M_manager(__ptr, _M_functor, __get_functor_ptr);
2184 return __ptr._M_access<const _Functor*>();
2185 }
2186 else
2187 return 0;
2188 }
2189 #endif
2190
2191 // [3.7.2.7] null pointer comparisons
2192
2193 /**
2194 * @brief Compares a polymorphic function object wrapper against 0
2195 * (the NULL pointer).
2196 * @returns @c true if the wrapper has no target, @c false otherwise
2197 *
2198 * This function will not throw an %exception.
2199 */
2200 template<typename _Signature>
2201 inline bool
2202 operator==(const function<_Signature>& __f, _M_clear_type*)
2203 { return !static_cast<bool>(__f); }
2204
2205 /// @overload
2206 template<typename _Signature>
2207 inline bool
2208 operator==(_M_clear_type*, const function<_Signature>& __f)
2209 { return !static_cast<bool>(__f); }
2210
2211 /**
2212 * @brief Compares a polymorphic function object wrapper against 0
2213 * (the NULL pointer).
2214 * @returns @c false if the wrapper has no target, @c true otherwise
2215 *
2216 * This function will not throw an %exception.
2217 */
2218 template<typename _Signature>
2219 inline bool
2220 operator!=(const function<_Signature>& __f, _M_clear_type*)
2221 { return static_cast<bool>(__f); }
2222
2223 /// @overload
2224 template<typename _Signature>
2225 inline bool
2226 operator!=(_M_clear_type*, const function<_Signature>& __f)
2227 { return static_cast<bool>(__f); }
2228
2229 // [3.7.2.8] specialized algorithms
2230
2231 /**
2232 * @brief Swap the targets of two polymorphic function object wrappers.
2233 *
2234 * This function will not throw an %exception.
2235 */
2236 template<typename _Signature>
2237 inline void
2238 swap(function<_Signature>& __x, function<_Signature>& __y)
2239 { __x.swap(__y); }
2240 }
2241
2242 #if __cplusplus >= 201103L
2243 // Specialize std::is_bind_expression for tr1::bind closure types,
2244 // so that they can also work with std::bind.
2245
2246 template<typename _Signature>
2247 struct is_bind_expression<tr1::_Bind<_Signature>>
2248 : true_type { };
2249
2250 template<typename _Signature>
2251 struct is_bind_expression<const tr1::_Bind<_Signature>>
2252 : true_type { };
2253
2254 template<typename _Signature>
2255 struct is_bind_expression<volatile tr1::_Bind<_Signature>>
2256 : true_type { };
2257
2258 template<typename _Signature>
2259 struct is_bind_expression<const volatile tr1::_Bind<_Signature>>
2260 : true_type { };
2261
2262 template<typename _Result, typename _Signature>
2263 struct is_bind_expression<tr1::_Bind_result<_Result, _Signature>>
2264 : true_type { };
2265
2266 template<typename _Result, typename _Signature>
2267 struct is_bind_expression<const tr1::_Bind_result<_Result, _Signature>>
2268 : true_type { };
2269
2270 template<typename _Result, typename _Signature>
2271 struct is_bind_expression<volatile tr1::_Bind_result<_Result, _Signature>>
2272 : true_type { };
2273
2274 template<typename _Result, typename _Signature>
2275 struct is_bind_expression<const volatile tr1::_Bind_result<_Result,
2276 _Signature>>
2277 : true_type { };
2278
2279 #endif // C++11
2280 _GLIBCXX_END_NAMESPACE_VERSION
2281 }
2282
2283 #endif // _GLIBCXX_TR1_FUNCTIONAL