1*03a78d15Sespie // Numeric functions implementation -*- C++ -*- 2*03a78d15Sespie 3*03a78d15Sespie // Copyright (C) 2001 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,1997 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 stl_numeric.h 57*03a78d15Sespie * This is an internal header file, included by other library headers. 58*03a78d15Sespie * You should not attempt to use it directly. 59*03a78d15Sespie */ 60*03a78d15Sespie 61*03a78d15Sespie #ifndef _CPP_BITS_STL_NUMERIC_H 62*03a78d15Sespie #define _CPP_BITS_STL_NUMERIC_H 1 63*03a78d15Sespie 64*03a78d15Sespie namespace std 65*03a78d15Sespie { 66*03a78d15Sespie 67*03a78d15Sespie template<typename _InputIterator, typename _Tp> 68*03a78d15Sespie _Tp accumulate(_InputIterator __first,_InputIterator __last,_Tp __init)69*03a78d15Sespie accumulate(_InputIterator __first, _InputIterator __last, _Tp __init) 70*03a78d15Sespie { 71*03a78d15Sespie // concept requirements 72*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>) 73*03a78d15Sespie 74*03a78d15Sespie for ( ; __first != __last; ++__first) 75*03a78d15Sespie __init = __init + *__first; 76*03a78d15Sespie return __init; 77*03a78d15Sespie } 78*03a78d15Sespie 79*03a78d15Sespie template<typename _InputIterator, typename _Tp, typename _BinaryOperation> 80*03a78d15Sespie _Tp accumulate(_InputIterator __first,_InputIterator __last,_Tp __init,_BinaryOperation __binary_op)81*03a78d15Sespie accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, 82*03a78d15Sespie _BinaryOperation __binary_op) 83*03a78d15Sespie { 84*03a78d15Sespie // concept requirements 85*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>) 86*03a78d15Sespie 87*03a78d15Sespie for ( ; __first != __last; ++__first) 88*03a78d15Sespie __init = __binary_op(__init, *__first); 89*03a78d15Sespie return __init; 90*03a78d15Sespie } 91*03a78d15Sespie 92*03a78d15Sespie template<typename _InputIterator1, typename _InputIterator2, typename _Tp> 93*03a78d15Sespie _Tp inner_product(_InputIterator1 __first1,_InputIterator1 __last1,_InputIterator2 __first2,_Tp __init)94*03a78d15Sespie inner_product(_InputIterator1 __first1, _InputIterator1 __last1, 95*03a78d15Sespie _InputIterator2 __first2, _Tp __init) 96*03a78d15Sespie { 97*03a78d15Sespie // concept requirements 98*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator1>) 99*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator2>) 100*03a78d15Sespie 101*03a78d15Sespie for ( ; __first1 != __last1; ++__first1, ++__first2) 102*03a78d15Sespie __init = __init + (*__first1 * *__first2); 103*03a78d15Sespie return __init; 104*03a78d15Sespie } 105*03a78d15Sespie 106*03a78d15Sespie template<typename _InputIterator1, typename _InputIterator2, typename _Tp, 107*03a78d15Sespie typename _BinaryOperation1, typename _BinaryOperation2> 108*03a78d15Sespie _Tp inner_product(_InputIterator1 __first1,_InputIterator1 __last1,_InputIterator2 __first2,_Tp __init,_BinaryOperation1 __binary_op1,_BinaryOperation2 __binary_op2)109*03a78d15Sespie inner_product(_InputIterator1 __first1, _InputIterator1 __last1, 110*03a78d15Sespie _InputIterator2 __first2, _Tp __init, 111*03a78d15Sespie _BinaryOperation1 __binary_op1, 112*03a78d15Sespie _BinaryOperation2 __binary_op2) 113*03a78d15Sespie { 114*03a78d15Sespie // concept requirements 115*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator1>) 116*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator2>) 117*03a78d15Sespie 118*03a78d15Sespie for ( ; __first1 != __last1; ++__first1, ++__first2) 119*03a78d15Sespie __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); 120*03a78d15Sespie return __init; 121*03a78d15Sespie } 122*03a78d15Sespie 123*03a78d15Sespie template<typename _InputIterator, typename _OutputIterator> 124*03a78d15Sespie _OutputIterator partial_sum(_InputIterator __first,_InputIterator __last,_OutputIterator __result)125*03a78d15Sespie partial_sum(_InputIterator __first, _InputIterator __last, 126*03a78d15Sespie _OutputIterator __result) 127*03a78d15Sespie { 128*03a78d15Sespie typedef typename iterator_traits<_InputIterator>::value_type _ValueType; 129*03a78d15Sespie 130*03a78d15Sespie // concept requirements 131*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>) 132*03a78d15Sespie __glibcpp_function_requires(_OutputIteratorConcept<_OutputIterator, _ValueType>) 133*03a78d15Sespie 134*03a78d15Sespie if (__first == __last) return __result; 135*03a78d15Sespie *__result = *__first; 136*03a78d15Sespie _ValueType __value = *__first; 137*03a78d15Sespie while (++__first != __last) { 138*03a78d15Sespie __value = __value + *__first; 139*03a78d15Sespie *++__result = __value; 140*03a78d15Sespie } 141*03a78d15Sespie return ++__result; 142*03a78d15Sespie } 143*03a78d15Sespie 144*03a78d15Sespie template<typename _InputIterator, typename _OutputIterator, typename _BinaryOperation> 145*03a78d15Sespie _OutputIterator partial_sum(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_BinaryOperation __binary_op)146*03a78d15Sespie partial_sum(_InputIterator __first, _InputIterator __last, 147*03a78d15Sespie _OutputIterator __result, _BinaryOperation __binary_op) 148*03a78d15Sespie { 149*03a78d15Sespie typedef typename iterator_traits<_InputIterator>::value_type _ValueType; 150*03a78d15Sespie 151*03a78d15Sespie // concept requirements 152*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>) 153*03a78d15Sespie __glibcpp_function_requires(_OutputIteratorConcept<_OutputIterator, _ValueType>) 154*03a78d15Sespie 155*03a78d15Sespie if (__first == __last) return __result; 156*03a78d15Sespie *__result = *__first; 157*03a78d15Sespie _ValueType __value = *__first; 158*03a78d15Sespie while (++__first != __last) { 159*03a78d15Sespie __value = __binary_op(__value, *__first); 160*03a78d15Sespie *++__result = __value; 161*03a78d15Sespie } 162*03a78d15Sespie return ++__result; 163*03a78d15Sespie } 164*03a78d15Sespie 165*03a78d15Sespie template<typename _InputIterator, typename _OutputIterator> 166*03a78d15Sespie _OutputIterator adjacent_difference(_InputIterator __first,_InputIterator __last,_OutputIterator __result)167*03a78d15Sespie adjacent_difference(_InputIterator __first, 168*03a78d15Sespie _InputIterator __last, _OutputIterator __result) 169*03a78d15Sespie { 170*03a78d15Sespie typedef typename iterator_traits<_InputIterator>::value_type _ValueType; 171*03a78d15Sespie 172*03a78d15Sespie // concept requirements 173*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>) 174*03a78d15Sespie __glibcpp_function_requires(_OutputIteratorConcept<_OutputIterator, _ValueType>) 175*03a78d15Sespie 176*03a78d15Sespie if (__first == __last) return __result; 177*03a78d15Sespie *__result = *__first; 178*03a78d15Sespie _ValueType __value = *__first; 179*03a78d15Sespie while (++__first != __last) { 180*03a78d15Sespie _ValueType __tmp = *__first; 181*03a78d15Sespie *++__result = __tmp - __value; 182*03a78d15Sespie __value = __tmp; 183*03a78d15Sespie } 184*03a78d15Sespie return ++__result; 185*03a78d15Sespie } 186*03a78d15Sespie 187*03a78d15Sespie template<typename _InputIterator, typename _OutputIterator, typename _BinaryOperation> 188*03a78d15Sespie _OutputIterator adjacent_difference(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_BinaryOperation __binary_op)189*03a78d15Sespie adjacent_difference(_InputIterator __first, _InputIterator __last, 190*03a78d15Sespie _OutputIterator __result, _BinaryOperation __binary_op) 191*03a78d15Sespie { 192*03a78d15Sespie typedef typename iterator_traits<_InputIterator>::value_type _ValueType; 193*03a78d15Sespie 194*03a78d15Sespie // concept requirements 195*03a78d15Sespie __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>) 196*03a78d15Sespie __glibcpp_function_requires(_OutputIteratorConcept<_OutputIterator, _ValueType>) 197*03a78d15Sespie 198*03a78d15Sespie if (__first == __last) return __result; 199*03a78d15Sespie *__result = *__first; 200*03a78d15Sespie _ValueType __value = *__first; 201*03a78d15Sespie while (++__first != __last) { 202*03a78d15Sespie _ValueType __tmp = *__first; 203*03a78d15Sespie *++__result = __binary_op(__tmp, __value); 204*03a78d15Sespie __value = __tmp; 205*03a78d15Sespie } 206*03a78d15Sespie return ++__result; 207*03a78d15Sespie } 208*03a78d15Sespie 209*03a78d15Sespie } // namespace std 210*03a78d15Sespie 211*03a78d15Sespie #endif /* _CPP_BITS_STL_NUMERIC_H */ 212*03a78d15Sespie 213*03a78d15Sespie // Local Variables: 214*03a78d15Sespie // mode:C++ 215*03a78d15Sespie // End: 216