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