100db7afdSDavid E. O'Brien // Functor implementations -*- C++ -*-
200db7afdSDavid E. O'Brien 
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
400db7afdSDavid E. O'Brien //
500db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
600db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
700db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
800db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
900db7afdSDavid E. O'Brien // any later version.
1000db7afdSDavid E. O'Brien 
1100db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1200db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1300db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1400db7afdSDavid E. O'Brien // GNU General Public License for more details.
1500db7afdSDavid E. O'Brien 
1600db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1700db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
18*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1900db7afdSDavid E. O'Brien // USA.
2000db7afdSDavid E. O'Brien 
2100db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2200db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2300db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2400db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2500db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2600db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2700db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2800db7afdSDavid E. O'Brien // the GNU General Public License.
2900db7afdSDavid E. O'Brien 
3000db7afdSDavid E. O'Brien /*
3100db7afdSDavid E. O'Brien  *
3200db7afdSDavid E. O'Brien  * Copyright (c) 1994
3300db7afdSDavid E. O'Brien  * Hewlett-Packard Company
3400db7afdSDavid E. O'Brien  *
3500db7afdSDavid E. O'Brien  * Permission to use, copy, modify, distribute and sell this software
3600db7afdSDavid E. O'Brien  * and its documentation for any purpose is hereby granted without fee,
3700db7afdSDavid E. O'Brien  * provided that the above copyright notice appear in all copies and
3800db7afdSDavid E. O'Brien  * that both that copyright notice and this permission notice appear
3900db7afdSDavid E. O'Brien  * in supporting documentation.  Hewlett-Packard Company makes no
4000db7afdSDavid E. O'Brien  * representations about the suitability of this software for any
4100db7afdSDavid E. O'Brien  * purpose.  It is provided "as is" without express or implied warranty.
4200db7afdSDavid E. O'Brien  *
4300db7afdSDavid E. O'Brien  *
4400db7afdSDavid E. O'Brien  * Copyright (c) 1996-1998
4500db7afdSDavid E. O'Brien  * Silicon Graphics Computer Systems, Inc.
4600db7afdSDavid E. O'Brien  *
4700db7afdSDavid E. O'Brien  * Permission to use, copy, modify, distribute and sell this software
4800db7afdSDavid E. O'Brien  * and its documentation for any purpose is hereby granted without fee,
4900db7afdSDavid E. O'Brien  * provided that the above copyright notice appear in all copies and
5000db7afdSDavid E. O'Brien  * that both that copyright notice and this permission notice appear
5100db7afdSDavid E. O'Brien  * in supporting documentation.  Silicon Graphics makes no
5200db7afdSDavid E. O'Brien  * representations about the suitability of this software for any
5300db7afdSDavid E. O'Brien  * purpose.  It is provided "as is" without express or implied warranty.
5400db7afdSDavid E. O'Brien  */
5500db7afdSDavid E. O'Brien 
5600db7afdSDavid E. O'Brien /** @file stl_function.h
5700db7afdSDavid E. O'Brien  *  This is an internal header file, included by other library headers.
5800db7afdSDavid E. O'Brien  *  You should not attempt to use it directly.
5900db7afdSDavid E. O'Brien  */
6000db7afdSDavid E. O'Brien 
61ffeaf689SAlexander Kabaev #ifndef _FUNCTION_H
62ffeaf689SAlexander Kabaev #define _FUNCTION_H 1
6300db7afdSDavid E. O'Brien 
64*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
65*f8a1b7d9SAlexander Kabaev 
6600db7afdSDavid E. O'Brien   // 20.3.1 base classes
6700db7afdSDavid E. O'Brien   /** @defgroup s20_3_1_base Functor Base Classes
6800db7afdSDavid E. O'Brien    *  Function objects, or @e functors, are objects with an @c operator()
6900db7afdSDavid E. O'Brien    *  defined and accessible.  They can be passed as arguments to algorithm
7000db7afdSDavid E. O'Brien    *  templates and used in place of a function pointer.  Not only is the
7100db7afdSDavid E. O'Brien    *  resulting expressiveness of the library increased, but the generated
7200db7afdSDavid E. O'Brien    *  code can be more efficient than what you might write by hand.  When we
7300db7afdSDavid E. O'Brien    *  refer to "functors," then, generally we include function pointers in
7400db7afdSDavid E. O'Brien    *  the description as well.
7500db7afdSDavid E. O'Brien    *
7600db7afdSDavid E. O'Brien    *  Often, functors are only created as temporaries passed to algorithm
7700db7afdSDavid E. O'Brien    *  calls, rather than being created as named variables.
7800db7afdSDavid E. O'Brien    *
7900db7afdSDavid E. O'Brien    *  Two examples taken from the standard itself follow.  To perform a
8000db7afdSDavid E. O'Brien    *  by-element addition of two vectors @c a and @c b containing @c double,
8100db7afdSDavid E. O'Brien    *  and put the result in @c a, use
8200db7afdSDavid E. O'Brien    *  \code
8300db7afdSDavid E. O'Brien    *  transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
8400db7afdSDavid E. O'Brien    *  \endcode
8500db7afdSDavid E. O'Brien    *  To negate every element in @c a, use
8600db7afdSDavid E. O'Brien    *  \code
8700db7afdSDavid E. O'Brien    *  transform(a.begin(), a.end(), a.begin(), negate<double>());
8800db7afdSDavid E. O'Brien    *  \endcode
8900db7afdSDavid E. O'Brien    *  The addition and negation functions will be inlined directly.
9000db7afdSDavid E. O'Brien    *
91*f8a1b7d9SAlexander Kabaev    *  The standard functors are derived from structs named @c unary_function
9200db7afdSDavid E. O'Brien    *  and @c binary_function.  These two classes contain nothing but typedefs,
9300db7afdSDavid E. O'Brien    *  to aid in generic (template) programming.  If you write your own
9400db7afdSDavid E. O'Brien    *  functors, you might consider doing the same.
9500db7afdSDavid E. O'Brien    *
9600db7afdSDavid E. O'Brien    *  @{
9700db7afdSDavid E. O'Brien    */
9800db7afdSDavid E. O'Brien   /**
9900db7afdSDavid E. O'Brien    *  This is one of the @link s20_3_1_base functor base classes@endlink.
10000db7afdSDavid E. O'Brien    */
10100db7afdSDavid E. O'Brien   template <class _Arg, class _Result>
102ffeaf689SAlexander Kabaev     struct unary_function
103ffeaf689SAlexander Kabaev     {
104ffeaf689SAlexander Kabaev       typedef _Arg argument_type;   ///< @c argument_type is the type of the
105ffeaf689SAlexander Kabaev                                     ///     argument (no surprises here)
106ffeaf689SAlexander Kabaev 
10700db7afdSDavid E. O'Brien       typedef _Result result_type;  ///< @c result_type is the return type
10800db7afdSDavid E. O'Brien     };
10900db7afdSDavid E. O'Brien 
11000db7afdSDavid E. O'Brien   /**
11100db7afdSDavid E. O'Brien    *  This is one of the @link s20_3_1_base functor base classes@endlink.
11200db7afdSDavid E. O'Brien    */
11300db7afdSDavid E. O'Brien   template <class _Arg1, class _Arg2, class _Result>
114ffeaf689SAlexander Kabaev     struct binary_function
115ffeaf689SAlexander Kabaev     {
116ffeaf689SAlexander Kabaev       typedef _Arg1 first_argument_type;   ///< the type of the first argument
117ffeaf689SAlexander Kabaev                                            ///  (no surprises here)
118ffeaf689SAlexander Kabaev 
11900db7afdSDavid E. O'Brien       typedef _Arg2 second_argument_type;  ///< the type of the second argument
12000db7afdSDavid E. O'Brien       typedef _Result result_type;         ///< type of the return type
12100db7afdSDavid E. O'Brien     };
12200db7afdSDavid E. O'Brien   /** @}  */
12300db7afdSDavid E. O'Brien 
12400db7afdSDavid E. O'Brien   // 20.3.2 arithmetic
12500db7afdSDavid E. O'Brien   /** @defgroup s20_3_2_arithmetic Arithmetic Classes
12600db7afdSDavid E. O'Brien    *  Because basic math often needs to be done during an algorithm, the library
12700db7afdSDavid E. O'Brien    *  provides functors for those operations.  See the documentation for
12800db7afdSDavid E. O'Brien    *  @link s20_3_1_base the base classes@endlink for examples of their use.
12900db7afdSDavid E. O'Brien    *
13000db7afdSDavid E. O'Brien    *  @{
13100db7afdSDavid E. O'Brien    */
13200db7afdSDavid E. O'Brien   /// One of the @link s20_3_2_arithmetic math functors@endlink.
13300db7afdSDavid E. O'Brien   template <class _Tp>
134ffeaf689SAlexander Kabaev     struct plus : public binary_function<_Tp, _Tp, _Tp>
135ffeaf689SAlexander Kabaev     {
136ffeaf689SAlexander Kabaev       _Tp
operatorplus137ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
138ffeaf689SAlexander Kabaev       { return __x + __y; }
13900db7afdSDavid E. O'Brien     };
14000db7afdSDavid E. O'Brien 
14100db7afdSDavid E. O'Brien   /// One of the @link s20_3_2_arithmetic math functors@endlink.
14200db7afdSDavid E. O'Brien   template <class _Tp>
143ffeaf689SAlexander Kabaev     struct minus : public binary_function<_Tp, _Tp, _Tp>
144ffeaf689SAlexander Kabaev     {
145ffeaf689SAlexander Kabaev       _Tp
operatorminus146ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
147ffeaf689SAlexander Kabaev       { return __x - __y; }
14800db7afdSDavid E. O'Brien     };
14900db7afdSDavid E. O'Brien 
15000db7afdSDavid E. O'Brien   /// One of the @link s20_3_2_arithmetic math functors@endlink.
15100db7afdSDavid E. O'Brien   template <class _Tp>
152ffeaf689SAlexander Kabaev     struct multiplies : public binary_function<_Tp, _Tp, _Tp>
153ffeaf689SAlexander Kabaev     {
154ffeaf689SAlexander Kabaev       _Tp
operatormultiplies155ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
156ffeaf689SAlexander Kabaev       { return __x * __y; }
15700db7afdSDavid E. O'Brien     };
15800db7afdSDavid E. O'Brien 
15900db7afdSDavid E. O'Brien   /// One of the @link s20_3_2_arithmetic math functors@endlink.
16000db7afdSDavid E. O'Brien   template <class _Tp>
161ffeaf689SAlexander Kabaev     struct divides : public binary_function<_Tp, _Tp, _Tp>
162ffeaf689SAlexander Kabaev     {
163ffeaf689SAlexander Kabaev       _Tp
operatordivides164ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
165ffeaf689SAlexander Kabaev       { return __x / __y; }
16600db7afdSDavid E. O'Brien     };
16700db7afdSDavid E. O'Brien 
16800db7afdSDavid E. O'Brien   /// One of the @link s20_3_2_arithmetic math functors@endlink.
16900db7afdSDavid E. O'Brien   template <class _Tp>
17000db7afdSDavid E. O'Brien     struct modulus : public binary_function<_Tp, _Tp, _Tp>
17100db7afdSDavid E. O'Brien     {
172ffeaf689SAlexander Kabaev       _Tp
operatormodulus173ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
174ffeaf689SAlexander Kabaev       { return __x % __y; }
17500db7afdSDavid E. O'Brien     };
17600db7afdSDavid E. O'Brien 
17700db7afdSDavid E. O'Brien   /// One of the @link s20_3_2_arithmetic math functors@endlink.
17800db7afdSDavid E. O'Brien   template <class _Tp>
17900db7afdSDavid E. O'Brien     struct negate : public unary_function<_Tp, _Tp>
18000db7afdSDavid E. O'Brien     {
181ffeaf689SAlexander Kabaev       _Tp
operatornegate182ffeaf689SAlexander Kabaev       operator()(const _Tp& __x) const
183ffeaf689SAlexander Kabaev       { return -__x; }
18400db7afdSDavid E. O'Brien     };
18500db7afdSDavid E. O'Brien   /** @}  */
18600db7afdSDavid E. O'Brien 
18700db7afdSDavid E. O'Brien   // 20.3.3 comparisons
18800db7afdSDavid E. O'Brien   /** @defgroup s20_3_3_comparisons Comparison Classes
18900db7afdSDavid E. O'Brien    *  The library provides six wrapper functors for all the basic comparisons
19000db7afdSDavid E. O'Brien    *  in C++, like @c <.
19100db7afdSDavid E. O'Brien    *
19200db7afdSDavid E. O'Brien    *  @{
19300db7afdSDavid E. O'Brien    */
19400db7afdSDavid E. O'Brien   /// One of the @link s20_3_3_comparisons comparison functors@endlink.
19500db7afdSDavid E. O'Brien   template <class _Tp>
19600db7afdSDavid E. O'Brien     struct equal_to : public binary_function<_Tp, _Tp, bool>
19700db7afdSDavid E. O'Brien     {
198ffeaf689SAlexander Kabaev       bool
operatorequal_to199ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
200ffeaf689SAlexander Kabaev       { return __x == __y; }
20100db7afdSDavid E. O'Brien     };
20200db7afdSDavid E. O'Brien 
20300db7afdSDavid E. O'Brien   /// One of the @link s20_3_3_comparisons comparison functors@endlink.
20400db7afdSDavid E. O'Brien   template <class _Tp>
20500db7afdSDavid E. O'Brien     struct not_equal_to : public binary_function<_Tp, _Tp, bool>
20600db7afdSDavid E. O'Brien     {
207ffeaf689SAlexander Kabaev       bool
operatornot_equal_to208ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
209ffeaf689SAlexander Kabaev       { return __x != __y; }
21000db7afdSDavid E. O'Brien     };
21100db7afdSDavid E. O'Brien 
21200db7afdSDavid E. O'Brien   /// One of the @link s20_3_3_comparisons comparison functors@endlink.
21300db7afdSDavid E. O'Brien   template <class _Tp>
21400db7afdSDavid E. O'Brien     struct greater : public binary_function<_Tp, _Tp, bool>
21500db7afdSDavid E. O'Brien     {
216ffeaf689SAlexander Kabaev       bool
operatorgreater217ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
218ffeaf689SAlexander Kabaev       { return __x > __y; }
21900db7afdSDavid E. O'Brien     };
22000db7afdSDavid E. O'Brien 
22100db7afdSDavid E. O'Brien   /// One of the @link s20_3_3_comparisons comparison functors@endlink.
22200db7afdSDavid E. O'Brien   template <class _Tp>
22300db7afdSDavid E. O'Brien     struct less : public binary_function<_Tp, _Tp, bool>
22400db7afdSDavid E. O'Brien     {
225ffeaf689SAlexander Kabaev       bool
operatorless226ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
227ffeaf689SAlexander Kabaev       { return __x < __y; }
22800db7afdSDavid E. O'Brien     };
22900db7afdSDavid E. O'Brien 
23000db7afdSDavid E. O'Brien   /// One of the @link s20_3_3_comparisons comparison functors@endlink.
23100db7afdSDavid E. O'Brien   template <class _Tp>
23200db7afdSDavid E. O'Brien     struct greater_equal : public binary_function<_Tp, _Tp, bool>
23300db7afdSDavid E. O'Brien     {
234ffeaf689SAlexander Kabaev       bool
operatorgreater_equal235ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
236ffeaf689SAlexander Kabaev       { return __x >= __y; }
23700db7afdSDavid E. O'Brien     };
23800db7afdSDavid E. O'Brien 
23900db7afdSDavid E. O'Brien   /// One of the @link s20_3_3_comparisons comparison functors@endlink.
24000db7afdSDavid E. O'Brien   template <class _Tp>
24100db7afdSDavid E. O'Brien     struct less_equal : public binary_function<_Tp, _Tp, bool>
24200db7afdSDavid E. O'Brien     {
243ffeaf689SAlexander Kabaev       bool
operatorless_equal244ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
245ffeaf689SAlexander Kabaev       { return __x <= __y; }
24600db7afdSDavid E. O'Brien     };
24700db7afdSDavid E. O'Brien   /** @}  */
24800db7afdSDavid E. O'Brien 
24900db7afdSDavid E. O'Brien   // 20.3.4 logical operations
25000db7afdSDavid E. O'Brien   /** @defgroup s20_3_4_logical Boolean Operations Classes
25100db7afdSDavid E. O'Brien    *  Here are wrapper functors for Boolean operations:  @c &&, @c ||, and @c !.
25200db7afdSDavid E. O'Brien    *
25300db7afdSDavid E. O'Brien    *  @{
25400db7afdSDavid E. O'Brien    */
25500db7afdSDavid E. O'Brien   /// One of the @link s20_3_4_logical Boolean operations functors@endlink.
25600db7afdSDavid E. O'Brien   template <class _Tp>
25700db7afdSDavid E. O'Brien     struct logical_and : public binary_function<_Tp, _Tp, bool>
25800db7afdSDavid E. O'Brien     {
259ffeaf689SAlexander Kabaev       bool
operatorlogical_and260ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
261ffeaf689SAlexander Kabaev       { return __x && __y; }
26200db7afdSDavid E. O'Brien     };
26300db7afdSDavid E. O'Brien 
26400db7afdSDavid E. O'Brien   /// One of the @link s20_3_4_logical Boolean operations functors@endlink.
26500db7afdSDavid E. O'Brien   template <class _Tp>
26600db7afdSDavid E. O'Brien     struct logical_or : public binary_function<_Tp, _Tp, bool>
26700db7afdSDavid E. O'Brien     {
268ffeaf689SAlexander Kabaev       bool
operatorlogical_or269ffeaf689SAlexander Kabaev       operator()(const _Tp& __x, const _Tp& __y) const
270ffeaf689SAlexander Kabaev       { return __x || __y; }
27100db7afdSDavid E. O'Brien     };
27200db7afdSDavid E. O'Brien 
27300db7afdSDavid E. O'Brien   /// One of the @link s20_3_4_logical Boolean operations functors@endlink.
27400db7afdSDavid E. O'Brien   template <class _Tp>
27500db7afdSDavid E. O'Brien     struct logical_not : public unary_function<_Tp, bool>
27600db7afdSDavid E. O'Brien     {
277ffeaf689SAlexander Kabaev       bool
operatorlogical_not278ffeaf689SAlexander Kabaev       operator()(const _Tp& __x) const
279ffeaf689SAlexander Kabaev       { return !__x; }
28000db7afdSDavid E. O'Brien     };
28100db7afdSDavid E. O'Brien   /** @}  */
28200db7afdSDavid E. O'Brien 
28300db7afdSDavid E. O'Brien   // 20.3.5 negators
28400db7afdSDavid E. O'Brien   /** @defgroup s20_3_5_negators Negators
28500db7afdSDavid E. O'Brien    *  The functions @c not1 and @c not2 each take a predicate functor
28600db7afdSDavid E. O'Brien    *  and return an instance of @c unary_negate or
28700db7afdSDavid E. O'Brien    *  @c binary_negate, respectively.  These classes are functors whose
28800db7afdSDavid E. O'Brien    *  @c operator() performs the stored predicate function and then returns
28900db7afdSDavid E. O'Brien    *  the negation of the result.
29000db7afdSDavid E. O'Brien    *
29100db7afdSDavid E. O'Brien    *  For example, given a vector of integers and a trivial predicate,
29200db7afdSDavid E. O'Brien    *  \code
29300db7afdSDavid E. O'Brien    *  struct IntGreaterThanThree
29400db7afdSDavid E. O'Brien    *    : public std::unary_function<int, bool>
29500db7afdSDavid E. O'Brien    *  {
29600db7afdSDavid E. O'Brien    *      bool operator() (int x) { return x > 3; }
29700db7afdSDavid E. O'Brien    *  };
29800db7afdSDavid E. O'Brien    *
29900db7afdSDavid E. O'Brien    *  std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree()));
30000db7afdSDavid E. O'Brien    *  \endcode
30100db7afdSDavid E. O'Brien    *  The call to @c find_if will locate the first index (i) of @c v for which
30200db7afdSDavid E. O'Brien    *  "!(v[i] > 3)" is true.
30300db7afdSDavid E. O'Brien    *
30400db7afdSDavid E. O'Brien    *  The not1/unary_negate combination works on predicates taking a single
30500db7afdSDavid E. O'Brien    *  argument.  The not2/binary_negate combination works on predicates which
30600db7afdSDavid E. O'Brien    *  take two arguments.
30700db7afdSDavid E. O'Brien    *
30800db7afdSDavid E. O'Brien    *  @{
30900db7afdSDavid E. O'Brien    */
31000db7afdSDavid E. O'Brien   /// One of the @link s20_3_5_negators negation functors@endlink.
31100db7afdSDavid E. O'Brien   template <class _Predicate>
31200db7afdSDavid E. O'Brien     class unary_negate
313ffeaf689SAlexander Kabaev     : public unary_function<typename _Predicate::argument_type, bool>
314ffeaf689SAlexander Kabaev     {
31500db7afdSDavid E. O'Brien     protected:
31600db7afdSDavid E. O'Brien       _Predicate _M_pred;
31700db7afdSDavid E. O'Brien     public:
318ffeaf689SAlexander Kabaev       explicit
unary_negate(const _Predicate & __x)319ffeaf689SAlexander Kabaev       unary_negate(const _Predicate& __x) : _M_pred(__x) {}
320ffeaf689SAlexander Kabaev 
321ffeaf689SAlexander Kabaev       bool
operator()322ffeaf689SAlexander Kabaev       operator()(const typename _Predicate::argument_type& __x) const
323ffeaf689SAlexander Kabaev       { return !_M_pred(__x); }
32400db7afdSDavid E. O'Brien     };
32500db7afdSDavid E. O'Brien 
32600db7afdSDavid E. O'Brien   /// One of the @link s20_3_5_negators negation functors@endlink.
32700db7afdSDavid E. O'Brien   template <class _Predicate>
32800db7afdSDavid E. O'Brien     inline unary_negate<_Predicate>
not1(const _Predicate & __pred)32900db7afdSDavid E. O'Brien     not1(const _Predicate& __pred)
330ffeaf689SAlexander Kabaev     { return unary_negate<_Predicate>(__pred); }
33100db7afdSDavid E. O'Brien 
33200db7afdSDavid E. O'Brien   /// One of the @link s20_3_5_negators negation functors@endlink.
33300db7afdSDavid E. O'Brien   template <class _Predicate>
33400db7afdSDavid E. O'Brien     class binary_negate
33500db7afdSDavid E. O'Brien     : public binary_function<typename _Predicate::first_argument_type,
33600db7afdSDavid E. O'Brien 			     typename _Predicate::second_argument_type,
337ffeaf689SAlexander Kabaev 			     bool>
338ffeaf689SAlexander Kabaev     {
33900db7afdSDavid E. O'Brien     protected:
34000db7afdSDavid E. O'Brien       _Predicate _M_pred;
34100db7afdSDavid E. O'Brien     public:
342ffeaf689SAlexander Kabaev       explicit
binary_negate(const _Predicate & __x)343ffeaf689SAlexander Kabaev       binary_negate(const _Predicate& __x)
344ffeaf689SAlexander Kabaev       : _M_pred(__x) { }
345ffeaf689SAlexander Kabaev 
346ffeaf689SAlexander Kabaev       bool
operator()347ffeaf689SAlexander Kabaev       operator()(const typename _Predicate::first_argument_type& __x,
34800db7afdSDavid E. O'Brien 		 const typename _Predicate::second_argument_type& __y) const
349ffeaf689SAlexander Kabaev       { return !_M_pred(__x, __y); }
35000db7afdSDavid E. O'Brien     };
35100db7afdSDavid E. O'Brien 
35200db7afdSDavid E. O'Brien   /// One of the @link s20_3_5_negators negation functors@endlink.
35300db7afdSDavid E. O'Brien   template <class _Predicate>
35400db7afdSDavid E. O'Brien     inline binary_negate<_Predicate>
not2(const _Predicate & __pred)35500db7afdSDavid E. O'Brien     not2(const _Predicate& __pred)
356ffeaf689SAlexander Kabaev     { return binary_negate<_Predicate>(__pred); }
35700db7afdSDavid E. O'Brien   /** @}  */
35800db7afdSDavid E. O'Brien 
35900db7afdSDavid E. O'Brien   // 20.3.6 binders
36000db7afdSDavid E. O'Brien   /** @defgroup s20_3_6_binder Binder Classes
36100db7afdSDavid E. O'Brien    *  Binders turn functions/functors with two arguments into functors with
36200db7afdSDavid E. O'Brien    *  a single argument, storing an argument to be applied later.  For
363*f8a1b7d9SAlexander Kabaev    *  example, a variable @c B of type @c binder1st is constructed from a
364ffeaf689SAlexander Kabaev    *  functor @c f and an argument @c x.  Later, B's @c operator() is called
365ffeaf689SAlexander Kabaev    *  with a single argument @c y.  The return value is the value of @c f(x,y).
36600db7afdSDavid E. O'Brien    *  @c B can be "called" with various arguments (y1, y2, ...) and will in
36700db7afdSDavid E. O'Brien    *  turn call @c f(x,y1), @c f(x,y2), ...
36800db7afdSDavid E. O'Brien    *
36900db7afdSDavid E. O'Brien    *  The function @c bind1st is provided to save some typing.  It takes the
37000db7afdSDavid E. O'Brien    *  function and an argument as parameters, and returns an instance of
37100db7afdSDavid E. O'Brien    *  @c binder1st.
37200db7afdSDavid E. O'Brien    *
37300db7afdSDavid E. O'Brien    *  The type @c binder2nd and its creator function @c bind2nd do the same
37400db7afdSDavid E. O'Brien    *  thing, but the stored argument is passed as the second parameter instead
37500db7afdSDavid E. O'Brien    *  of the first, e.g., @c bind2nd(std::minus<float>,1.3) will create a
37600db7afdSDavid E. O'Brien    *  functor whose @c operator() accepts a floating-point number, subtracts
37700db7afdSDavid E. O'Brien    *  1.3 from it, and returns the result.  (If @c bind1st had been used,
37800db7afdSDavid E. O'Brien    *  the functor would perform "1.3 - x" instead.
37900db7afdSDavid E. O'Brien    *
38000db7afdSDavid E. O'Brien    *  Creator-wrapper functions like @c bind1st are intended to be used in
38100db7afdSDavid E. O'Brien    *  calling algorithms.  Their return values will be temporary objects.
38200db7afdSDavid E. O'Brien    *  (The goal is to not require you to type names like
38300db7afdSDavid E. O'Brien    *  @c std::binder1st<std::plus<int>> for declaring a variable to hold the
38400db7afdSDavid E. O'Brien    *  return value from @c bind1st(std::plus<int>,5).
38500db7afdSDavid E. O'Brien    *
38600db7afdSDavid E. O'Brien    *  These become more useful when combined with the composition functions.
38700db7afdSDavid E. O'Brien    *
38800db7afdSDavid E. O'Brien    *  @{
38900db7afdSDavid E. O'Brien    */
39000db7afdSDavid E. O'Brien   /// One of the @link s20_3_6_binder binder functors@endlink.
39100db7afdSDavid E. O'Brien   template <class _Operation>
39200db7afdSDavid E. O'Brien     class binder1st
39300db7afdSDavid E. O'Brien     : public unary_function<typename _Operation::second_argument_type,
394ffeaf689SAlexander Kabaev 			    typename _Operation::result_type>
395ffeaf689SAlexander Kabaev     {
39600db7afdSDavid E. O'Brien     protected:
39700db7afdSDavid E. O'Brien       _Operation op;
39800db7afdSDavid E. O'Brien       typename _Operation::first_argument_type value;
39900db7afdSDavid E. O'Brien     public:
binder1st(const _Operation & __x,const typename _Operation::first_argument_type & __y)40000db7afdSDavid E. O'Brien       binder1st(const _Operation& __x,
40100db7afdSDavid E. O'Brien 		const typename _Operation::first_argument_type& __y)
40200db7afdSDavid E. O'Brien       : op(__x), value(__y) {}
403ffeaf689SAlexander Kabaev 
40400db7afdSDavid E. O'Brien       typename _Operation::result_type
operator()405ffeaf689SAlexander Kabaev       operator()(const typename _Operation::second_argument_type& __x) const
406ffeaf689SAlexander Kabaev       { return op(value, __x); }
407ffeaf689SAlexander Kabaev 
408ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
40900db7afdSDavid E. O'Brien       // 109.  Missing binders for non-const sequence elements
41000db7afdSDavid E. O'Brien       typename _Operation::result_type
operator()411ffeaf689SAlexander Kabaev       operator()(typename _Operation::second_argument_type& __x) const
412ffeaf689SAlexander Kabaev       { return op(value, __x); }
41300db7afdSDavid E. O'Brien     };
41400db7afdSDavid E. O'Brien 
41500db7afdSDavid E. O'Brien   /// One of the @link s20_3_6_binder binder functors@endlink.
41600db7afdSDavid E. O'Brien   template <class _Operation, class _Tp>
41700db7afdSDavid E. O'Brien     inline binder1st<_Operation>
bind1st(const _Operation & __fn,const _Tp & __x)41800db7afdSDavid E. O'Brien     bind1st(const _Operation& __fn, const _Tp& __x)
41900db7afdSDavid E. O'Brien     {
42000db7afdSDavid E. O'Brien       typedef typename _Operation::first_argument_type _Arg1_type;
42100db7afdSDavid E. O'Brien       return binder1st<_Operation>(__fn, _Arg1_type(__x));
42200db7afdSDavid E. O'Brien     }
42300db7afdSDavid E. O'Brien 
42400db7afdSDavid E. O'Brien   /// One of the @link s20_3_6_binder binder functors@endlink.
42500db7afdSDavid E. O'Brien   template <class _Operation>
42600db7afdSDavid E. O'Brien     class binder2nd
42700db7afdSDavid E. O'Brien     : public unary_function<typename _Operation::first_argument_type,
428ffeaf689SAlexander Kabaev 			    typename _Operation::result_type>
429ffeaf689SAlexander Kabaev     {
43000db7afdSDavid E. O'Brien     protected:
43100db7afdSDavid E. O'Brien       _Operation op;
43200db7afdSDavid E. O'Brien       typename _Operation::second_argument_type value;
43300db7afdSDavid E. O'Brien     public:
binder2nd(const _Operation & __x,const typename _Operation::second_argument_type & __y)43400db7afdSDavid E. O'Brien       binder2nd(const _Operation& __x,
43500db7afdSDavid E. O'Brien 		const typename _Operation::second_argument_type& __y)
43600db7afdSDavid E. O'Brien       : op(__x), value(__y) {}
437ffeaf689SAlexander Kabaev 
43800db7afdSDavid E. O'Brien       typename _Operation::result_type
operator()439ffeaf689SAlexander Kabaev       operator()(const typename _Operation::first_argument_type& __x) const
440ffeaf689SAlexander Kabaev       { return op(__x, value); }
441ffeaf689SAlexander Kabaev 
442ffeaf689SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
44300db7afdSDavid E. O'Brien       // 109.  Missing binders for non-const sequence elements
44400db7afdSDavid E. O'Brien       typename _Operation::result_type
operator()445ffeaf689SAlexander Kabaev       operator()(typename _Operation::first_argument_type& __x) const
446ffeaf689SAlexander Kabaev       { return op(__x, value); }
44700db7afdSDavid E. O'Brien     };
44800db7afdSDavid E. O'Brien 
44900db7afdSDavid E. O'Brien   /// One of the @link s20_3_6_binder binder functors@endlink.
45000db7afdSDavid E. O'Brien   template <class _Operation, class _Tp>
45100db7afdSDavid E. O'Brien     inline binder2nd<_Operation>
bind2nd(const _Operation & __fn,const _Tp & __x)45200db7afdSDavid E. O'Brien     bind2nd(const _Operation& __fn, const _Tp& __x)
45300db7afdSDavid E. O'Brien     {
45400db7afdSDavid E. O'Brien       typedef typename _Operation::second_argument_type _Arg2_type;
45500db7afdSDavid E. O'Brien       return binder2nd<_Operation>(__fn, _Arg2_type(__x));
45600db7afdSDavid E. O'Brien     }
45700db7afdSDavid E. O'Brien   /** @}  */
45800db7afdSDavid E. O'Brien 
45900db7afdSDavid E. O'Brien   // 20.3.7 adaptors pointers functions
46000db7afdSDavid E. O'Brien   /** @defgroup s20_3_7_adaptors Adaptors for pointers to functions
46100db7afdSDavid E. O'Brien    *  The advantage of function objects over pointers to functions is that
46200db7afdSDavid E. O'Brien    *  the objects in the standard library declare nested typedefs describing
46300db7afdSDavid E. O'Brien    *  their argument and result types with uniform names (e.g., @c result_type
46400db7afdSDavid E. O'Brien    *  from the base classes @c unary_function and @c binary_function).
46500db7afdSDavid E. O'Brien    *  Sometimes those typedefs are required, not just optional.
46600db7afdSDavid E. O'Brien    *
46700db7afdSDavid E. O'Brien    *  Adaptors are provided to turn pointers to unary (single-argument) and
468ffeaf689SAlexander Kabaev    *  binary (double-argument) functions into function objects.  The
469ffeaf689SAlexander Kabaev    *  long-winded functor @c pointer_to_unary_function is constructed with a
470ffeaf689SAlexander Kabaev    *  function pointer @c f, and its @c operator() called with argument @c x
471ffeaf689SAlexander Kabaev    *  returns @c f(x).  The functor @c pointer_to_binary_function does the same
472ffeaf689SAlexander Kabaev    *  thing, but with a double-argument @c f and @c operator().
47300db7afdSDavid E. O'Brien    *
47400db7afdSDavid E. O'Brien    *  The function @c ptr_fun takes a pointer-to-function @c f and constructs
47500db7afdSDavid E. O'Brien    *  an instance of the appropriate functor.
47600db7afdSDavid E. O'Brien    *
47700db7afdSDavid E. O'Brien    *  @{
47800db7afdSDavid E. O'Brien    */
47900db7afdSDavid E. O'Brien   /// One of the @link s20_3_7_adaptors adaptors for function pointers@endlink.
48000db7afdSDavid E. O'Brien   template <class _Arg, class _Result>
481ffeaf689SAlexander Kabaev     class pointer_to_unary_function : public unary_function<_Arg, _Result>
482ffeaf689SAlexander Kabaev     {
48300db7afdSDavid E. O'Brien     protected:
48400db7afdSDavid E. O'Brien       _Result (*_M_ptr)(_Arg);
48500db7afdSDavid E. O'Brien     public:
pointer_to_unary_function()48600db7afdSDavid E. O'Brien       pointer_to_unary_function() {}
487ffeaf689SAlexander Kabaev 
488ffeaf689SAlexander Kabaev       explicit
pointer_to_unary_function(_Result (* __x)(_Arg))489ffeaf689SAlexander Kabaev       pointer_to_unary_function(_Result (*__x)(_Arg))
490ffeaf689SAlexander Kabaev       : _M_ptr(__x) {}
491ffeaf689SAlexander Kabaev 
492ffeaf689SAlexander Kabaev       _Result
operator()493ffeaf689SAlexander Kabaev       operator()(_Arg __x) const
494ffeaf689SAlexander Kabaev       { return _M_ptr(__x); }
49500db7afdSDavid E. O'Brien     };
49600db7afdSDavid E. O'Brien 
49700db7afdSDavid E. O'Brien   /// One of the @link s20_3_7_adaptors adaptors for function pointers@endlink.
49800db7afdSDavid E. O'Brien   template <class _Arg, class _Result>
499ffeaf689SAlexander Kabaev     inline pointer_to_unary_function<_Arg, _Result>
ptr_fun(_Result (* __x)(_Arg))500ffeaf689SAlexander Kabaev     ptr_fun(_Result (*__x)(_Arg))
501ffeaf689SAlexander Kabaev     { return pointer_to_unary_function<_Arg, _Result>(__x); }
50200db7afdSDavid E. O'Brien 
50300db7afdSDavid E. O'Brien   /// One of the @link s20_3_7_adaptors adaptors for function pointers@endlink.
50400db7afdSDavid E. O'Brien   template <class _Arg1, class _Arg2, class _Result>
505ffeaf689SAlexander Kabaev     class pointer_to_binary_function
506ffeaf689SAlexander Kabaev     : public binary_function<_Arg1, _Arg2, _Result>
507ffeaf689SAlexander Kabaev     {
50800db7afdSDavid E. O'Brien     protected:
50900db7afdSDavid E. O'Brien       _Result (*_M_ptr)(_Arg1, _Arg2);
51000db7afdSDavid E. O'Brien     public:
pointer_to_binary_function()51100db7afdSDavid E. O'Brien       pointer_to_binary_function() {}
512ffeaf689SAlexander Kabaev 
513ffeaf689SAlexander Kabaev       explicit
pointer_to_binary_function(_Result (* __x)(_Arg1,_Arg2))514ffeaf689SAlexander Kabaev       pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
51500db7afdSDavid E. O'Brien       : _M_ptr(__x) {}
516ffeaf689SAlexander Kabaev 
517ffeaf689SAlexander Kabaev       _Result
operator()518ffeaf689SAlexander Kabaev       operator()(_Arg1 __x, _Arg2 __y) const
519ffeaf689SAlexander Kabaev       { return _M_ptr(__x, __y); }
52000db7afdSDavid E. O'Brien     };
52100db7afdSDavid E. O'Brien 
52200db7afdSDavid E. O'Brien   /// One of the @link s20_3_7_adaptors adaptors for function pointers@endlink.
52300db7afdSDavid E. O'Brien   template <class _Arg1, class _Arg2, class _Result>
52400db7afdSDavid E. O'Brien     inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
ptr_fun(_Result (* __x)(_Arg1,_Arg2))525ffeaf689SAlexander Kabaev     ptr_fun(_Result (*__x)(_Arg1, _Arg2))
526ffeaf689SAlexander Kabaev     { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
52700db7afdSDavid E. O'Brien   /** @}  */
52800db7afdSDavid E. O'Brien 
52900db7afdSDavid E. O'Brien   template <class _Tp>
530ffeaf689SAlexander Kabaev     struct _Identity : public unary_function<_Tp,_Tp>
53100db7afdSDavid E. O'Brien     {
532ffeaf689SAlexander Kabaev       _Tp&
operator_Identity533ffeaf689SAlexander Kabaev       operator()(_Tp& __x) const
534ffeaf689SAlexander Kabaev       { return __x; }
535ffeaf689SAlexander Kabaev 
536ffeaf689SAlexander Kabaev       const _Tp&
operator_Identity537ffeaf689SAlexander Kabaev       operator()(const _Tp& __x) const
538ffeaf689SAlexander Kabaev       { return __x; }
539ffeaf689SAlexander Kabaev     };
540ffeaf689SAlexander Kabaev 
541ffeaf689SAlexander Kabaev   template <class _Pair>
542ffeaf689SAlexander Kabaev     struct _Select1st : public unary_function<_Pair,
543ffeaf689SAlexander Kabaev 					      typename _Pair::first_type>
544ffeaf689SAlexander Kabaev     {
545ffeaf689SAlexander Kabaev       typename _Pair::first_type&
operator_Select1st546ffeaf689SAlexander Kabaev       operator()(_Pair& __x) const
547ffeaf689SAlexander Kabaev       { return __x.first; }
548ffeaf689SAlexander Kabaev 
549ffeaf689SAlexander Kabaev       const typename _Pair::first_type&
operator_Select1st550ffeaf689SAlexander Kabaev       operator()(const _Pair& __x) const
551ffeaf689SAlexander Kabaev       { return __x.first; }
552ffeaf689SAlexander Kabaev     };
553ffeaf689SAlexander Kabaev 
554ffeaf689SAlexander Kabaev   template <class _Pair>
555ffeaf689SAlexander Kabaev     struct _Select2nd : public unary_function<_Pair,
556ffeaf689SAlexander Kabaev 					      typename _Pair::second_type>
557ffeaf689SAlexander Kabaev     {
558ffeaf689SAlexander Kabaev       typename _Pair::second_type&
operator_Select2nd559ffeaf689SAlexander Kabaev       operator()(_Pair& __x) const
560ffeaf689SAlexander Kabaev       { return __x.second; }
561ffeaf689SAlexander Kabaev 
562ffeaf689SAlexander Kabaev       const typename _Pair::second_type&
operator_Select2nd563ffeaf689SAlexander Kabaev       operator()(const _Pair& __x) const
564ffeaf689SAlexander Kabaev       { return __x.second; }
56500db7afdSDavid E. O'Brien     };
56600db7afdSDavid E. O'Brien 
56700db7afdSDavid E. O'Brien   // 20.3.8 adaptors pointers members
56800db7afdSDavid E. O'Brien   /** @defgroup s20_3_8_memadaptors Adaptors for pointers to members
569*f8a1b7d9SAlexander Kabaev    *  There are a total of 8 = 2^3 function objects in this family.
57000db7afdSDavid E. O'Brien    *   (1) Member functions taking no arguments vs member functions taking
57100db7afdSDavid E. O'Brien    *        one argument.
57200db7afdSDavid E. O'Brien    *   (2) Call through pointer vs call through reference.
573*f8a1b7d9SAlexander Kabaev    *   (3) Const vs non-const member function.
57400db7afdSDavid E. O'Brien    *
57500db7afdSDavid E. O'Brien    *  All of this complexity is in the function objects themselves.  You can
57600db7afdSDavid E. O'Brien    *   ignore it by using the helper function mem_fun and mem_fun_ref,
57700db7afdSDavid E. O'Brien    *   which create whichever type of adaptor is appropriate.
57800db7afdSDavid E. O'Brien    *
57900db7afdSDavid E. O'Brien    *  @{
58000db7afdSDavid E. O'Brien    */
58100db7afdSDavid E. O'Brien   /// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
58200db7afdSDavid E. O'Brien   template <class _Ret, class _Tp>
583ffeaf689SAlexander Kabaev     class mem_fun_t : public unary_function<_Tp*, _Ret>
584ffeaf689SAlexander Kabaev     {
58500db7afdSDavid E. O'Brien     public:
586ffeaf689SAlexander Kabaev       explicit
mem_fun_t(_Ret (_Tp::* __pf)())587ffeaf689SAlexander Kabaev       mem_fun_t(_Ret (_Tp::*__pf)())
588ffeaf689SAlexander Kabaev       : _M_f(__pf) {}
589ffeaf689SAlexander Kabaev 
590ffeaf689SAlexander Kabaev       _Ret
operator()591ffeaf689SAlexander Kabaev       operator()(_Tp* __p) const
592ffeaf689SAlexander Kabaev       { return (__p->*_M_f)(); }
59300db7afdSDavid E. O'Brien     private:
59400db7afdSDavid E. O'Brien       _Ret (_Tp::*_M_f)();
59500db7afdSDavid E. O'Brien     };
59600db7afdSDavid E. O'Brien 
59700db7afdSDavid E. O'Brien   /// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
59800db7afdSDavid E. O'Brien   template <class _Ret, class _Tp>
599ffeaf689SAlexander Kabaev     class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
600ffeaf689SAlexander Kabaev     {
60100db7afdSDavid E. O'Brien     public:
602ffeaf689SAlexander Kabaev       explicit
const_mem_fun_t(_Ret (_Tp::* __pf)()const)603ffeaf689SAlexander Kabaev       const_mem_fun_t(_Ret (_Tp::*__pf)() const)
604ffeaf689SAlexander Kabaev       : _M_f(__pf) {}
605ffeaf689SAlexander Kabaev 
606ffeaf689SAlexander Kabaev       _Ret
operator()607ffeaf689SAlexander Kabaev       operator()(const _Tp* __p) const
608ffeaf689SAlexander Kabaev       { return (__p->*_M_f)(); }
60900db7afdSDavid E. O'Brien     private:
61000db7afdSDavid E. O'Brien       _Ret (_Tp::*_M_f)() const;
61100db7afdSDavid E. O'Brien     };
61200db7afdSDavid E. O'Brien 
61300db7afdSDavid E. O'Brien   /// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
61400db7afdSDavid E. O'Brien   template <class _Ret, class _Tp>
615ffeaf689SAlexander Kabaev     class mem_fun_ref_t : public unary_function<_Tp, _Ret>
616ffeaf689SAlexander Kabaev     {
61700db7afdSDavid E. O'Brien     public:
618ffeaf689SAlexander Kabaev       explicit
mem_fun_ref_t(_Ret (_Tp::* __pf)())619ffeaf689SAlexander Kabaev       mem_fun_ref_t(_Ret (_Tp::*__pf)())
620ffeaf689SAlexander Kabaev       : _M_f(__pf) {}
621ffeaf689SAlexander Kabaev 
622ffeaf689SAlexander Kabaev       _Ret
operator()623ffeaf689SAlexander Kabaev       operator()(_Tp& __r) const
624ffeaf689SAlexander Kabaev       { return (__r.*_M_f)(); }
62500db7afdSDavid E. O'Brien     private:
62600db7afdSDavid E. O'Brien       _Ret (_Tp::*_M_f)();
62700db7afdSDavid E. O'Brien   };
62800db7afdSDavid E. O'Brien 
62900db7afdSDavid E. O'Brien   /// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
63000db7afdSDavid E. O'Brien   template <class _Ret, class _Tp>
631ffeaf689SAlexander Kabaev     class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
632ffeaf689SAlexander Kabaev     {
63300db7afdSDavid E. O'Brien     public:
634ffeaf689SAlexander Kabaev       explicit
const_mem_fun_ref_t(_Ret (_Tp::* __pf)()const)635ffeaf689SAlexander Kabaev       const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
636ffeaf689SAlexander Kabaev       : _M_f(__pf) {}
637ffeaf689SAlexander Kabaev 
638ffeaf689SAlexander Kabaev       _Ret
operator()639ffeaf689SAlexander Kabaev       operator()(const _Tp& __r) const
640ffeaf689SAlexander Kabaev       { return (__r.*_M_f)(); }
64100db7afdSDavid E. O'Brien     private:
64200db7afdSDavid E. O'Brien       _Ret (_Tp::*_M_f)() const;
64300db7afdSDavid E. O'Brien     };
64400db7afdSDavid E. O'Brien 
64500db7afdSDavid E. O'Brien   /// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
64600db7afdSDavid E. O'Brien   template <class _Ret, class _Tp, class _Arg>
647ffeaf689SAlexander Kabaev     class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
648ffeaf689SAlexander Kabaev     {
64900db7afdSDavid E. O'Brien     public:
650ffeaf689SAlexander Kabaev       explicit
mem_fun1_t(_Ret (_Tp::* __pf)(_Arg))651ffeaf689SAlexander Kabaev       mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
652ffeaf689SAlexander Kabaev       : _M_f(__pf) {}
653ffeaf689SAlexander Kabaev 
654ffeaf689SAlexander Kabaev       _Ret
operator()655ffeaf689SAlexander Kabaev       operator()(_Tp* __p, _Arg __x) const
656ffeaf689SAlexander Kabaev       { return (__p->*_M_f)(__x); }
65700db7afdSDavid E. O'Brien     private:
65800db7afdSDavid E. O'Brien       _Ret (_Tp::*_M_f)(_Arg);
65900db7afdSDavid E. O'Brien     };
66000db7afdSDavid E. O'Brien 
66100db7afdSDavid E. O'Brien   /// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
66200db7afdSDavid E. O'Brien   template <class _Ret, class _Tp, class _Arg>
663ffeaf689SAlexander Kabaev     class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
664ffeaf689SAlexander Kabaev     {
66500db7afdSDavid E. O'Brien     public:
666ffeaf689SAlexander Kabaev       explicit
const_mem_fun1_t(_Ret (_Tp::* __pf)(_Arg)const)667ffeaf689SAlexander Kabaev       const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
668ffeaf689SAlexander Kabaev       : _M_f(__pf) {}
669ffeaf689SAlexander Kabaev 
670ffeaf689SAlexander Kabaev       _Ret
operator()671ffeaf689SAlexander Kabaev       operator()(const _Tp* __p, _Arg __x) const
67200db7afdSDavid E. O'Brien       { return (__p->*_M_f)(__x); }
67300db7afdSDavid E. O'Brien     private:
67400db7afdSDavid E. O'Brien       _Ret (_Tp::*_M_f)(_Arg) const;
67500db7afdSDavid E. O'Brien     };
67600db7afdSDavid E. O'Brien 
67700db7afdSDavid E. O'Brien   /// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
67800db7afdSDavid E. O'Brien   template <class _Ret, class _Tp, class _Arg>
679ffeaf689SAlexander Kabaev     class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
680ffeaf689SAlexander Kabaev     {
68100db7afdSDavid E. O'Brien     public:
682ffeaf689SAlexander Kabaev       explicit
mem_fun1_ref_t(_Ret (_Tp::* __pf)(_Arg))683ffeaf689SAlexander Kabaev       mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
684ffeaf689SAlexander Kabaev       : _M_f(__pf) {}
685ffeaf689SAlexander Kabaev 
686ffeaf689SAlexander Kabaev       _Ret
operator()687ffeaf689SAlexander Kabaev       operator()(_Tp& __r, _Arg __x) const
688ffeaf689SAlexander Kabaev       { return (__r.*_M_f)(__x); }
68900db7afdSDavid E. O'Brien     private:
69000db7afdSDavid E. O'Brien       _Ret (_Tp::*_M_f)(_Arg);
69100db7afdSDavid E. O'Brien     };
69200db7afdSDavid E. O'Brien 
69300db7afdSDavid E. O'Brien   /// One of the @link s20_3_8_memadaptors adaptors for member pointers@endlink.
69400db7afdSDavid E. O'Brien   template <class _Ret, class _Tp, class _Arg>
695ffeaf689SAlexander Kabaev     class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
696ffeaf689SAlexander Kabaev     {
69700db7afdSDavid E. O'Brien     public:
698ffeaf689SAlexander Kabaev       explicit
const_mem_fun1_ref_t(_Ret (_Tp::* __pf)(_Arg)const)699ffeaf689SAlexander Kabaev       const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
700ffeaf689SAlexander Kabaev       : _M_f(__pf) {}
701ffeaf689SAlexander Kabaev 
702ffeaf689SAlexander Kabaev       _Ret
operator()703ffeaf689SAlexander Kabaev       operator()(const _Tp& __r, _Arg __x) const
704ffeaf689SAlexander Kabaev       { return (__r.*_M_f)(__x); }
70500db7afdSDavid E. O'Brien     private:
70600db7afdSDavid E. O'Brien       _Ret (_Tp::*_M_f)(_Arg) const;
70700db7afdSDavid E. O'Brien     };
70800db7afdSDavid E. O'Brien 
70900db7afdSDavid E. O'Brien   // Mem_fun adaptor helper functions.  There are only two:
71000db7afdSDavid E. O'Brien   // mem_fun and mem_fun_ref.
71100db7afdSDavid E. O'Brien   template <class _Ret, class _Tp>
712ffeaf689SAlexander Kabaev     inline mem_fun_t<_Ret, _Tp>
mem_fun(_Ret (_Tp::* __f)())713ffeaf689SAlexander Kabaev     mem_fun(_Ret (_Tp::*__f)())
71400db7afdSDavid E. O'Brien     { return mem_fun_t<_Ret, _Tp>(__f); }
71500db7afdSDavid E. O'Brien 
71600db7afdSDavid E. O'Brien   template <class _Ret, class _Tp>
717ffeaf689SAlexander Kabaev     inline const_mem_fun_t<_Ret, _Tp>
mem_fun(_Ret (_Tp::* __f)()const)718ffeaf689SAlexander Kabaev     mem_fun(_Ret (_Tp::*__f)() const)
71900db7afdSDavid E. O'Brien     { return const_mem_fun_t<_Ret, _Tp>(__f); }
72000db7afdSDavid E. O'Brien 
72100db7afdSDavid E. O'Brien   template <class _Ret, class _Tp>
722ffeaf689SAlexander Kabaev     inline mem_fun_ref_t<_Ret, _Tp>
mem_fun_ref(_Ret (_Tp::* __f)())723ffeaf689SAlexander Kabaev     mem_fun_ref(_Ret (_Tp::*__f)())
72400db7afdSDavid E. O'Brien     { return mem_fun_ref_t<_Ret, _Tp>(__f); }
72500db7afdSDavid E. O'Brien 
72600db7afdSDavid E. O'Brien   template <class _Ret, class _Tp>
727ffeaf689SAlexander Kabaev     inline const_mem_fun_ref_t<_Ret, _Tp>
mem_fun_ref(_Ret (_Tp::* __f)()const)728ffeaf689SAlexander Kabaev     mem_fun_ref(_Ret (_Tp::*__f)() const)
72900db7afdSDavid E. O'Brien     { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
73000db7afdSDavid E. O'Brien 
73100db7afdSDavid E. O'Brien   template <class _Ret, class _Tp, class _Arg>
732ffeaf689SAlexander Kabaev     inline mem_fun1_t<_Ret, _Tp, _Arg>
mem_fun(_Ret (_Tp::* __f)(_Arg))733ffeaf689SAlexander Kabaev     mem_fun(_Ret (_Tp::*__f)(_Arg))
73400db7afdSDavid E. O'Brien     { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
73500db7afdSDavid E. O'Brien 
73600db7afdSDavid E. O'Brien   template <class _Ret, class _Tp, class _Arg>
737ffeaf689SAlexander Kabaev     inline const_mem_fun1_t<_Ret, _Tp, _Arg>
mem_fun(_Ret (_Tp::* __f)(_Arg)const)738ffeaf689SAlexander Kabaev     mem_fun(_Ret (_Tp::*__f)(_Arg) const)
73900db7afdSDavid E. O'Brien     { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
74000db7afdSDavid E. O'Brien 
74100db7afdSDavid E. O'Brien   template <class _Ret, class _Tp, class _Arg>
742ffeaf689SAlexander Kabaev     inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
mem_fun_ref(_Ret (_Tp::* __f)(_Arg))743ffeaf689SAlexander Kabaev     mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
74400db7afdSDavid E. O'Brien     { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
74500db7afdSDavid E. O'Brien 
74600db7afdSDavid E. O'Brien   template <class _Ret, class _Tp, class _Arg>
74700db7afdSDavid E. O'Brien     inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
mem_fun_ref(_Ret (_Tp::* __f)(_Arg)const)74800db7afdSDavid E. O'Brien     mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
74900db7afdSDavid E. O'Brien     { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
75000db7afdSDavid E. O'Brien 
75100db7afdSDavid E. O'Brien   /** @}  */
75200db7afdSDavid E. O'Brien 
753*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
75400db7afdSDavid E. O'Brien 
755ffeaf689SAlexander Kabaev #endif /* _FUNCTION_H */
756