1 // Functor implementations -*- C++ -*- 2 3 // Copyright (C) 2001-2013 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 * 27 * Copyright (c) 1994 28 * Hewlett-Packard Company 29 * 30 * Permission to use, copy, modify, distribute and sell this software 31 * and its documentation for any purpose is hereby granted without fee, 32 * provided that the above copyright notice appear in all copies and 33 * that both that copyright notice and this permission notice appear 34 * in supporting documentation. Hewlett-Packard Company makes no 35 * representations about the suitability of this software for any 36 * purpose. It is provided "as is" without express or implied warranty. 37 * 38 * 39 * Copyright (c) 1996-1998 40 * Silicon Graphics Computer Systems, Inc. 41 * 42 * Permission to use, copy, modify, distribute and sell this software 43 * and its documentation for any purpose is hereby granted without fee, 44 * provided that the above copyright notice appear in all copies and 45 * that both that copyright notice and this permission notice appear 46 * in supporting documentation. Silicon Graphics makes no 47 * representations about the suitability of this software for any 48 * purpose. It is provided "as is" without express or implied warranty. 49 */ 50 51 /** @file bits/stl_function.h 52 * This is an internal header file, included by other library headers. 53 * Do not attempt to use it directly. @headername{functional} 54 */ 55 56 #ifndef _STL_FUNCTION_H 57 #define _STL_FUNCTION_H 1 58 59 namespace std _GLIBCXX_VISIBILITY(default) 60 { 61 _GLIBCXX_BEGIN_NAMESPACE_VERSION 62 63 // 20.3.1 base classes 64 /** @defgroup functors Function Objects 65 * @ingroup utilities 66 * 67 * Function objects, or @e functors, are objects with an @c operator() 68 * defined and accessible. They can be passed as arguments to algorithm 69 * templates and used in place of a function pointer. Not only is the 70 * resulting expressiveness of the library increased, but the generated 71 * code can be more efficient than what you might write by hand. When we 72 * refer to @a functors, then, generally we include function pointers in 73 * the description as well. 74 * 75 * Often, functors are only created as temporaries passed to algorithm 76 * calls, rather than being created as named variables. 77 * 78 * Two examples taken from the standard itself follow. To perform a 79 * by-element addition of two vectors @c a and @c b containing @c double, 80 * and put the result in @c a, use 81 * \code 82 * transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>()); 83 * \endcode 84 * To negate every element in @c a, use 85 * \code 86 * transform(a.begin(), a.end(), a.begin(), negate<double>()); 87 * \endcode 88 * The addition and negation functions will be inlined directly. 89 * 90 * The standard functors are derived from structs named @c unary_function 91 * and @c binary_function. These two classes contain nothing but typedefs, 92 * to aid in generic (template) programming. If you write your own 93 * functors, you might consider doing the same. 94 * 95 * @{ 96 */ 97 /** 98 * This is one of the @link functors functor base classes@endlink. 99 */ 100 template<typename _Arg, typename _Result> 101 struct unary_function 102 { 103 /// @c argument_type is the type of the argument 104 typedef _Arg argument_type; 105 106 /// @c result_type is the return type 107 typedef _Result result_type; 108 }; 109 110 /** 111 * This is one of the @link functors functor base classes@endlink. 112 */ 113 template<typename _Arg1, typename _Arg2, typename _Result> 114 struct binary_function 115 { 116 /// @c first_argument_type is the type of the first argument 117 typedef _Arg1 first_argument_type; 118 119 /// @c second_argument_type is the type of the second argument 120 typedef _Arg2 second_argument_type; 121 122 /// @c result_type is the return type 123 typedef _Result result_type; 124 }; 125 /** @} */ 126 127 // 20.3.2 arithmetic 128 /** @defgroup arithmetic_functors Arithmetic Classes 129 * @ingroup functors 130 * 131 * Because basic math often needs to be done during an algorithm, 132 * the library provides functors for those operations. See the 133 * documentation for @link functors the base classes@endlink 134 * for examples of their use. 135 * 136 * @{ 137 */ 138 /// One of the @link arithmetic_functors math functors@endlink. 139 template<typename _Tp> 140 struct plus : public binary_function<_Tp, _Tp, _Tp> 141 { 142 _Tp 143 operator()(const _Tp& __x, const _Tp& __y) const 144 { return __x + __y; } 145 }; 146 147 /// One of the @link arithmetic_functors math functors@endlink. 148 template<typename _Tp> 149 struct minus : public binary_function<_Tp, _Tp, _Tp> 150 { 151 _Tp 152 operator()(const _Tp& __x, const _Tp& __y) const 153 { return __x - __y; } 154 }; 155 156 /// One of the @link arithmetic_functors math functors@endlink. 157 template<typename _Tp> 158 struct multiplies : public binary_function<_Tp, _Tp, _Tp> 159 { 160 _Tp 161 operator()(const _Tp& __x, const _Tp& __y) const 162 { return __x * __y; } 163 }; 164 165 /// One of the @link arithmetic_functors math functors@endlink. 166 template<typename _Tp> 167 struct divides : public binary_function<_Tp, _Tp, _Tp> 168 { 169 _Tp 170 operator()(const _Tp& __x, const _Tp& __y) const 171 { return __x / __y; } 172 }; 173 174 /// One of the @link arithmetic_functors math functors@endlink. 175 template<typename _Tp> 176 struct modulus : public binary_function<_Tp, _Tp, _Tp> 177 { 178 _Tp 179 operator()(const _Tp& __x, const _Tp& __y) const 180 { return __x % __y; } 181 }; 182 183 /// One of the @link arithmetic_functors math functors@endlink. 184 template<typename _Tp> 185 struct negate : public unary_function<_Tp, _Tp> 186 { 187 _Tp 188 operator()(const _Tp& __x) const 189 { return -__x; } 190 }; 191 /** @} */ 192 193 // 20.3.3 comparisons 194 /** @defgroup comparison_functors Comparison Classes 195 * @ingroup functors 196 * 197 * The library provides six wrapper functors for all the basic comparisons 198 * in C++, like @c <. 199 * 200 * @{ 201 */ 202 /// One of the @link comparison_functors comparison functors@endlink. 203 template<typename _Tp> 204 struct equal_to : public binary_function<_Tp, _Tp, bool> 205 { 206 bool 207 operator()(const _Tp& __x, const _Tp& __y) const 208 { return __x == __y; } 209 }; 210 211 /// One of the @link comparison_functors comparison functors@endlink. 212 template<typename _Tp> 213 struct not_equal_to : public binary_function<_Tp, _Tp, bool> 214 { 215 bool 216 operator()(const _Tp& __x, const _Tp& __y) const 217 { return __x != __y; } 218 }; 219 220 /// One of the @link comparison_functors comparison functors@endlink. 221 template<typename _Tp> 222 struct greater : public binary_function<_Tp, _Tp, bool> 223 { 224 bool 225 operator()(const _Tp& __x, const _Tp& __y) const 226 { return __x > __y; } 227 }; 228 229 /// One of the @link comparison_functors comparison functors@endlink. 230 template<typename _Tp> 231 struct less : public binary_function<_Tp, _Tp, bool> 232 { 233 bool 234 operator()(const _Tp& __x, const _Tp& __y) const 235 { return __x < __y; } 236 }; 237 238 /// One of the @link comparison_functors comparison functors@endlink. 239 template<typename _Tp> 240 struct greater_equal : public binary_function<_Tp, _Tp, bool> 241 { 242 bool 243 operator()(const _Tp& __x, const _Tp& __y) const 244 { return __x >= __y; } 245 }; 246 247 /// One of the @link comparison_functors comparison functors@endlink. 248 template<typename _Tp> 249 struct less_equal : public binary_function<_Tp, _Tp, bool> 250 { 251 bool 252 operator()(const _Tp& __x, const _Tp& __y) const 253 { return __x <= __y; } 254 }; 255 /** @} */ 256 257 // 20.3.4 logical operations 258 /** @defgroup logical_functors Boolean Operations Classes 259 * @ingroup functors 260 * 261 * Here are wrapper functors for Boolean operations: @c &&, @c ||, 262 * and @c !. 263 * 264 * @{ 265 */ 266 /// One of the @link logical_functors Boolean operations functors@endlink. 267 template<typename _Tp> 268 struct logical_and : public binary_function<_Tp, _Tp, bool> 269 { 270 bool 271 operator()(const _Tp& __x, const _Tp& __y) const 272 { return __x && __y; } 273 }; 274 275 /// One of the @link logical_functors Boolean operations functors@endlink. 276 template<typename _Tp> 277 struct logical_or : public binary_function<_Tp, _Tp, bool> 278 { 279 bool 280 operator()(const _Tp& __x, const _Tp& __y) const 281 { return __x || __y; } 282 }; 283 284 /// One of the @link logical_functors Boolean operations functors@endlink. 285 template<typename _Tp> 286 struct logical_not : public unary_function<_Tp, bool> 287 { 288 bool 289 operator()(const _Tp& __x) const 290 { return !__x; } 291 }; 292 /** @} */ 293 294 // _GLIBCXX_RESOLVE_LIB_DEFECTS 295 // DR 660. Missing Bitwise Operations. 296 template<typename _Tp> 297 struct bit_and : public binary_function<_Tp, _Tp, _Tp> 298 { 299 _Tp 300 operator()(const _Tp& __x, const _Tp& __y) const 301 { return __x & __y; } 302 }; 303 304 template<typename _Tp> 305 struct bit_or : public binary_function<_Tp, _Tp, _Tp> 306 { 307 _Tp 308 operator()(const _Tp& __x, const _Tp& __y) const 309 { return __x | __y; } 310 }; 311 312 template<typename _Tp> 313 struct bit_xor : public binary_function<_Tp, _Tp, _Tp> 314 { 315 _Tp 316 operator()(const _Tp& __x, const _Tp& __y) const 317 { return __x ^ __y; } 318 }; 319 320 // 20.3.5 negators 321 /** @defgroup negators Negators 322 * @ingroup functors 323 * 324 * The functions @c not1 and @c not2 each take a predicate functor 325 * and return an instance of @c unary_negate or 326 * @c binary_negate, respectively. These classes are functors whose 327 * @c operator() performs the stored predicate function and then returns 328 * the negation of the result. 329 * 330 * For example, given a vector of integers and a trivial predicate, 331 * \code 332 * struct IntGreaterThanThree 333 * : public std::unary_function<int, bool> 334 * { 335 * bool operator() (int x) { return x > 3; } 336 * }; 337 * 338 * std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree())); 339 * \endcode 340 * The call to @c find_if will locate the first index (i) of @c v for which 341 * <code>!(v[i] > 3)</code> is true. 342 * 343 * The not1/unary_negate combination works on predicates taking a single 344 * argument. The not2/binary_negate combination works on predicates which 345 * take two arguments. 346 * 347 * @{ 348 */ 349 /// One of the @link negators negation functors@endlink. 350 template<typename _Predicate> 351 class unary_negate 352 : public unary_function<typename _Predicate::argument_type, bool> 353 { 354 protected: 355 _Predicate _M_pred; 356 357 public: 358 explicit 359 unary_negate(const _Predicate& __x) : _M_pred(__x) { } 360 361 bool 362 operator()(const typename _Predicate::argument_type& __x) const 363 { return !_M_pred(__x); } 364 }; 365 366 /// One of the @link negators negation functors@endlink. 367 template<typename _Predicate> 368 inline unary_negate<_Predicate> 369 not1(const _Predicate& __pred) 370 { return unary_negate<_Predicate>(__pred); } 371 372 /// One of the @link negators negation functors@endlink. 373 template<typename _Predicate> 374 class binary_negate 375 : public binary_function<typename _Predicate::first_argument_type, 376 typename _Predicate::second_argument_type, bool> 377 { 378 protected: 379 _Predicate _M_pred; 380 381 public: 382 explicit 383 binary_negate(const _Predicate& __x) : _M_pred(__x) { } 384 385 bool 386 operator()(const typename _Predicate::first_argument_type& __x, 387 const typename _Predicate::second_argument_type& __y) const 388 { return !_M_pred(__x, __y); } 389 }; 390 391 /// One of the @link negators negation functors@endlink. 392 template<typename _Predicate> 393 inline binary_negate<_Predicate> 394 not2(const _Predicate& __pred) 395 { return binary_negate<_Predicate>(__pred); } 396 /** @} */ 397 398 // 20.3.7 adaptors pointers functions 399 /** @defgroup pointer_adaptors Adaptors for pointers to functions 400 * @ingroup functors 401 * 402 * The advantage of function objects over pointers to functions is that 403 * the objects in the standard library declare nested typedefs describing 404 * their argument and result types with uniform names (e.g., @c result_type 405 * from the base classes @c unary_function and @c binary_function). 406 * Sometimes those typedefs are required, not just optional. 407 * 408 * Adaptors are provided to turn pointers to unary (single-argument) and 409 * binary (double-argument) functions into function objects. The 410 * long-winded functor @c pointer_to_unary_function is constructed with a 411 * function pointer @c f, and its @c operator() called with argument @c x 412 * returns @c f(x). The functor @c pointer_to_binary_function does the same 413 * thing, but with a double-argument @c f and @c operator(). 414 * 415 * The function @c ptr_fun takes a pointer-to-function @c f and constructs 416 * an instance of the appropriate functor. 417 * 418 * @{ 419 */ 420 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 421 template<typename _Arg, typename _Result> 422 class pointer_to_unary_function : public unary_function<_Arg, _Result> 423 { 424 protected: 425 _Result (*_M_ptr)(_Arg); 426 427 public: 428 pointer_to_unary_function() { } 429 430 explicit 431 pointer_to_unary_function(_Result (*__x)(_Arg)) 432 : _M_ptr(__x) { } 433 434 _Result 435 operator()(_Arg __x) const 436 { return _M_ptr(__x); } 437 }; 438 439 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 440 template<typename _Arg, typename _Result> 441 inline pointer_to_unary_function<_Arg, _Result> 442 ptr_fun(_Result (*__x)(_Arg)) 443 { return pointer_to_unary_function<_Arg, _Result>(__x); } 444 445 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 446 template<typename _Arg1, typename _Arg2, typename _Result> 447 class pointer_to_binary_function 448 : public binary_function<_Arg1, _Arg2, _Result> 449 { 450 protected: 451 _Result (*_M_ptr)(_Arg1, _Arg2); 452 453 public: 454 pointer_to_binary_function() { } 455 456 explicit 457 pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2)) 458 : _M_ptr(__x) { } 459 460 _Result 461 operator()(_Arg1 __x, _Arg2 __y) const 462 { return _M_ptr(__x, __y); } 463 }; 464 465 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 466 template<typename _Arg1, typename _Arg2, typename _Result> 467 inline pointer_to_binary_function<_Arg1, _Arg2, _Result> 468 ptr_fun(_Result (*__x)(_Arg1, _Arg2)) 469 { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); } 470 /** @} */ 471 472 template<typename _Tp> 473 struct _Identity 474 : 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 487 : public unary_function<_Pair, 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 #if __cplusplus >= 201103L 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 512 : public unary_function<_Pair, 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 (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED 731 # include <backward/binders.h> 732 #endif 733 734 #endif /* _STL_FUNCTION_H */ 735