1 // Functor implementations -*- C++ -*- 2 3 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 4 // Free Software Foundation, Inc. 5 // 6 // This file is part of the GNU ISO C++ Library. This library is free 7 // software; you can redistribute it and/or modify it under the 8 // terms of the GNU General Public License as published by the 9 // Free Software Foundation; either version 3, or (at your option) 10 // any later version. 11 12 // This library is distributed in the hope that it will be useful, 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 // GNU General Public License for more details. 16 17 // Under Section 7 of GPL version 3, you are granted additional 18 // permissions described in the GCC Runtime Library Exception, version 19 // 3.1, as published by the Free Software Foundation. 20 21 // You should have received a copy of the GNU General Public License and 22 // a copy of the GCC Runtime Library Exception along with this program; 23 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24 // <http://www.gnu.org/licenses/>. 25 26 /* 27 * 28 * Copyright (c) 1994 29 * Hewlett-Packard Company 30 * 31 * Permission to use, copy, modify, distribute and sell this software 32 * and its documentation for any purpose is hereby granted without fee, 33 * provided that the above copyright notice appear in all copies and 34 * that both that copyright notice and this permission notice appear 35 * in supporting documentation. Hewlett-Packard Company makes no 36 * representations about the suitability of this software for any 37 * purpose. It is provided "as is" without express or implied warranty. 38 * 39 * 40 * Copyright (c) 1996-1998 41 * Silicon Graphics Computer Systems, Inc. 42 * 43 * Permission to use, copy, modify, distribute and sell this software 44 * and its documentation for any purpose is hereby granted without fee, 45 * provided that the above copyright notice appear in all copies and 46 * that both that copyright notice and this permission notice appear 47 * in supporting documentation. Silicon Graphics makes no 48 * representations about the suitability of this software for any 49 * purpose. It is provided "as is" without express or implied warranty. 50 */ 51 52 /** @file bits/stl_function.h 53 * This is an internal header file, included by other library headers. 54 * Do not attempt to use it directly. @headername{functional} 55 */ 56 57 #ifndef _STL_FUNCTION_H 58 #define _STL_FUNCTION_H 1 59 60 namespace std _GLIBCXX_VISIBILITY(default) 61 { 62 _GLIBCXX_BEGIN_NAMESPACE_VERSION 63 64 // 20.3.1 base classes 65 /** @defgroup functors Function Objects 66 * @ingroup utilities 67 * 68 * Function objects, or @e functors, are objects with an @c operator() 69 * defined and accessible. They can be passed as arguments to algorithm 70 * templates and used in place of a function pointer. Not only is the 71 * resulting expressiveness of the library increased, but the generated 72 * code can be more efficient than what you might write by hand. When we 73 * refer to @a functors, then, generally we include function pointers in 74 * the description as well. 75 * 76 * Often, functors are only created as temporaries passed to algorithm 77 * calls, rather than being created as named variables. 78 * 79 * Two examples taken from the standard itself follow. To perform a 80 * by-element addition of two vectors @c a and @c b containing @c double, 81 * and put the result in @c a, use 82 * \code 83 * transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>()); 84 * \endcode 85 * To negate every element in @c a, use 86 * \code 87 * transform(a.begin(), a.end(), a.begin(), negate<double>()); 88 * \endcode 89 * The addition and negation functions will be inlined directly. 90 * 91 * The standard functors are derived from structs named @c unary_function 92 * and @c binary_function. These two classes contain nothing but typedefs, 93 * to aid in generic (template) programming. If you write your own 94 * functors, you might consider doing the same. 95 * 96 * @{ 97 */ 98 /** 99 * This is one of the @link functors functor base classes@endlink. 100 */ 101 template<typename _Arg, typename _Result> 102 struct unary_function 103 { 104 /// @c argument_type is the type of the argument 105 typedef _Arg argument_type; 106 107 /// @c result_type is the return type 108 typedef _Result result_type; 109 }; 110 111 /** 112 * This is one of the @link functors functor base classes@endlink. 113 */ 114 template<typename _Arg1, typename _Arg2, typename _Result> 115 struct binary_function 116 { 117 /// @c first_argument_type is the type of the first argument 118 typedef _Arg1 first_argument_type; 119 120 /// @c second_argument_type is the type of the second argument 121 typedef _Arg2 second_argument_type; 122 123 /// @c result_type is the return type 124 typedef _Result result_type; 125 }; 126 /** @} */ 127 128 // 20.3.2 arithmetic 129 /** @defgroup arithmetic_functors Arithmetic Classes 130 * @ingroup functors 131 * 132 * Because basic math often needs to be done during an algorithm, 133 * the library provides functors for those operations. See the 134 * documentation for @link functors the base classes@endlink 135 * for examples of their use. 136 * 137 * @{ 138 */ 139 /// One of the @link arithmetic_functors math functors@endlink. 140 template<typename _Tp> 141 struct plus : public binary_function<_Tp, _Tp, _Tp> 142 { 143 _Tp 144 operator()(const _Tp& __x, const _Tp& __y) const 145 { return __x + __y; } 146 }; 147 148 /// One of the @link arithmetic_functors math functors@endlink. 149 template<typename _Tp> 150 struct minus : public binary_function<_Tp, _Tp, _Tp> 151 { 152 _Tp 153 operator()(const _Tp& __x, const _Tp& __y) const 154 { return __x - __y; } 155 }; 156 157 /// One of the @link arithmetic_functors math functors@endlink. 158 template<typename _Tp> 159 struct multiplies : public binary_function<_Tp, _Tp, _Tp> 160 { 161 _Tp 162 operator()(const _Tp& __x, const _Tp& __y) const 163 { return __x * __y; } 164 }; 165 166 /// One of the @link arithmetic_functors math functors@endlink. 167 template<typename _Tp> 168 struct divides : public binary_function<_Tp, _Tp, _Tp> 169 { 170 _Tp 171 operator()(const _Tp& __x, const _Tp& __y) const 172 { return __x / __y; } 173 }; 174 175 /// One of the @link arithmetic_functors math functors@endlink. 176 template<typename _Tp> 177 struct modulus : public binary_function<_Tp, _Tp, _Tp> 178 { 179 _Tp 180 operator()(const _Tp& __x, const _Tp& __y) const 181 { return __x % __y; } 182 }; 183 184 /// One of the @link arithmetic_functors math functors@endlink. 185 template<typename _Tp> 186 struct negate : public unary_function<_Tp, _Tp> 187 { 188 _Tp 189 operator()(const _Tp& __x) const 190 { return -__x; } 191 }; 192 /** @} */ 193 194 // 20.3.3 comparisons 195 /** @defgroup comparison_functors Comparison Classes 196 * @ingroup functors 197 * 198 * The library provides six wrapper functors for all the basic comparisons 199 * in C++, like @c <. 200 * 201 * @{ 202 */ 203 /// One of the @link comparison_functors comparison functors@endlink. 204 template<typename _Tp> 205 struct equal_to : public binary_function<_Tp, _Tp, bool> 206 { 207 bool 208 operator()(const _Tp& __x, const _Tp& __y) const 209 { return __x == __y; } 210 }; 211 212 /// One of the @link comparison_functors comparison functors@endlink. 213 template<typename _Tp> 214 struct not_equal_to : public binary_function<_Tp, _Tp, bool> 215 { 216 bool 217 operator()(const _Tp& __x, const _Tp& __y) const 218 { return __x != __y; } 219 }; 220 221 /// One of the @link comparison_functors comparison functors@endlink. 222 template<typename _Tp> 223 struct greater : public binary_function<_Tp, _Tp, bool> 224 { 225 bool 226 operator()(const _Tp& __x, const _Tp& __y) const 227 { return __x > __y; } 228 }; 229 230 /// One of the @link comparison_functors comparison functors@endlink. 231 template<typename _Tp> 232 struct less : public binary_function<_Tp, _Tp, bool> 233 { 234 bool 235 operator()(const _Tp& __x, const _Tp& __y) const 236 { return __x < __y; } 237 }; 238 239 /// One of the @link comparison_functors comparison functors@endlink. 240 template<typename _Tp> 241 struct greater_equal : public binary_function<_Tp, _Tp, bool> 242 { 243 bool 244 operator()(const _Tp& __x, const _Tp& __y) const 245 { return __x >= __y; } 246 }; 247 248 /// One of the @link comparison_functors comparison functors@endlink. 249 template<typename _Tp> 250 struct less_equal : public binary_function<_Tp, _Tp, bool> 251 { 252 bool 253 operator()(const _Tp& __x, const _Tp& __y) const 254 { return __x <= __y; } 255 }; 256 /** @} */ 257 258 // 20.3.4 logical operations 259 /** @defgroup logical_functors Boolean Operations Classes 260 * @ingroup functors 261 * 262 * Here are wrapper functors for Boolean operations: @c &&, @c ||, 263 * and @c !. 264 * 265 * @{ 266 */ 267 /// One of the @link logical_functors Boolean operations functors@endlink. 268 template<typename _Tp> 269 struct logical_and : public binary_function<_Tp, _Tp, bool> 270 { 271 bool 272 operator()(const _Tp& __x, const _Tp& __y) const 273 { return __x && __y; } 274 }; 275 276 /// One of the @link logical_functors Boolean operations functors@endlink. 277 template<typename _Tp> 278 struct logical_or : public binary_function<_Tp, _Tp, bool> 279 { 280 bool 281 operator()(const _Tp& __x, const _Tp& __y) const 282 { return __x || __y; } 283 }; 284 285 /// One of the @link logical_functors Boolean operations functors@endlink. 286 template<typename _Tp> 287 struct logical_not : public unary_function<_Tp, bool> 288 { 289 bool 290 operator()(const _Tp& __x) const 291 { return !__x; } 292 }; 293 /** @} */ 294 295 // _GLIBCXX_RESOLVE_LIB_DEFECTS 296 // DR 660. Missing Bitwise Operations. 297 template<typename _Tp> 298 struct bit_and : public binary_function<_Tp, _Tp, _Tp> 299 { 300 _Tp 301 operator()(const _Tp& __x, const _Tp& __y) const 302 { return __x & __y; } 303 }; 304 305 template<typename _Tp> 306 struct bit_or : public binary_function<_Tp, _Tp, _Tp> 307 { 308 _Tp 309 operator()(const _Tp& __x, const _Tp& __y) const 310 { return __x | __y; } 311 }; 312 313 template<typename _Tp> 314 struct bit_xor : public binary_function<_Tp, _Tp, _Tp> 315 { 316 _Tp 317 operator()(const _Tp& __x, const _Tp& __y) const 318 { return __x ^ __y; } 319 }; 320 321 // 20.3.5 negators 322 /** @defgroup negators Negators 323 * @ingroup functors 324 * 325 * The functions @c not1 and @c not2 each take a predicate functor 326 * and return an instance of @c unary_negate or 327 * @c binary_negate, respectively. These classes are functors whose 328 * @c operator() performs the stored predicate function and then returns 329 * the negation of the result. 330 * 331 * For example, given a vector of integers and a trivial predicate, 332 * \code 333 * struct IntGreaterThanThree 334 * : public std::unary_function<int, bool> 335 * { 336 * bool operator() (int x) { return x > 3; } 337 * }; 338 * 339 * std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree())); 340 * \endcode 341 * The call to @c find_if will locate the first index (i) of @c v for which 342 * <code>!(v[i] > 3)</code> is true. 343 * 344 * The not1/unary_negate combination works on predicates taking a single 345 * argument. The not2/binary_negate combination works on predicates which 346 * take two arguments. 347 * 348 * @{ 349 */ 350 /// One of the @link negators negation functors@endlink. 351 template<typename _Predicate> 352 class unary_negate 353 : public unary_function<typename _Predicate::argument_type, bool> 354 { 355 protected: 356 _Predicate _M_pred; 357 358 public: 359 explicit 360 unary_negate(const _Predicate& __x) : _M_pred(__x) { } 361 362 bool 363 operator()(const typename _Predicate::argument_type& __x) const 364 { return !_M_pred(__x); } 365 }; 366 367 /// One of the @link negators negation functors@endlink. 368 template<typename _Predicate> 369 inline unary_negate<_Predicate> 370 not1(const _Predicate& __pred) 371 { return unary_negate<_Predicate>(__pred); } 372 373 /// One of the @link negators negation functors@endlink. 374 template<typename _Predicate> 375 class binary_negate 376 : public binary_function<typename _Predicate::first_argument_type, 377 typename _Predicate::second_argument_type, bool> 378 { 379 protected: 380 _Predicate _M_pred; 381 382 public: 383 explicit 384 binary_negate(const _Predicate& __x) : _M_pred(__x) { } 385 386 bool 387 operator()(const typename _Predicate::first_argument_type& __x, 388 const typename _Predicate::second_argument_type& __y) const 389 { return !_M_pred(__x, __y); } 390 }; 391 392 /// One of the @link negators negation functors@endlink. 393 template<typename _Predicate> 394 inline binary_negate<_Predicate> 395 not2(const _Predicate& __pred) 396 { return binary_negate<_Predicate>(__pred); } 397 /** @} */ 398 399 // 20.3.7 adaptors pointers functions 400 /** @defgroup pointer_adaptors Adaptors for pointers to functions 401 * @ingroup functors 402 * 403 * The advantage of function objects over pointers to functions is that 404 * the objects in the standard library declare nested typedefs describing 405 * their argument and result types with uniform names (e.g., @c result_type 406 * from the base classes @c unary_function and @c binary_function). 407 * Sometimes those typedefs are required, not just optional. 408 * 409 * Adaptors are provided to turn pointers to unary (single-argument) and 410 * binary (double-argument) functions into function objects. The 411 * long-winded functor @c pointer_to_unary_function is constructed with a 412 * function pointer @c f, and its @c operator() called with argument @c x 413 * returns @c f(x). The functor @c pointer_to_binary_function does the same 414 * thing, but with a double-argument @c f and @c operator(). 415 * 416 * The function @c ptr_fun takes a pointer-to-function @c f and constructs 417 * an instance of the appropriate functor. 418 * 419 * @{ 420 */ 421 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 422 template<typename _Arg, typename _Result> 423 class pointer_to_unary_function : public unary_function<_Arg, _Result> 424 { 425 protected: 426 _Result (*_M_ptr)(_Arg); 427 428 public: 429 pointer_to_unary_function() { } 430 431 explicit 432 pointer_to_unary_function(_Result (*__x)(_Arg)) 433 : _M_ptr(__x) { } 434 435 _Result 436 operator()(_Arg __x) const 437 { return _M_ptr(__x); } 438 }; 439 440 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 441 template<typename _Arg, typename _Result> 442 inline pointer_to_unary_function<_Arg, _Result> 443 ptr_fun(_Result (*__x)(_Arg)) 444 { return pointer_to_unary_function<_Arg, _Result>(__x); } 445 446 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 447 template<typename _Arg1, typename _Arg2, typename _Result> 448 class pointer_to_binary_function 449 : public binary_function<_Arg1, _Arg2, _Result> 450 { 451 protected: 452 _Result (*_M_ptr)(_Arg1, _Arg2); 453 454 public: 455 pointer_to_binary_function() { } 456 457 explicit 458 pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2)) 459 : _M_ptr(__x) { } 460 461 _Result 462 operator()(_Arg1 __x, _Arg2 __y) const 463 { return _M_ptr(__x, __y); } 464 }; 465 466 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 467 template<typename _Arg1, typename _Arg2, typename _Result> 468 inline pointer_to_binary_function<_Arg1, _Arg2, _Result> 469 ptr_fun(_Result (*__x)(_Arg1, _Arg2)) 470 { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); } 471 /** @} */ 472 473 template<typename _Tp> 474 struct _Identity : public unary_function<_Tp,_Tp> 475 { 476 _Tp& 477 operator()(_Tp& __x) const 478 { return __x; } 479 480 const _Tp& 481 operator()(const _Tp& __x) const 482 { return __x; } 483 }; 484 485 template<typename _Pair> 486 struct _Select1st : public unary_function<_Pair, 487 typename _Pair::first_type> 488 { 489 typename _Pair::first_type& 490 operator()(_Pair& __x) const 491 { return __x.first; } 492 493 const typename _Pair::first_type& 494 operator()(const _Pair& __x) const 495 { return __x.first; } 496 497 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 498 template<typename _Pair2> 499 typename _Pair2::first_type& 500 operator()(_Pair2& __x) const 501 { return __x.first; } 502 503 template<typename _Pair2> 504 const typename _Pair2::first_type& 505 operator()(const _Pair2& __x) const 506 { return __x.first; } 507 #endif 508 }; 509 510 template<typename _Pair> 511 struct _Select2nd : public unary_function<_Pair, 512 typename _Pair::second_type> 513 { 514 typename _Pair::second_type& 515 operator()(_Pair& __x) const 516 { return __x.second; } 517 518 const typename _Pair::second_type& 519 operator()(const _Pair& __x) const 520 { return __x.second; } 521 }; 522 523 // 20.3.8 adaptors pointers members 524 /** @defgroup memory_adaptors Adaptors for pointers to members 525 * @ingroup functors 526 * 527 * There are a total of 8 = 2^3 function objects in this family. 528 * (1) Member functions taking no arguments vs member functions taking 529 * one argument. 530 * (2) Call through pointer vs call through reference. 531 * (3) Const vs non-const member function. 532 * 533 * All of this complexity is in the function objects themselves. You can 534 * ignore it by using the helper function mem_fun and mem_fun_ref, 535 * which create whichever type of adaptor is appropriate. 536 * 537 * @{ 538 */ 539 /// One of the @link memory_adaptors adaptors for member 540 /// pointers@endlink. 541 template<typename _Ret, typename _Tp> 542 class mem_fun_t : public unary_function<_Tp*, _Ret> 543 { 544 public: 545 explicit 546 mem_fun_t(_Ret (_Tp::*__pf)()) 547 : _M_f(__pf) { } 548 549 _Ret 550 operator()(_Tp* __p) const 551 { return (__p->*_M_f)(); } 552 553 private: 554 _Ret (_Tp::*_M_f)(); 555 }; 556 557 /// One of the @link memory_adaptors adaptors for member 558 /// pointers@endlink. 559 template<typename _Ret, typename _Tp> 560 class const_mem_fun_t : public unary_function<const _Tp*, _Ret> 561 { 562 public: 563 explicit 564 const_mem_fun_t(_Ret (_Tp::*__pf)() const) 565 : _M_f(__pf) { } 566 567 _Ret 568 operator()(const _Tp* __p) const 569 { return (__p->*_M_f)(); } 570 571 private: 572 _Ret (_Tp::*_M_f)() const; 573 }; 574 575 /// One of the @link memory_adaptors adaptors for member 576 /// pointers@endlink. 577 template<typename _Ret, typename _Tp> 578 class mem_fun_ref_t : public unary_function<_Tp, _Ret> 579 { 580 public: 581 explicit 582 mem_fun_ref_t(_Ret (_Tp::*__pf)()) 583 : _M_f(__pf) { } 584 585 _Ret 586 operator()(_Tp& __r) const 587 { return (__r.*_M_f)(); } 588 589 private: 590 _Ret (_Tp::*_M_f)(); 591 }; 592 593 /// One of the @link memory_adaptors adaptors for member 594 /// pointers@endlink. 595 template<typename _Ret, typename _Tp> 596 class const_mem_fun_ref_t : public unary_function<_Tp, _Ret> 597 { 598 public: 599 explicit 600 const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) 601 : _M_f(__pf) { } 602 603 _Ret 604 operator()(const _Tp& __r) const 605 { return (__r.*_M_f)(); } 606 607 private: 608 _Ret (_Tp::*_M_f)() const; 609 }; 610 611 /// One of the @link memory_adaptors adaptors for member 612 /// pointers@endlink. 613 template<typename _Ret, typename _Tp, typename _Arg> 614 class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret> 615 { 616 public: 617 explicit 618 mem_fun1_t(_Ret (_Tp::*__pf)(_Arg)) 619 : _M_f(__pf) { } 620 621 _Ret 622 operator()(_Tp* __p, _Arg __x) const 623 { return (__p->*_M_f)(__x); } 624 625 private: 626 _Ret (_Tp::*_M_f)(_Arg); 627 }; 628 629 /// One of the @link memory_adaptors adaptors for member 630 /// pointers@endlink. 631 template<typename _Ret, typename _Tp, typename _Arg> 632 class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret> 633 { 634 public: 635 explicit 636 const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const) 637 : _M_f(__pf) { } 638 639 _Ret 640 operator()(const _Tp* __p, _Arg __x) const 641 { return (__p->*_M_f)(__x); } 642 643 private: 644 _Ret (_Tp::*_M_f)(_Arg) const; 645 }; 646 647 /// One of the @link memory_adaptors adaptors for member 648 /// pointers@endlink. 649 template<typename _Ret, typename _Tp, typename _Arg> 650 class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret> 651 { 652 public: 653 explicit 654 mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg)) 655 : _M_f(__pf) { } 656 657 _Ret 658 operator()(_Tp& __r, _Arg __x) const 659 { return (__r.*_M_f)(__x); } 660 661 private: 662 _Ret (_Tp::*_M_f)(_Arg); 663 }; 664 665 /// One of the @link memory_adaptors adaptors for member 666 /// pointers@endlink. 667 template<typename _Ret, typename _Tp, typename _Arg> 668 class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret> 669 { 670 public: 671 explicit 672 const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const) 673 : _M_f(__pf) { } 674 675 _Ret 676 operator()(const _Tp& __r, _Arg __x) const 677 { return (__r.*_M_f)(__x); } 678 679 private: 680 _Ret (_Tp::*_M_f)(_Arg) const; 681 }; 682 683 // Mem_fun adaptor helper functions. There are only two: 684 // mem_fun and mem_fun_ref. 685 template<typename _Ret, typename _Tp> 686 inline mem_fun_t<_Ret, _Tp> 687 mem_fun(_Ret (_Tp::*__f)()) 688 { return mem_fun_t<_Ret, _Tp>(__f); } 689 690 template<typename _Ret, typename _Tp> 691 inline const_mem_fun_t<_Ret, _Tp> 692 mem_fun(_Ret (_Tp::*__f)() const) 693 { return const_mem_fun_t<_Ret, _Tp>(__f); } 694 695 template<typename _Ret, typename _Tp> 696 inline mem_fun_ref_t<_Ret, _Tp> 697 mem_fun_ref(_Ret (_Tp::*__f)()) 698 { return mem_fun_ref_t<_Ret, _Tp>(__f); } 699 700 template<typename _Ret, typename _Tp> 701 inline const_mem_fun_ref_t<_Ret, _Tp> 702 mem_fun_ref(_Ret (_Tp::*__f)() const) 703 { return const_mem_fun_ref_t<_Ret, _Tp>(__f); } 704 705 template<typename _Ret, typename _Tp, typename _Arg> 706 inline mem_fun1_t<_Ret, _Tp, _Arg> 707 mem_fun(_Ret (_Tp::*__f)(_Arg)) 708 { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); } 709 710 template<typename _Ret, typename _Tp, typename _Arg> 711 inline const_mem_fun1_t<_Ret, _Tp, _Arg> 712 mem_fun(_Ret (_Tp::*__f)(_Arg) const) 713 { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); } 714 715 template<typename _Ret, typename _Tp, typename _Arg> 716 inline mem_fun1_ref_t<_Ret, _Tp, _Arg> 717 mem_fun_ref(_Ret (_Tp::*__f)(_Arg)) 718 { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); } 719 720 template<typename _Ret, typename _Tp, typename _Arg> 721 inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg> 722 mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const) 723 { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); } 724 725 /** @} */ 726 727 _GLIBCXX_END_NAMESPACE_VERSION 728 } // namespace 729 730 #if !defined(__GXX_EXPERIMENTAL_CXX0X__) || _GLIBCXX_USE_DEPRECATED 731 # include <backward/binders.h> 732 #endif 733 734 #endif /* _STL_FUNCTION_H */ 735