100db7afdSDavid E. O'Brien // Numeric functions implementation -*- C++ -*-
200db7afdSDavid E. O'Brien
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2001, 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,1997
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_numeric.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 _STL_NUMERIC_H
62ffeaf689SAlexander Kabaev #define _STL_NUMERIC_H 1
63ffeaf689SAlexander Kabaev
64ffeaf689SAlexander Kabaev #include <debug/debug.h>
6500db7afdSDavid E. O'Brien
_GLIBCXX_BEGIN_NAMESPACE(std)66*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
6700db7afdSDavid E. O'Brien
68ffeaf689SAlexander Kabaev /**
69ffeaf689SAlexander Kabaev * @brief Accumulate values in a range.
70ffeaf689SAlexander Kabaev *
71ffeaf689SAlexander Kabaev * Accumulates the values in the range [first,last) using operator+(). The
72ffeaf689SAlexander Kabaev * initial value is @a init. The values are processed in order.
73ffeaf689SAlexander Kabaev *
74ffeaf689SAlexander Kabaev * @param first Start of range.
75ffeaf689SAlexander Kabaev * @param last End of range.
76ffeaf689SAlexander Kabaev * @param init Starting value to add other values to.
77ffeaf689SAlexander Kabaev * @return The final sum.
78ffeaf689SAlexander Kabaev */
7900db7afdSDavid E. O'Brien template<typename _InputIterator, typename _Tp>
8000db7afdSDavid E. O'Brien _Tp
8100db7afdSDavid E. O'Brien accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
8200db7afdSDavid E. O'Brien {
8300db7afdSDavid E. O'Brien // concept requirements
84ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
85ffeaf689SAlexander Kabaev __glibcxx_requires_valid_range(__first, __last);
8600db7afdSDavid E. O'Brien
8700db7afdSDavid E. O'Brien for (; __first != __last; ++__first)
8800db7afdSDavid E. O'Brien __init = __init + *__first;
8900db7afdSDavid E. O'Brien return __init;
9000db7afdSDavid E. O'Brien }
9100db7afdSDavid E. O'Brien
92ffeaf689SAlexander Kabaev /**
93ffeaf689SAlexander Kabaev * @brief Accumulate values in a range with operation.
94ffeaf689SAlexander Kabaev *
95ffeaf689SAlexander Kabaev * Accumulates the values in the range [first,last) using the function
96ffeaf689SAlexander Kabaev * object @a binary_op. The initial value is @a init. The values are
97ffeaf689SAlexander Kabaev * processed in order.
98ffeaf689SAlexander Kabaev *
99ffeaf689SAlexander Kabaev * @param first Start of range.
100ffeaf689SAlexander Kabaev * @param last End of range.
101ffeaf689SAlexander Kabaev * @param init Starting value to add other values to.
102ffeaf689SAlexander Kabaev * @param binary_op Function object to accumulate with.
103ffeaf689SAlexander Kabaev * @return The final sum.
104ffeaf689SAlexander Kabaev */
10500db7afdSDavid E. O'Brien template<typename _InputIterator, typename _Tp, typename _BinaryOperation>
10600db7afdSDavid E. O'Brien _Tp
accumulate(_InputIterator __first,_InputIterator __last,_Tp __init,_BinaryOperation __binary_op)10700db7afdSDavid E. O'Brien accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
10800db7afdSDavid E. O'Brien _BinaryOperation __binary_op)
10900db7afdSDavid E. O'Brien {
11000db7afdSDavid E. O'Brien // concept requirements
111ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
112ffeaf689SAlexander Kabaev __glibcxx_requires_valid_range(__first, __last);
11300db7afdSDavid E. O'Brien
11400db7afdSDavid E. O'Brien for (; __first != __last; ++__first)
11500db7afdSDavid E. O'Brien __init = __binary_op(__init, *__first);
11600db7afdSDavid E. O'Brien return __init;
11700db7afdSDavid E. O'Brien }
11800db7afdSDavid E. O'Brien
119ffeaf689SAlexander Kabaev /**
120ffeaf689SAlexander Kabaev * @brief Compute inner product of two ranges.
121ffeaf689SAlexander Kabaev *
122ffeaf689SAlexander Kabaev * Starting with an initial value of @a init, multiplies successive
123ffeaf689SAlexander Kabaev * elements from the two ranges and adds each product into the accumulated
124ffeaf689SAlexander Kabaev * value using operator+(). The values in the ranges are processed in
125ffeaf689SAlexander Kabaev * order.
126ffeaf689SAlexander Kabaev *
127ffeaf689SAlexander Kabaev * @param first1 Start of range 1.
128ffeaf689SAlexander Kabaev * @param last1 End of range 1.
129ffeaf689SAlexander Kabaev * @param first2 Start of range 2.
130ffeaf689SAlexander Kabaev * @param init Starting value to add other values to.
131ffeaf689SAlexander Kabaev * @return The final inner product.
132ffeaf689SAlexander Kabaev */
13300db7afdSDavid E. O'Brien template<typename _InputIterator1, typename _InputIterator2, typename _Tp>
13400db7afdSDavid E. O'Brien _Tp
inner_product(_InputIterator1 __first1,_InputIterator1 __last1,_InputIterator2 __first2,_Tp __init)13500db7afdSDavid E. O'Brien inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
13600db7afdSDavid E. O'Brien _InputIterator2 __first2, _Tp __init)
13700db7afdSDavid E. O'Brien {
13800db7afdSDavid E. O'Brien // concept requirements
139ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
140ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
141ffeaf689SAlexander Kabaev __glibcxx_requires_valid_range(__first1, __last1);
14200db7afdSDavid E. O'Brien
14300db7afdSDavid E. O'Brien for (; __first1 != __last1; ++__first1, ++__first2)
14400db7afdSDavid E. O'Brien __init = __init + (*__first1 * *__first2);
14500db7afdSDavid E. O'Brien return __init;
14600db7afdSDavid E. O'Brien }
14700db7afdSDavid E. O'Brien
148ffeaf689SAlexander Kabaev /**
149ffeaf689SAlexander Kabaev * @brief Compute inner product of two ranges.
150ffeaf689SAlexander Kabaev *
151ffeaf689SAlexander Kabaev * Starting with an initial value of @a init, applies @a binary_op2 to
152ffeaf689SAlexander Kabaev * successive elements from the two ranges and accumulates each result into
153ffeaf689SAlexander Kabaev * the accumulated value using @a binary_op1. The values in the ranges are
154ffeaf689SAlexander Kabaev * processed in order.
155ffeaf689SAlexander Kabaev *
156ffeaf689SAlexander Kabaev * @param first1 Start of range 1.
157ffeaf689SAlexander Kabaev * @param last1 End of range 1.
158ffeaf689SAlexander Kabaev * @param first2 Start of range 2.
159ffeaf689SAlexander Kabaev * @param init Starting value to add other values to.
160ffeaf689SAlexander Kabaev * @param binary_op1 Function object to accumulate with.
161ffeaf689SAlexander Kabaev * @param binary_op2 Function object to apply to pairs of input values.
162ffeaf689SAlexander Kabaev * @return The final inner product.
163ffeaf689SAlexander Kabaev */
16400db7afdSDavid E. O'Brien template<typename _InputIterator1, typename _InputIterator2, typename _Tp,
16500db7afdSDavid E. O'Brien typename _BinaryOperation1, typename _BinaryOperation2>
16600db7afdSDavid E. O'Brien _Tp
inner_product(_InputIterator1 __first1,_InputIterator1 __last1,_InputIterator2 __first2,_Tp __init,_BinaryOperation1 __binary_op1,_BinaryOperation2 __binary_op2)16700db7afdSDavid E. O'Brien inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
16800db7afdSDavid E. O'Brien _InputIterator2 __first2, _Tp __init,
16900db7afdSDavid E. O'Brien _BinaryOperation1 __binary_op1,
17000db7afdSDavid E. O'Brien _BinaryOperation2 __binary_op2)
17100db7afdSDavid E. O'Brien {
17200db7afdSDavid E. O'Brien // concept requirements
173ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
174ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
175ffeaf689SAlexander Kabaev __glibcxx_requires_valid_range(__first1, __last1);
17600db7afdSDavid E. O'Brien
17700db7afdSDavid E. O'Brien for (; __first1 != __last1; ++__first1, ++__first2)
17800db7afdSDavid E. O'Brien __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
17900db7afdSDavid E. O'Brien return __init;
18000db7afdSDavid E. O'Brien }
18100db7afdSDavid E. O'Brien
182ffeaf689SAlexander Kabaev /**
183ffeaf689SAlexander Kabaev * @brief Return list of partial sums
184ffeaf689SAlexander Kabaev *
185ffeaf689SAlexander Kabaev * Accumulates the values in the range [first,last) using operator+().
186ffeaf689SAlexander Kabaev * As each successive input value is added into the total, that partial sum
187ffeaf689SAlexander Kabaev * is written to @a result. Therefore, the first value in result is the
188ffeaf689SAlexander Kabaev * first value of the input, the second value in result is the sum of the
189ffeaf689SAlexander Kabaev * first and second input values, and so on.
190ffeaf689SAlexander Kabaev *
191ffeaf689SAlexander Kabaev * @param first Start of input range.
192ffeaf689SAlexander Kabaev * @param last End of input range.
193ffeaf689SAlexander Kabaev * @param result Output to write sums to.
194ffeaf689SAlexander Kabaev * @return Iterator pointing just beyond the values written to result.
195ffeaf689SAlexander Kabaev */
19600db7afdSDavid E. O'Brien template<typename _InputIterator, typename _OutputIterator>
19700db7afdSDavid E. O'Brien _OutputIterator
partial_sum(_InputIterator __first,_InputIterator __last,_OutputIterator __result)19800db7afdSDavid E. O'Brien partial_sum(_InputIterator __first, _InputIterator __last,
19900db7afdSDavid E. O'Brien _OutputIterator __result)
20000db7afdSDavid E. O'Brien {
20100db7afdSDavid E. O'Brien typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
20200db7afdSDavid E. O'Brien
20300db7afdSDavid E. O'Brien // concept requirements
204ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
205*f8a1b7d9SAlexander Kabaev __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
206*f8a1b7d9SAlexander Kabaev _ValueType>)
207ffeaf689SAlexander Kabaev __glibcxx_requires_valid_range(__first, __last);
20800db7afdSDavid E. O'Brien
209*f8a1b7d9SAlexander Kabaev if (__first == __last)
210*f8a1b7d9SAlexander Kabaev return __result;
21100db7afdSDavid E. O'Brien _ValueType __value = *__first;
212*f8a1b7d9SAlexander Kabaev *__result = __value;
213*f8a1b7d9SAlexander Kabaev while (++__first != __last)
214*f8a1b7d9SAlexander Kabaev {
21500db7afdSDavid E. O'Brien __value = __value + *__first;
21600db7afdSDavid E. O'Brien *++__result = __value;
21700db7afdSDavid E. O'Brien }
21800db7afdSDavid E. O'Brien return ++__result;
21900db7afdSDavid E. O'Brien }
22000db7afdSDavid E. O'Brien
221ffeaf689SAlexander Kabaev /**
222ffeaf689SAlexander Kabaev * @brief Return list of partial sums
223ffeaf689SAlexander Kabaev *
224ffeaf689SAlexander Kabaev * Accumulates the values in the range [first,last) using operator+().
225ffeaf689SAlexander Kabaev * As each successive input value is added into the total, that partial sum
226ffeaf689SAlexander Kabaev * is written to @a result. Therefore, the first value in result is the
227ffeaf689SAlexander Kabaev * first value of the input, the second value in result is the sum of the
228ffeaf689SAlexander Kabaev * first and second input values, and so on.
229ffeaf689SAlexander Kabaev *
230ffeaf689SAlexander Kabaev * @param first Start of input range.
231ffeaf689SAlexander Kabaev * @param last End of input range.
232ffeaf689SAlexander Kabaev * @param result Output to write sums to.
233ffeaf689SAlexander Kabaev * @return Iterator pointing just beyond the values written to result.
234ffeaf689SAlexander Kabaev */
235*f8a1b7d9SAlexander Kabaev template<typename _InputIterator, typename _OutputIterator,
236*f8a1b7d9SAlexander Kabaev typename _BinaryOperation>
23700db7afdSDavid E. O'Brien _OutputIterator
partial_sum(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_BinaryOperation __binary_op)23800db7afdSDavid E. O'Brien partial_sum(_InputIterator __first, _InputIterator __last,
23900db7afdSDavid E. O'Brien _OutputIterator __result, _BinaryOperation __binary_op)
24000db7afdSDavid E. O'Brien {
24100db7afdSDavid E. O'Brien typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
24200db7afdSDavid E. O'Brien
24300db7afdSDavid E. O'Brien // concept requirements
244ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
245*f8a1b7d9SAlexander Kabaev __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
246*f8a1b7d9SAlexander Kabaev _ValueType>)
247ffeaf689SAlexander Kabaev __glibcxx_requires_valid_range(__first, __last);
24800db7afdSDavid E. O'Brien
249*f8a1b7d9SAlexander Kabaev if (__first == __last)
250*f8a1b7d9SAlexander Kabaev return __result;
25100db7afdSDavid E. O'Brien _ValueType __value = *__first;
252*f8a1b7d9SAlexander Kabaev *__result = __value;
253*f8a1b7d9SAlexander Kabaev while (++__first != __last)
254*f8a1b7d9SAlexander Kabaev {
25500db7afdSDavid E. O'Brien __value = __binary_op(__value, *__first);
25600db7afdSDavid E. O'Brien *++__result = __value;
25700db7afdSDavid E. O'Brien }
25800db7afdSDavid E. O'Brien return ++__result;
25900db7afdSDavid E. O'Brien }
26000db7afdSDavid E. O'Brien
261ffeaf689SAlexander Kabaev /**
262ffeaf689SAlexander Kabaev * @brief Return differences between adjacent values.
263ffeaf689SAlexander Kabaev *
264ffeaf689SAlexander Kabaev * Computes the difference between adjacent values in the range
265ffeaf689SAlexander Kabaev * [first,last) using operator-() and writes the result to @a result.
266ffeaf689SAlexander Kabaev *
267ffeaf689SAlexander Kabaev * @param first Start of input range.
268ffeaf689SAlexander Kabaev * @param last End of input range.
269ffeaf689SAlexander Kabaev * @param result Output to write sums to.
270ffeaf689SAlexander Kabaev * @return Iterator pointing just beyond the values written to result.
271ffeaf689SAlexander Kabaev */
27200db7afdSDavid E. O'Brien template<typename _InputIterator, typename _OutputIterator>
27300db7afdSDavid E. O'Brien _OutputIterator
adjacent_difference(_InputIterator __first,_InputIterator __last,_OutputIterator __result)27400db7afdSDavid E. O'Brien adjacent_difference(_InputIterator __first,
27500db7afdSDavid E. O'Brien _InputIterator __last, _OutputIterator __result)
27600db7afdSDavid E. O'Brien {
27700db7afdSDavid E. O'Brien typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
27800db7afdSDavid E. O'Brien
27900db7afdSDavid E. O'Brien // concept requirements
280ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
281*f8a1b7d9SAlexander Kabaev __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
282*f8a1b7d9SAlexander Kabaev _ValueType>)
283ffeaf689SAlexander Kabaev __glibcxx_requires_valid_range(__first, __last);
28400db7afdSDavid E. O'Brien
285*f8a1b7d9SAlexander Kabaev if (__first == __last)
286*f8a1b7d9SAlexander Kabaev return __result;
28700db7afdSDavid E. O'Brien _ValueType __value = *__first;
288*f8a1b7d9SAlexander Kabaev *__result = __value;
289*f8a1b7d9SAlexander Kabaev while (++__first != __last)
290*f8a1b7d9SAlexander Kabaev {
29100db7afdSDavid E. O'Brien _ValueType __tmp = *__first;
29200db7afdSDavid E. O'Brien *++__result = __tmp - __value;
29300db7afdSDavid E. O'Brien __value = __tmp;
29400db7afdSDavid E. O'Brien }
29500db7afdSDavid E. O'Brien return ++__result;
29600db7afdSDavid E. O'Brien }
29700db7afdSDavid E. O'Brien
298ffeaf689SAlexander Kabaev /**
299ffeaf689SAlexander Kabaev * @brief Return differences between adjacent values.
300ffeaf689SAlexander Kabaev *
301ffeaf689SAlexander Kabaev * Computes the difference between adjacent values in the range
302ffeaf689SAlexander Kabaev * [first,last) using the function object @a binary_op and writes the
303ffeaf689SAlexander Kabaev * result to @a result.
304ffeaf689SAlexander Kabaev *
305ffeaf689SAlexander Kabaev * @param first Start of input range.
306ffeaf689SAlexander Kabaev * @param last End of input range.
307ffeaf689SAlexander Kabaev * @param result Output to write sums to.
308ffeaf689SAlexander Kabaev * @return Iterator pointing just beyond the values written to result.
309ffeaf689SAlexander Kabaev */
310*f8a1b7d9SAlexander Kabaev template<typename _InputIterator, typename _OutputIterator,
311*f8a1b7d9SAlexander Kabaev typename _BinaryOperation>
31200db7afdSDavid E. O'Brien _OutputIterator
adjacent_difference(_InputIterator __first,_InputIterator __last,_OutputIterator __result,_BinaryOperation __binary_op)31300db7afdSDavid E. O'Brien adjacent_difference(_InputIterator __first, _InputIterator __last,
31400db7afdSDavid E. O'Brien _OutputIterator __result, _BinaryOperation __binary_op)
31500db7afdSDavid E. O'Brien {
31600db7afdSDavid E. O'Brien typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
31700db7afdSDavid E. O'Brien
31800db7afdSDavid E. O'Brien // concept requirements
319ffeaf689SAlexander Kabaev __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
320*f8a1b7d9SAlexander Kabaev __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
321*f8a1b7d9SAlexander Kabaev _ValueType>)
322ffeaf689SAlexander Kabaev __glibcxx_requires_valid_range(__first, __last);
32300db7afdSDavid E. O'Brien
324*f8a1b7d9SAlexander Kabaev if (__first == __last)
325*f8a1b7d9SAlexander Kabaev return __result;
32600db7afdSDavid E. O'Brien _ValueType __value = *__first;
327*f8a1b7d9SAlexander Kabaev *__result = __value;
328*f8a1b7d9SAlexander Kabaev while (++__first != __last)
329*f8a1b7d9SAlexander Kabaev {
33000db7afdSDavid E. O'Brien _ValueType __tmp = *__first;
33100db7afdSDavid E. O'Brien *++__result = __binary_op(__tmp, __value);
33200db7afdSDavid E. O'Brien __value = __tmp;
33300db7afdSDavid E. O'Brien }
33400db7afdSDavid E. O'Brien return ++__result;
33500db7afdSDavid E. O'Brien }
33600db7afdSDavid E. O'Brien
337*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
33800db7afdSDavid E. O'Brien
339ffeaf689SAlexander Kabaev #endif /* _STL_NUMERIC_H */
340