xref: /openbsd-src/gnu/lib/libstdc++/libstdc++/include/bits/stl_numeric.h (revision 03a78d155d6fff5698289342b62759a75b20d130)
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