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