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