LCOV - code coverage report
Current view: top level - usr/include/c++/4.4/bits - stl_function.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 7 7 100.0 %
Date: 2015-06-10 18:10:59 Functions: 15 19 78.9 %

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

Generated by: LCOV version 1.11