xref: /haiku/headers/cpp/stl_numeric.h (revision f2ced752a08ff5d2618826bcd3ae3976c9f3e92e)
1 /*
2  *
3  * Copyright (c) 1994
4  * Hewlett-Packard Company
5  *
6  * Permission to use, copy, modify, distribute and sell this software
7  * and its documentation for any purpose is hereby granted without fee,
8  * provided that the above copyright notice appear in all copies and
9  * that both that copyright notice and this permission notice appear
10  * in supporting documentation.  Hewlett-Packard Company makes no
11  * representations about the suitability of this software for any
12  * purpose.  It is provided "as is" without express or implied warranty.
13  *
14  *
15  * Copyright (c) 1996,1997
16  * Silicon Graphics Computer Systems, Inc.
17  *
18  * Permission to use, copy, modify, distribute and sell this software
19  * and its documentation for any purpose is hereby granted without fee,
20  * provided that the above copyright notice appear in all copies and
21  * that both that copyright notice and this permission notice appear
22  * in supporting documentation.  Silicon Graphics makes no
23  * representations about the suitability of this software for any
24  * purpose.  It is provided "as is" without express or implied warranty.
25  */
26 
27 /* NOTE: This is an internal header file, included by other STL headers.
28  *   You should not attempt to use it directly.
29  */
30 
31 
32 #ifndef __SGI_STL_INTERNAL_NUMERIC_H
33 #define __SGI_STL_INTERNAL_NUMERIC_H
34 
35 __STL_BEGIN_NAMESPACE
36 
37 template <class _InputIterator, class _Tp>
accumulate(_InputIterator __first,_InputIterator __last,_Tp __init)38 _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
39 {
40   for ( ; __first != __last; ++__first)
41     __init = __init + *__first;
42   return __init;
43 }
44 
45 template <class _InputIterator, class _Tp, class _BinaryOperation>
accumulate(_InputIterator __first,_InputIterator __last,_Tp __init,_BinaryOperation __binary_op)46 _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
47                _BinaryOperation __binary_op)
48 {
49   for ( ; __first != __last; ++__first)
50     __init = __binary_op(__init, *__first);
51   return __init;
52 }
53 
54 template <class _InputIterator1, class _InputIterator2, class _Tp>
inner_product(_InputIterator1 __first1,_InputIterator1 __last1,_InputIterator2 __first2,_Tp __init)55 _Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
56                   _InputIterator2 __first2, _Tp __init)
57 {
58   for ( ; __first1 != __last1; ++__first1, ++__first2)
59     __init = __init + (*__first1 * *__first2);
60   return __init;
61 }
62 
63 template <class _InputIterator1, class _InputIterator2, class _Tp,
64           class _BinaryOperation1, class _BinaryOperation2>
inner_product(_InputIterator1 __first1,_InputIterator1 __last1,_InputIterator2 __first2,_Tp __init,_BinaryOperation1 __binary_op1,_BinaryOperation2 __binary_op2)65 _Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
66                   _InputIterator2 __first2, _Tp __init,
67                   _BinaryOperation1 __binary_op1,
68                   _BinaryOperation2 __binary_op2)
69 {
70   for ( ; __first1 != __last1; ++__first1, ++__first2)
71     __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
72   return __init;
73 }
74 
75 template <class _InputIterator, class _OutputIterator, class _Tp>
76 _OutputIterator
__partial_sum(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_Tp *)77 __partial_sum(_InputIterator __first, _InputIterator __last,
78               _OutputIterator __result, _Tp*)
79 {
80   _Tp __value = *__first;
81   while (++__first != __last) {
82     __value = __value + *__first;
83     *++__result = __value;
84   }
85   return ++__result;
86 }
87 
88 template <class _InputIterator, class _OutputIterator>
89 _OutputIterator
partial_sum(_InputIterator __first,_InputIterator __last,_OutputIterator __result)90 partial_sum(_InputIterator __first, _InputIterator __last,
91             _OutputIterator __result)
92 {
93   if (__first == __last) return __result;
94   *__result = *__first;
95   return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first));
96 }
97 
98 template <class _InputIterator, class _OutputIterator, class _Tp,
99           class _BinaryOperation>
100 _OutputIterator
__partial_sum(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_Tp *,_BinaryOperation __binary_op)101 __partial_sum(_InputIterator __first, _InputIterator __last,
102               _OutputIterator __result, _Tp*, _BinaryOperation __binary_op)
103 {
104   _Tp __value = *__first;
105   while (++__first != __last) {
106     __value = __binary_op(__value, *__first);
107     *++__result = __value;
108   }
109   return ++__result;
110 }
111 
112 template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
113 _OutputIterator
partial_sum(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_BinaryOperation __binary_op)114 partial_sum(_InputIterator __first, _InputIterator __last,
115             _OutputIterator __result, _BinaryOperation __binary_op)
116 {
117   if (__first == __last) return __result;
118   *__result = *__first;
119   return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first),
120                        __binary_op);
121 }
122 
123 template <class _InputIterator, class _OutputIterator, class _Tp>
124 _OutputIterator
__adjacent_difference(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_Tp *)125 __adjacent_difference(_InputIterator __first, _InputIterator __last,
126                       _OutputIterator __result, _Tp*)
127 {
128   _Tp __value = *__first;
129   while (++__first != __last) {
130     _Tp __tmp = *__first;
131     *++__result = __tmp - __value;
132     __value = __tmp;
133   }
134   return ++__result;
135 }
136 
137 template <class _InputIterator, class _OutputIterator>
138 _OutputIterator
adjacent_difference(_InputIterator __first,_InputIterator __last,_OutputIterator __result)139 adjacent_difference(_InputIterator __first,
140                     _InputIterator __last, _OutputIterator __result)
141 {
142   if (__first == __last) return __result;
143   *__result = *__first;
144   return __adjacent_difference(__first, __last, __result,
145                                __VALUE_TYPE(__first));
146 }
147 
148 template <class _InputIterator, class _OutputIterator, class _Tp,
149           class _BinaryOperation>
150 _OutputIterator
__adjacent_difference(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_Tp *,_BinaryOperation __binary_op)151 __adjacent_difference(_InputIterator __first, _InputIterator __last,
152                       _OutputIterator __result, _Tp*,
153                       _BinaryOperation __binary_op) {
154   _Tp __value = *__first;
155   while (++__first != __last) {
156     _Tp __tmp = *__first;
157     *++__result = __binary_op(__tmp, __value);
158     __value = __tmp;
159   }
160   return ++__result;
161 }
162 
163 template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
164 _OutputIterator
adjacent_difference(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_BinaryOperation __binary_op)165 adjacent_difference(_InputIterator __first, _InputIterator __last,
166                     _OutputIterator __result, _BinaryOperation __binary_op)
167 {
168   if (__first == __last) return __result;
169   *__result = *__first;
170   return __adjacent_difference(__first, __last, __result,
171                                __VALUE_TYPE(__first),
172                                __binary_op);
173 }
174 
175 // Returns __x ** __n, where __n >= 0.  _Note that "multiplication"
176 // is required to be associative, but not necessarily commutative.
177 
178 
179 template <class _Tp, class _Integer, class _MonoidOperation>
__power(_Tp __x,_Integer __n,_MonoidOperation __oper)180 _Tp __power(_Tp __x, _Integer __n, _MonoidOperation __oper)
181 {
182   if (__n == 0)
183     return identity_element(__oper);
184   else {
185     while ((__n & 1) == 0) {
186       __n >>= 1;
187       __x = __oper(__x, __x);
188     }
189 
190     _Tp __result = __x;
191     __n >>= 1;
192     while (__n != 0) {
193       __x = __oper(__x, __x);
194       if ((__n & 1) != 0)
195         __result = __oper(__result, __x);
196       __n >>= 1;
197     }
198     return __result;
199   }
200 }
201 
202 template <class _Tp, class _Integer>
__power(_Tp __x,_Integer __n)203 inline _Tp __power(_Tp __x, _Integer __n)
204 {
205   return __power(__x, __n, multiplies<_Tp>());
206 }
207 
208 // Alias for the internal name __power.  Note that power is an extension,
209 // not part of the C++ standard.
210 
211 template <class _Tp, class _Integer, class _MonoidOperation>
power(_Tp __x,_Integer __n,_MonoidOperation __oper)212 inline _Tp power(_Tp __x, _Integer __n, _MonoidOperation __oper)
213 {
214   return __power(__x, __n, __oper);
215 }
216 
217 template <class _Tp, class _Integer>
power(_Tp __x,_Integer __n)218 inline _Tp power(_Tp __x, _Integer __n)
219 {
220   return __power(__x, __n);
221 }
222 
223 // iota is not part of the C++ standard.  It is an extension.
224 
225 template <class _ForwardIterator, class _Tp>
226 void
iota(_ForwardIterator __first,_ForwardIterator __last,_Tp __value)227 iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value)
228 {
229   while (__first != __last)
230     *__first++ = __value++;
231 }
232 
233 __STL_END_NAMESPACE
234 
235 #endif /* __SGI_STL_INTERNAL_NUMERIC_H */
236 
237 // Local Variables:
238 // mode:C++
239 // End:
240