1*03a78d15Sespie// Functional extensions -*- C++ -*- 2*03a78d15Sespie 3*03a78d15Sespie// Copyright (C) 2002 Free Software Foundation, Inc. 4*03a78d15Sespie// 5*03a78d15Sespie// This file is part of the GNU ISO C++ Library. This library is free 6*03a78d15Sespie// software; you can redistribute it and/or modify it under the 7*03a78d15Sespie// terms of the GNU General Public License as published by the 8*03a78d15Sespie// Free Software Foundation; either version 2, or (at your option) 9*03a78d15Sespie// any later version. 10*03a78d15Sespie 11*03a78d15Sespie// This library is distributed in the hope that it will be useful, 12*03a78d15Sespie// but WITHOUT ANY WARRANTY; without even the implied warranty of 13*03a78d15Sespie// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*03a78d15Sespie// GNU General Public License for more details. 15*03a78d15Sespie 16*03a78d15Sespie// You should have received a copy of the GNU General Public License along 17*03a78d15Sespie// with this library; see the file COPYING. If not, write to the Free 18*03a78d15Sespie// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 19*03a78d15Sespie// USA. 20*03a78d15Sespie 21*03a78d15Sespie// As a special exception, you may use this file as part of a free software 22*03a78d15Sespie// library without restriction. Specifically, if other files instantiate 23*03a78d15Sespie// templates or use macros or inline functions from this file, or you compile 24*03a78d15Sespie// this file and link it with other files to produce an executable, this 25*03a78d15Sespie// file does not by itself cause the resulting executable to be covered by 26*03a78d15Sespie// the GNU General Public License. This exception does not however 27*03a78d15Sespie// invalidate any other reasons why the executable file might be covered by 28*03a78d15Sespie// the GNU General Public License. 29*03a78d15Sespie 30*03a78d15Sespie/* 31*03a78d15Sespie * 32*03a78d15Sespie * Copyright (c) 1994 33*03a78d15Sespie * Hewlett-Packard Company 34*03a78d15Sespie * 35*03a78d15Sespie * Permission to use, copy, modify, distribute and sell this software 36*03a78d15Sespie * and its documentation for any purpose is hereby granted without fee, 37*03a78d15Sespie * provided that the above copyright notice appear in all copies and 38*03a78d15Sespie * that both that copyright notice and this permission notice appear 39*03a78d15Sespie * in supporting documentation. Hewlett-Packard Company makes no 40*03a78d15Sespie * representations about the suitability of this software for any 41*03a78d15Sespie * purpose. It is provided "as is" without express or implied warranty. 42*03a78d15Sespie * 43*03a78d15Sespie * 44*03a78d15Sespie * Copyright (c) 1996 45*03a78d15Sespie * Silicon Graphics Computer Systems, Inc. 46*03a78d15Sespie * 47*03a78d15Sespie * Permission to use, copy, modify, distribute and sell this software 48*03a78d15Sespie * and its documentation for any purpose is hereby granted without fee, 49*03a78d15Sespie * provided that the above copyright notice appear in all copies and 50*03a78d15Sespie * that both that copyright notice and this permission notice appear 51*03a78d15Sespie * in supporting documentation. Silicon Graphics makes no 52*03a78d15Sespie * representations about the suitability of this software for any 53*03a78d15Sespie * purpose. It is provided "as is" without express or implied warranty. 54*03a78d15Sespie */ 55*03a78d15Sespie 56*03a78d15Sespie/** @file ext/functional 57*03a78d15Sespie * This file is a GNU extension to the Standard C++ Library (possibly 58*03a78d15Sespie * containing extensions from the HP/SGI STL subset). You should only 59*03a78d15Sespie * include this header if you are using GCC 3 or later. 60*03a78d15Sespie */ 61*03a78d15Sespie 62*03a78d15Sespie#ifndef _EXT_FUNCTIONAL 63*03a78d15Sespie#define _EXT_FUNCTIONAL 64*03a78d15Sespie 65*03a78d15Sespie#pragma GCC system_header 66*03a78d15Sespie#include <functional> 67*03a78d15Sespie 68*03a78d15Sespienamespace __gnu_cxx 69*03a78d15Sespie{ 70*03a78d15Sespieusing std::unary_function; 71*03a78d15Sespieusing std::binary_function; 72*03a78d15Sespieusing std::mem_fun1_t; 73*03a78d15Sespieusing std::const_mem_fun1_t; 74*03a78d15Sespieusing std::mem_fun1_ref_t; 75*03a78d15Sespieusing std::const_mem_fun1_ref_t; 76*03a78d15Sespie 77*03a78d15Sespie/** The @c identity_element functions are not part of the C++ standard; SGI 78*03a78d15Sespie * provided them as an extension. Its argument is an operation, and its 79*03a78d15Sespie * return value is the identity element for that operation. It is overloaded 80*03a78d15Sespie * for addition and multiplication, and you can overload it for your own 81*03a78d15Sespie * nefarious operations. 82*03a78d15Sespie * 83*03a78d15Sespie * @addtogroup SGIextensions 84*03a78d15Sespie * @{ 85*03a78d15Sespie*/ 86*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 87*03a78d15Sespietemplate <class _Tp> inline _Tp identity_element(std::plus<_Tp>) { 88*03a78d15Sespie return _Tp(0); 89*03a78d15Sespie} 90*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 91*03a78d15Sespietemplate <class _Tp> inline _Tp identity_element(std::multiplies<_Tp>) { 92*03a78d15Sespie return _Tp(1); 93*03a78d15Sespie} 94*03a78d15Sespie/** @} */ 95*03a78d15Sespie 96*03a78d15Sespie/** As an extension to the binders, SGI provided composition functors and 97*03a78d15Sespie * wrapper functions to aid in their creation. The @c unary_compose 98*03a78d15Sespie * functor is constructed from two functions/functors, @c f and @c g. 99*03a78d15Sespie * Calling @c operator() with a single argument @c x returns @c f(g(x)). 100*03a78d15Sespie * The function @c compose1 takes the two functions and constructs a 101*03a78d15Sespie * @c unary_compose variable for you. 102*03a78d15Sespie * 103*03a78d15Sespie * @c binary_compose is constructed from three functors, @c f, @c g1, 104*03a78d15Sespie * and @c g2. Its @c operator() returns @c f(g1(x),g2(x)). The function 105*03a78d15Sespie * @compose2 takes f, g1, and g2, and constructs the @c binary_compose 106*03a78d15Sespie * instance for you. For example, if @c f returns an int, then 107*03a78d15Sespie * \code 108*03a78d15Sespie * int answer = (compose2(f,g1,g2))(x); 109*03a78d15Sespie * \endcode 110*03a78d15Sespie * is equivalent to 111*03a78d15Sespie * \code 112*03a78d15Sespie * int temp1 = g1(x); 113*03a78d15Sespie * int temp2 = g2(x); 114*03a78d15Sespie * int answer = f(temp1,temp2); 115*03a78d15Sespie * \endcode 116*03a78d15Sespie * But the first form is more compact, and can be passed around as a 117*03a78d15Sespie * functor to other algorithms. 118*03a78d15Sespie * 119*03a78d15Sespie * @addtogroup SGIextensions 120*03a78d15Sespie * @{ 121*03a78d15Sespie*/ 122*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 123*03a78d15Sespietemplate <class _Operation1, class _Operation2> 124*03a78d15Sespieclass unary_compose 125*03a78d15Sespie : public unary_function<typename _Operation2::argument_type, 126*03a78d15Sespie typename _Operation1::result_type> 127*03a78d15Sespie{ 128*03a78d15Sespieprotected: 129*03a78d15Sespie _Operation1 _M_fn1; 130*03a78d15Sespie _Operation2 _M_fn2; 131*03a78d15Sespiepublic: 132*03a78d15Sespie unary_compose(const _Operation1& __x, const _Operation2& __y) 133*03a78d15Sespie : _M_fn1(__x), _M_fn2(__y) {} 134*03a78d15Sespie typename _Operation1::result_type 135*03a78d15Sespie operator()(const typename _Operation2::argument_type& __x) const { 136*03a78d15Sespie return _M_fn1(_M_fn2(__x)); 137*03a78d15Sespie } 138*03a78d15Sespie}; 139*03a78d15Sespie 140*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 141*03a78d15Sespietemplate <class _Operation1, class _Operation2> 142*03a78d15Sespieinline unary_compose<_Operation1,_Operation2> 143*03a78d15Sespiecompose1(const _Operation1& __fn1, const _Operation2& __fn2) 144*03a78d15Sespie{ 145*03a78d15Sespie return unary_compose<_Operation1,_Operation2>(__fn1, __fn2); 146*03a78d15Sespie} 147*03a78d15Sespie 148*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 149*03a78d15Sespietemplate <class _Operation1, class _Operation2, class _Operation3> 150*03a78d15Sespieclass binary_compose 151*03a78d15Sespie : public unary_function<typename _Operation2::argument_type, 152*03a78d15Sespie typename _Operation1::result_type> { 153*03a78d15Sespieprotected: 154*03a78d15Sespie _Operation1 _M_fn1; 155*03a78d15Sespie _Operation2 _M_fn2; 156*03a78d15Sespie _Operation3 _M_fn3; 157*03a78d15Sespiepublic: 158*03a78d15Sespie binary_compose(const _Operation1& __x, const _Operation2& __y, 159*03a78d15Sespie const _Operation3& __z) 160*03a78d15Sespie : _M_fn1(__x), _M_fn2(__y), _M_fn3(__z) { } 161*03a78d15Sespie typename _Operation1::result_type 162*03a78d15Sespie operator()(const typename _Operation2::argument_type& __x) const { 163*03a78d15Sespie return _M_fn1(_M_fn2(__x), _M_fn3(__x)); 164*03a78d15Sespie } 165*03a78d15Sespie}; 166*03a78d15Sespie 167*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 168*03a78d15Sespietemplate <class _Operation1, class _Operation2, class _Operation3> 169*03a78d15Sespieinline binary_compose<_Operation1, _Operation2, _Operation3> 170*03a78d15Sespiecompose2(const _Operation1& __fn1, const _Operation2& __fn2, 171*03a78d15Sespie const _Operation3& __fn3) 172*03a78d15Sespie{ 173*03a78d15Sespie return binary_compose<_Operation1,_Operation2,_Operation3> 174*03a78d15Sespie (__fn1, __fn2, __fn3); 175*03a78d15Sespie} 176*03a78d15Sespie/** @} */ 177*03a78d15Sespie 178*03a78d15Sespie/** As an extension, SGI provided a functor called @c identity. When a 179*03a78d15Sespie * functor is required but no operations are desired, this can be used as a 180*03a78d15Sespie * pass-through. Its @c operator() returns its argument unchanged. 181*03a78d15Sespie * 182*03a78d15Sespie * @addtogroup SGIextensions 183*03a78d15Sespie*/ 184*03a78d15Sespietemplate <class _Tp> struct identity : public std::_Identity<_Tp> {}; 185*03a78d15Sespie 186*03a78d15Sespie/** @c select1st and @c select2nd are extensions provided by SGI. Their 187*03a78d15Sespie * @c operator()s 188*03a78d15Sespie * take a @c std::pair as an argument, and return either the first member 189*03a78d15Sespie * or the second member, respectively. They can be used (especially with 190*03a78d15Sespie * the composition functors) to "strip" data from a sequence before 191*03a78d15Sespie * performing the remainder of an algorithm. 192*03a78d15Sespie * 193*03a78d15Sespie * @addtogroup SGIextensions 194*03a78d15Sespie * @{ 195*03a78d15Sespie*/ 196*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 197*03a78d15Sespietemplate <class _Pair> struct select1st : public std::_Select1st<_Pair> {}; 198*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 199*03a78d15Sespietemplate <class _Pair> struct select2nd : public std::_Select2nd<_Pair> {}; 200*03a78d15Sespie/** @} */ 201*03a78d15Sespie 202*03a78d15Sespie// extension documented next 203*03a78d15Sespietemplate <class _Arg1, class _Arg2> 204*03a78d15Sespiestruct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> { 205*03a78d15Sespie _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; } 206*03a78d15Sespie}; 207*03a78d15Sespie 208*03a78d15Sespietemplate <class _Arg1, class _Arg2> 209*03a78d15Sespiestruct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> { 210*03a78d15Sespie _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; } 211*03a78d15Sespie}; 212*03a78d15Sespie 213*03a78d15Sespie/** The @c operator() of the @c project1st functor takes two arbitrary 214*03a78d15Sespie * arguments and returns the first one, while @c project2nd returns the 215*03a78d15Sespie * second one. They are extensions provided by SGI. 216*03a78d15Sespie * 217*03a78d15Sespie * @addtogroup SGIextensions 218*03a78d15Sespie * @{ 219*03a78d15Sespie*/ 220*03a78d15Sespie 221*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 222*03a78d15Sespietemplate <class _Arg1, class _Arg2> 223*03a78d15Sespiestruct project1st : public _Project1st<_Arg1, _Arg2> {}; 224*03a78d15Sespie 225*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 226*03a78d15Sespietemplate <class _Arg1, class _Arg2> 227*03a78d15Sespiestruct project2nd : public _Project2nd<_Arg1, _Arg2> {}; 228*03a78d15Sespie/** @} */ 229*03a78d15Sespie 230*03a78d15Sespie// extension documented next 231*03a78d15Sespietemplate <class _Result> 232*03a78d15Sespiestruct _Constant_void_fun { 233*03a78d15Sespie typedef _Result result_type; 234*03a78d15Sespie result_type _M_val; 235*03a78d15Sespie 236*03a78d15Sespie _Constant_void_fun(const result_type& __v) : _M_val(__v) {} 237*03a78d15Sespie const result_type& operator()() const { return _M_val; } 238*03a78d15Sespie}; 239*03a78d15Sespie 240*03a78d15Sespietemplate <class _Result, class _Argument> 241*03a78d15Sespiestruct _Constant_unary_fun { 242*03a78d15Sespie typedef _Argument argument_type; 243*03a78d15Sespie typedef _Result result_type; 244*03a78d15Sespie result_type _M_val; 245*03a78d15Sespie 246*03a78d15Sespie _Constant_unary_fun(const result_type& __v) : _M_val(__v) {} 247*03a78d15Sespie const result_type& operator()(const _Argument&) const { return _M_val; } 248*03a78d15Sespie}; 249*03a78d15Sespie 250*03a78d15Sespietemplate <class _Result, class _Arg1, class _Arg2> 251*03a78d15Sespiestruct _Constant_binary_fun { 252*03a78d15Sespie typedef _Arg1 first_argument_type; 253*03a78d15Sespie typedef _Arg2 second_argument_type; 254*03a78d15Sespie typedef _Result result_type; 255*03a78d15Sespie _Result _M_val; 256*03a78d15Sespie 257*03a78d15Sespie _Constant_binary_fun(const _Result& __v) : _M_val(__v) {} 258*03a78d15Sespie const result_type& operator()(const _Arg1&, const _Arg2&) const { 259*03a78d15Sespie return _M_val; 260*03a78d15Sespie } 261*03a78d15Sespie}; 262*03a78d15Sespie 263*03a78d15Sespie/** These three functors are each constructed from a single arbitrary 264*03a78d15Sespie * variable/value. Later, their @c operator()s completely ignore any 265*03a78d15Sespie * arguments passed, and return the stored value. 266*03a78d15Sespie * - @c constant_void_fun's @c operator() takes no arguments 267*03a78d15Sespie * - @c constant_unary_fun's @c operator() takes one argument (ignored) 268*03a78d15Sespie * - @c constant_binary_fun's @c operator() takes two arguments (ignored) 269*03a78d15Sespie * 270*03a78d15Sespie * The helper creator functions @c constant0, @c constant1, and 271*03a78d15Sespie * @c constant2 each take a "result" argument and construct variables of 272*03a78d15Sespie * the appropriate functor type. 273*03a78d15Sespie * 274*03a78d15Sespie * @addtogroup SGIextensions 275*03a78d15Sespie * @{ 276*03a78d15Sespie*/ 277*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 278*03a78d15Sespietemplate <class _Result> 279*03a78d15Sespiestruct constant_void_fun : public _Constant_void_fun<_Result> { 280*03a78d15Sespie constant_void_fun(const _Result& __v) : _Constant_void_fun<_Result>(__v) {} 281*03a78d15Sespie}; 282*03a78d15Sespie 283*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 284*03a78d15Sespietemplate <class _Result, 285*03a78d15Sespie class _Argument = _Result> 286*03a78d15Sespiestruct constant_unary_fun : public _Constant_unary_fun<_Result, _Argument> 287*03a78d15Sespie{ 288*03a78d15Sespie constant_unary_fun(const _Result& __v) 289*03a78d15Sespie : _Constant_unary_fun<_Result, _Argument>(__v) {} 290*03a78d15Sespie}; 291*03a78d15Sespie 292*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 293*03a78d15Sespietemplate <class _Result, 294*03a78d15Sespie class _Arg1 = _Result, 295*03a78d15Sespie class _Arg2 = _Arg1> 296*03a78d15Sespiestruct constant_binary_fun 297*03a78d15Sespie : public _Constant_binary_fun<_Result, _Arg1, _Arg2> 298*03a78d15Sespie{ 299*03a78d15Sespie constant_binary_fun(const _Result& __v) 300*03a78d15Sespie : _Constant_binary_fun<_Result, _Arg1, _Arg2>(__v) {} 301*03a78d15Sespie}; 302*03a78d15Sespie 303*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 304*03a78d15Sespietemplate <class _Result> 305*03a78d15Sespieinline constant_void_fun<_Result> constant0(const _Result& __val) 306*03a78d15Sespie{ 307*03a78d15Sespie return constant_void_fun<_Result>(__val); 308*03a78d15Sespie} 309*03a78d15Sespie 310*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 311*03a78d15Sespietemplate <class _Result> 312*03a78d15Sespieinline constant_unary_fun<_Result,_Result> constant1(const _Result& __val) 313*03a78d15Sespie{ 314*03a78d15Sespie return constant_unary_fun<_Result,_Result>(__val); 315*03a78d15Sespie} 316*03a78d15Sespie 317*03a78d15Sespie/// An \link SGIextensions SGI extension \endlink. 318*03a78d15Sespietemplate <class _Result> 319*03a78d15Sespieinline constant_binary_fun<_Result,_Result,_Result> 320*03a78d15Sespieconstant2(const _Result& __val) 321*03a78d15Sespie{ 322*03a78d15Sespie return constant_binary_fun<_Result,_Result,_Result>(__val); 323*03a78d15Sespie} 324*03a78d15Sespie/** @} */ 325*03a78d15Sespie 326*03a78d15Sespie/** The @c subtractive_rng class is documented on 327*03a78d15Sespie * <a href="http://www.sgi.com/tech/stl/">SGI's site</a>. 328*03a78d15Sespie * Note that this code assumes that @c int is 32 bits. 329*03a78d15Sespie * 330*03a78d15Sespie * @ingroup SGIextensions 331*03a78d15Sespie*/ 332*03a78d15Sespieclass subtractive_rng : public unary_function<unsigned int, unsigned int> { 333*03a78d15Sespieprivate: 334*03a78d15Sespie unsigned int _M_table[55]; 335*03a78d15Sespie size_t _M_index1; 336*03a78d15Sespie size_t _M_index2; 337*03a78d15Sespiepublic: 338*03a78d15Sespie /// Returns a number less than the argument. 339*03a78d15Sespie unsigned int operator()(unsigned int __limit) { 340*03a78d15Sespie _M_index1 = (_M_index1 + 1) % 55; 341*03a78d15Sespie _M_index2 = (_M_index2 + 1) % 55; 342*03a78d15Sespie _M_table[_M_index1] = _M_table[_M_index1] - _M_table[_M_index2]; 343*03a78d15Sespie return _M_table[_M_index1] % __limit; 344*03a78d15Sespie } 345*03a78d15Sespie 346*03a78d15Sespie void _M_initialize(unsigned int __seed) 347*03a78d15Sespie { 348*03a78d15Sespie unsigned int __k = 1; 349*03a78d15Sespie _M_table[54] = __seed; 350*03a78d15Sespie size_t __i; 351*03a78d15Sespie for (__i = 0; __i < 54; __i++) { 352*03a78d15Sespie size_t __ii = (21 * (__i + 1) % 55) - 1; 353*03a78d15Sespie _M_table[__ii] = __k; 354*03a78d15Sespie __k = __seed - __k; 355*03a78d15Sespie __seed = _M_table[__ii]; 356*03a78d15Sespie } 357*03a78d15Sespie for (int __loop = 0; __loop < 4; __loop++) { 358*03a78d15Sespie for (__i = 0; __i < 55; __i++) 359*03a78d15Sespie _M_table[__i] = _M_table[__i] - _M_table[(1 + __i + 30) % 55]; 360*03a78d15Sespie } 361*03a78d15Sespie _M_index1 = 0; 362*03a78d15Sespie _M_index2 = 31; 363*03a78d15Sespie } 364*03a78d15Sespie 365*03a78d15Sespie /// Ctor allowing you to initialize the seed. 366*03a78d15Sespie subtractive_rng(unsigned int __seed) { _M_initialize(__seed); } 367*03a78d15Sespie /// Default ctor; initializes its state with some number you don't see. 368*03a78d15Sespie subtractive_rng() { _M_initialize(161803398u); } 369*03a78d15Sespie}; 370*03a78d15Sespie 371*03a78d15Sespie// Mem_fun adaptor helper functions mem_fun1 and mem_fun1_ref, 372*03a78d15Sespie// provided for backward compatibility, they are no longer part of 373*03a78d15Sespie// the C++ standard. 374*03a78d15Sespie 375*03a78d15Sespietemplate <class _Ret, class _Tp, class _Arg> 376*03a78d15Sespieinline mem_fun1_t<_Ret,_Tp,_Arg> mem_fun1(_Ret (_Tp::*__f)(_Arg)) 377*03a78d15Sespie { return mem_fun1_t<_Ret,_Tp,_Arg>(__f); } 378*03a78d15Sespie 379*03a78d15Sespietemplate <class _Ret, class _Tp, class _Arg> 380*03a78d15Sespieinline const_mem_fun1_t<_Ret,_Tp,_Arg> mem_fun1(_Ret (_Tp::*__f)(_Arg) const) 381*03a78d15Sespie { return const_mem_fun1_t<_Ret,_Tp,_Arg>(__f); } 382*03a78d15Sespie 383*03a78d15Sespietemplate <class _Ret, class _Tp, class _Arg> 384*03a78d15Sespieinline mem_fun1_ref_t<_Ret,_Tp,_Arg> mem_fun1_ref(_Ret (_Tp::*__f)(_Arg)) 385*03a78d15Sespie { return mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f); } 386*03a78d15Sespie 387*03a78d15Sespietemplate <class _Ret, class _Tp, class _Arg> 388*03a78d15Sespieinline const_mem_fun1_ref_t<_Ret,_Tp,_Arg> 389*03a78d15Sespiemem_fun1_ref(_Ret (_Tp::*__f)(_Arg) const) 390*03a78d15Sespie { return const_mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f); } 391*03a78d15Sespie 392*03a78d15Sespie} // namespace __gnu_cxx 393*03a78d15Sespie 394*03a78d15Sespie#endif /* _EXT_FUNCTIONAL */ 395*03a78d15Sespie 396