LCOV - code coverage report
Current view: top level - usr/include/c++/4.8/bits - stl_function.h (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 9 9 100.0 %
Date: 2015-10-10 Functions: 17 17 100.0 %

          Line data    Source code
       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      184096 :     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     2438118 :     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       51840 :       { 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        4422 :       operator()(const _Tp& __x, const _Tp& __y) const
     235        6992 :       { 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        3963 :       operator()(const _Pair& __x) const
     495        4981 :       { return __x.first; }
     496             : 
     497             : #if __cplusplus >= 201103L
     498             :       template<typename _Pair2>
     499             :         typename _Pair2::first_type&
     500     1299562 :         operator()(_Pair2& __x) const
     501     1299562 :         { 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 */

Generated by: LCOV version 1.10