Home | History | Annotate | Download | only in bits
      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