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