xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/bits/stl_numeric.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg // Numeric functions implementation -*- C++ -*-
21debfc3dSmrg 
3*8feb0f0bSmrg // Copyright (C) 2001-2020 Free Software Foundation, Inc.
41debfc3dSmrg //
51debfc3dSmrg // This file is part of the GNU ISO C++ Library.  This library is free
61debfc3dSmrg // software; you can redistribute it and/or modify it under the
71debfc3dSmrg // terms of the GNU General Public License as published by the
81debfc3dSmrg // Free Software Foundation; either version 3, or (at your option)
91debfc3dSmrg // any later version.
101debfc3dSmrg 
111debfc3dSmrg // This library is distributed in the hope that it will be useful,
121debfc3dSmrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
131debfc3dSmrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141debfc3dSmrg // GNU General Public License for more details.
151debfc3dSmrg 
161debfc3dSmrg // Under Section 7 of GPL version 3, you are granted additional
171debfc3dSmrg // permissions described in the GCC Runtime Library Exception, version
181debfc3dSmrg // 3.1, as published by the Free Software Foundation.
191debfc3dSmrg 
201debfc3dSmrg // You should have received a copy of the GNU General Public License and
211debfc3dSmrg // a copy of the GCC Runtime Library Exception along with this program;
221debfc3dSmrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
231debfc3dSmrg // <http://www.gnu.org/licenses/>.
241debfc3dSmrg 
251debfc3dSmrg /*
261debfc3dSmrg  *
271debfc3dSmrg  * Copyright (c) 1994
281debfc3dSmrg  * Hewlett-Packard Company
291debfc3dSmrg  *
301debfc3dSmrg  * Permission to use, copy, modify, distribute and sell this software
311debfc3dSmrg  * and its documentation for any purpose is hereby granted without fee,
321debfc3dSmrg  * provided that the above copyright notice appear in all copies and
331debfc3dSmrg  * that both that copyright notice and this permission notice appear
341debfc3dSmrg  * in supporting documentation.  Hewlett-Packard Company makes no
351debfc3dSmrg  * representations about the suitability of this software for any
361debfc3dSmrg  * purpose.  It is provided "as is" without express or implied warranty.
371debfc3dSmrg  *
381debfc3dSmrg  *
391debfc3dSmrg  * Copyright (c) 1996,1997
401debfc3dSmrg  * Silicon Graphics Computer Systems, Inc.
411debfc3dSmrg  *
421debfc3dSmrg  * Permission to use, copy, modify, distribute and sell this software
431debfc3dSmrg  * and its documentation for any purpose is hereby granted without fee,
441debfc3dSmrg  * provided that the above copyright notice appear in all copies and
451debfc3dSmrg  * that both that copyright notice and this permission notice appear
461debfc3dSmrg  * in supporting documentation.  Silicon Graphics makes no
471debfc3dSmrg  * representations about the suitability of this software for any
481debfc3dSmrg  * purpose.  It is provided "as is" without express or implied warranty.
491debfc3dSmrg  */
501debfc3dSmrg 
511debfc3dSmrg /** @file bits/stl_numeric.h
521debfc3dSmrg  *  This is an internal header file, included by other library headers.
531debfc3dSmrg  *  Do not attempt to use it directly. @headername{numeric}
541debfc3dSmrg  */
551debfc3dSmrg 
561debfc3dSmrg #ifndef _STL_NUMERIC_H
571debfc3dSmrg #define _STL_NUMERIC_H 1
581debfc3dSmrg 
591debfc3dSmrg #include <bits/concept_check.h>
601debfc3dSmrg #include <debug/debug.h>
611debfc3dSmrg #include <bits/move.h> // For _GLIBCXX_MOVE
621debfc3dSmrg 
631debfc3dSmrg 
_GLIBCXX_VISIBILITY(default)641debfc3dSmrg namespace std _GLIBCXX_VISIBILITY(default)
651debfc3dSmrg {
661debfc3dSmrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
671debfc3dSmrg 
68c0a68be4Smrg   /** @defgroup numeric_ops Generalized Numeric operations
69c0a68be4Smrg    *  @ingroup algorithms
70c0a68be4Smrg    */
71c0a68be4Smrg 
72c0a68be4Smrg #if __cplusplus >= 201103L
731debfc3dSmrg   /**
741debfc3dSmrg    *  @brief  Create a range of sequentially increasing values.
751debfc3dSmrg    *
761debfc3dSmrg    *  For each element in the range @p [first,last) assigns @p value and
771debfc3dSmrg    *  increments @p value as if by @p ++value.
781debfc3dSmrg    *
791debfc3dSmrg    *  @param  __first  Start of range.
801debfc3dSmrg    *  @param  __last  End of range.
811debfc3dSmrg    *  @param  __value  Starting value.
821debfc3dSmrg    *  @return  Nothing.
83c0a68be4Smrg    *  @ingroup numeric_ops
841debfc3dSmrg    */
851debfc3dSmrg   template<typename _ForwardIterator, typename _Tp>
86*8feb0f0bSmrg     _GLIBCXX20_CONSTEXPR
871debfc3dSmrg     void
881debfc3dSmrg     iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value)
891debfc3dSmrg     {
901debfc3dSmrg       // concept requirements
911debfc3dSmrg       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
921debfc3dSmrg 				  _ForwardIterator>)
931debfc3dSmrg       __glibcxx_function_requires(_ConvertibleConcept<_Tp,
941debfc3dSmrg 	    typename iterator_traits<_ForwardIterator>::value_type>)
951debfc3dSmrg       __glibcxx_requires_valid_range(__first, __last);
961debfc3dSmrg 
971debfc3dSmrg       for (; __first != __last; ++__first)
981debfc3dSmrg 	{
991debfc3dSmrg 	  *__first = __value;
1001debfc3dSmrg 	  ++__value;
1011debfc3dSmrg 	}
1021debfc3dSmrg     }
1031debfc3dSmrg #endif
1041debfc3dSmrg 
105c0a68be4Smrg _GLIBCXX_END_NAMESPACE_VERSION
106c0a68be4Smrg 
1071debfc3dSmrg _GLIBCXX_BEGIN_NAMESPACE_ALGO
1081debfc3dSmrg 
109c0a68be4Smrg #if __cplusplus > 201703L
110c0a68be4Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS
111c0a68be4Smrg // DR 2055. std::move in std::accumulate and other algorithms
112c0a68be4Smrg # define _GLIBCXX_MOVE_IF_20(_E) std::move(_E)
113c0a68be4Smrg #else
114c0a68be4Smrg # define _GLIBCXX_MOVE_IF_20(_E) _E
115c0a68be4Smrg #endif
116c0a68be4Smrg 
117c0a68be4Smrg   /// @addtogroup numeric_ops
118c0a68be4Smrg   /// @{
119c0a68be4Smrg 
1201debfc3dSmrg   /**
1211debfc3dSmrg    *  @brief  Accumulate values in a range.
1221debfc3dSmrg    *
1231debfc3dSmrg    *  Accumulates the values in the range [first,last) using operator+().  The
1241debfc3dSmrg    *  initial value is @a init.  The values are processed in order.
1251debfc3dSmrg    *
1261debfc3dSmrg    *  @param  __first  Start of range.
1271debfc3dSmrg    *  @param  __last  End of range.
1281debfc3dSmrg    *  @param  __init  Starting value to add other values to.
1291debfc3dSmrg    *  @return  The final sum.
1301debfc3dSmrg    */
1311debfc3dSmrg   template<typename _InputIterator, typename _Tp>
132*8feb0f0bSmrg     _GLIBCXX20_CONSTEXPR
1331debfc3dSmrg     inline _Tp
1341debfc3dSmrg     accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
1351debfc3dSmrg     {
1361debfc3dSmrg       // concept requirements
1371debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1381debfc3dSmrg       __glibcxx_requires_valid_range(__first, __last);
1391debfc3dSmrg 
1401debfc3dSmrg       for (; __first != __last; ++__first)
141c0a68be4Smrg 	__init = _GLIBCXX_MOVE_IF_20(__init) + *__first;
1421debfc3dSmrg       return __init;
1431debfc3dSmrg     }
1441debfc3dSmrg 
1451debfc3dSmrg   /**
1461debfc3dSmrg    *  @brief  Accumulate values in a range with operation.
1471debfc3dSmrg    *
148c0a68be4Smrg    *  Accumulates the values in the range `[first,last)` using the function
149c0a68be4Smrg    *  object `__binary_op`.  The initial value is `__init`.  The values are
1501debfc3dSmrg    *  processed in order.
1511debfc3dSmrg    *
1521debfc3dSmrg    *  @param  __first  Start of range.
1531debfc3dSmrg    *  @param  __last  End of range.
1541debfc3dSmrg    *  @param  __init  Starting value to add other values to.
1551debfc3dSmrg    *  @param  __binary_op  Function object to accumulate with.
1561debfc3dSmrg    *  @return  The final sum.
1571debfc3dSmrg    */
1581debfc3dSmrg   template<typename _InputIterator, typename _Tp, typename _BinaryOperation>
159*8feb0f0bSmrg     _GLIBCXX20_CONSTEXPR
1601debfc3dSmrg     inline _Tp
1611debfc3dSmrg     accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
1621debfc3dSmrg 	       _BinaryOperation __binary_op)
1631debfc3dSmrg     {
1641debfc3dSmrg       // concept requirements
1651debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1661debfc3dSmrg       __glibcxx_requires_valid_range(__first, __last);
1671debfc3dSmrg 
1681debfc3dSmrg       for (; __first != __last; ++__first)
169c0a68be4Smrg 	__init = __binary_op(_GLIBCXX_MOVE_IF_20(__init), *__first);
1701debfc3dSmrg       return __init;
1711debfc3dSmrg     }
1721debfc3dSmrg 
1731debfc3dSmrg   /**
1741debfc3dSmrg    *  @brief  Compute inner product of two ranges.
1751debfc3dSmrg    *
1761debfc3dSmrg    *  Starting with an initial value of @p __init, multiplies successive
1771debfc3dSmrg    *  elements from the two ranges and adds each product into the accumulated
1781debfc3dSmrg    *  value using operator+().  The values in the ranges are processed in
1791debfc3dSmrg    *  order.
1801debfc3dSmrg    *
1811debfc3dSmrg    *  @param  __first1  Start of range 1.
1821debfc3dSmrg    *  @param  __last1  End of range 1.
1831debfc3dSmrg    *  @param  __first2  Start of range 2.
1841debfc3dSmrg    *  @param  __init  Starting value to add other values to.
1851debfc3dSmrg    *  @return  The final inner product.
1861debfc3dSmrg    */
1871debfc3dSmrg   template<typename _InputIterator1, typename _InputIterator2, typename _Tp>
188*8feb0f0bSmrg     _GLIBCXX20_CONSTEXPR
1891debfc3dSmrg     inline _Tp
1901debfc3dSmrg     inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
1911debfc3dSmrg 		  _InputIterator2 __first2, _Tp __init)
1921debfc3dSmrg     {
1931debfc3dSmrg       // concept requirements
1941debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
1951debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
1961debfc3dSmrg       __glibcxx_requires_valid_range(__first1, __last1);
1971debfc3dSmrg 
1981debfc3dSmrg       for (; __first1 != __last1; ++__first1, (void)++__first2)
199c0a68be4Smrg 	__init = _GLIBCXX_MOVE_IF_20(__init) + (*__first1 * *__first2);
2001debfc3dSmrg       return __init;
2011debfc3dSmrg     }
2021debfc3dSmrg 
2031debfc3dSmrg   /**
2041debfc3dSmrg    *  @brief  Compute inner product of two ranges.
2051debfc3dSmrg    *
2061debfc3dSmrg    *  Starting with an initial value of @p __init, applies @p __binary_op2 to
2071debfc3dSmrg    *  successive elements from the two ranges and accumulates each result into
2081debfc3dSmrg    *  the accumulated value using @p __binary_op1.  The values in the ranges are
2091debfc3dSmrg    *  processed in order.
2101debfc3dSmrg    *
2111debfc3dSmrg    *  @param  __first1  Start of range 1.
2121debfc3dSmrg    *  @param  __last1  End of range 1.
2131debfc3dSmrg    *  @param  __first2  Start of range 2.
2141debfc3dSmrg    *  @param  __init  Starting value to add other values to.
2151debfc3dSmrg    *  @param  __binary_op1  Function object to accumulate with.
2161debfc3dSmrg    *  @param  __binary_op2  Function object to apply to pairs of input values.
2171debfc3dSmrg    *  @return  The final inner product.
2181debfc3dSmrg    */
2191debfc3dSmrg   template<typename _InputIterator1, typename _InputIterator2, typename _Tp,
2201debfc3dSmrg 	   typename _BinaryOperation1, typename _BinaryOperation2>
221*8feb0f0bSmrg     _GLIBCXX20_CONSTEXPR
2221debfc3dSmrg     inline _Tp
2231debfc3dSmrg     inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
2241debfc3dSmrg 		  _InputIterator2 __first2, _Tp __init,
2251debfc3dSmrg 		  _BinaryOperation1 __binary_op1,
2261debfc3dSmrg 		  _BinaryOperation2 __binary_op2)
2271debfc3dSmrg     {
2281debfc3dSmrg       // concept requirements
2291debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2301debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2311debfc3dSmrg       __glibcxx_requires_valid_range(__first1, __last1);
2321debfc3dSmrg 
2331debfc3dSmrg       for (; __first1 != __last1; ++__first1, (void)++__first2)
234c0a68be4Smrg 	__init = __binary_op1(_GLIBCXX_MOVE_IF_20(__init),
235c0a68be4Smrg 			      __binary_op2(*__first1, *__first2));
2361debfc3dSmrg       return __init;
2371debfc3dSmrg     }
2381debfc3dSmrg 
2391debfc3dSmrg   /**
2401debfc3dSmrg    *  @brief  Return list of partial sums
2411debfc3dSmrg    *
2421debfc3dSmrg    *  Accumulates the values in the range [first,last) using the @c + operator.
2431debfc3dSmrg    *  As each successive input value is added into the total, that partial sum
2441debfc3dSmrg    *  is written to @p __result.  Therefore, the first value in @p __result is
2451debfc3dSmrg    *  the first value of the input, the second value in @p __result is the sum
2461debfc3dSmrg    *  of the first and second input values, and so on.
2471debfc3dSmrg    *
2481debfc3dSmrg    *  @param  __first  Start of input range.
2491debfc3dSmrg    *  @param  __last  End of input range.
2501debfc3dSmrg    *  @param  __result  Output sum.
2511debfc3dSmrg    *  @return  Iterator pointing just beyond the values written to __result.
2521debfc3dSmrg    */
2531debfc3dSmrg   template<typename _InputIterator, typename _OutputIterator>
254*8feb0f0bSmrg     _GLIBCXX20_CONSTEXPR
2551debfc3dSmrg     _OutputIterator
2561debfc3dSmrg     partial_sum(_InputIterator __first, _InputIterator __last,
2571debfc3dSmrg 		_OutputIterator __result)
2581debfc3dSmrg     {
2591debfc3dSmrg       typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
2601debfc3dSmrg 
2611debfc3dSmrg       // concept requirements
2621debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
2631debfc3dSmrg       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
2641debfc3dSmrg 				                         _ValueType>)
2651debfc3dSmrg       __glibcxx_requires_valid_range(__first, __last);
2661debfc3dSmrg 
2671debfc3dSmrg       if (__first == __last)
2681debfc3dSmrg 	return __result;
2691debfc3dSmrg       _ValueType __value = *__first;
2701debfc3dSmrg       *__result = __value;
2711debfc3dSmrg       while (++__first != __last)
2721debfc3dSmrg 	{
273c0a68be4Smrg 	  __value = _GLIBCXX_MOVE_IF_20(__value) + *__first;
2741debfc3dSmrg 	  *++__result = __value;
2751debfc3dSmrg 	}
2761debfc3dSmrg       return ++__result;
2771debfc3dSmrg     }
2781debfc3dSmrg 
2791debfc3dSmrg   /**
2801debfc3dSmrg    *  @brief  Return list of partial sums
2811debfc3dSmrg    *
2821debfc3dSmrg    *  Accumulates the values in the range [first,last) using @p __binary_op.
2831debfc3dSmrg    *  As each successive input value is added into the total, that partial sum
2841debfc3dSmrg    *  is written to @p __result.  Therefore, the first value in @p __result is
2851debfc3dSmrg    *  the first value of the input, the second value in @p __result is the sum
2861debfc3dSmrg    *  of the first and second input values, and so on.
2871debfc3dSmrg    *
2881debfc3dSmrg    *  @param  __first  Start of input range.
2891debfc3dSmrg    *  @param  __last  End of input range.
2901debfc3dSmrg    *  @param  __result  Output sum.
2911debfc3dSmrg    *  @param  __binary_op  Function object.
2921debfc3dSmrg    *  @return  Iterator pointing just beyond the values written to __result.
2931debfc3dSmrg    */
2941debfc3dSmrg   template<typename _InputIterator, typename _OutputIterator,
2951debfc3dSmrg 	   typename _BinaryOperation>
296*8feb0f0bSmrg     _GLIBCXX20_CONSTEXPR
2971debfc3dSmrg     _OutputIterator
2981debfc3dSmrg     partial_sum(_InputIterator __first, _InputIterator __last,
2991debfc3dSmrg 		_OutputIterator __result, _BinaryOperation __binary_op)
3001debfc3dSmrg     {
3011debfc3dSmrg       typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
3021debfc3dSmrg 
3031debfc3dSmrg       // concept requirements
3041debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3051debfc3dSmrg       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3061debfc3dSmrg 				                         _ValueType>)
3071debfc3dSmrg       __glibcxx_requires_valid_range(__first, __last);
3081debfc3dSmrg 
3091debfc3dSmrg       if (__first == __last)
3101debfc3dSmrg 	return __result;
3111debfc3dSmrg       _ValueType __value = *__first;
3121debfc3dSmrg       *__result = __value;
3131debfc3dSmrg       while (++__first != __last)
3141debfc3dSmrg 	{
315c0a68be4Smrg 	  __value = __binary_op(_GLIBCXX_MOVE_IF_20(__value), *__first);
3161debfc3dSmrg 	  *++__result = __value;
3171debfc3dSmrg 	}
3181debfc3dSmrg       return ++__result;
3191debfc3dSmrg     }
3201debfc3dSmrg 
3211debfc3dSmrg   /**
3221debfc3dSmrg    *  @brief  Return differences between adjacent values.
3231debfc3dSmrg    *
3241debfc3dSmrg    *  Computes the difference between adjacent values in the range
3251debfc3dSmrg    *  [first,last) using operator-() and writes the result to @p __result.
3261debfc3dSmrg    *
3271debfc3dSmrg    *  @param  __first  Start of input range.
3281debfc3dSmrg    *  @param  __last  End of input range.
3291debfc3dSmrg    *  @param  __result  Output sums.
3301debfc3dSmrg    *  @return  Iterator pointing just beyond the values written to result.
3311debfc3dSmrg    *
3321debfc3dSmrg    *  _GLIBCXX_RESOLVE_LIB_DEFECTS
3331debfc3dSmrg    *  DR 539. partial_sum and adjacent_difference should mention requirements
3341debfc3dSmrg    */
3351debfc3dSmrg   template<typename _InputIterator, typename _OutputIterator>
336*8feb0f0bSmrg     _GLIBCXX20_CONSTEXPR
3371debfc3dSmrg     _OutputIterator
3381debfc3dSmrg     adjacent_difference(_InputIterator __first,
3391debfc3dSmrg 			_InputIterator __last, _OutputIterator __result)
3401debfc3dSmrg     {
3411debfc3dSmrg       typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
3421debfc3dSmrg 
3431debfc3dSmrg       // concept requirements
3441debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3451debfc3dSmrg       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3461debfc3dSmrg 				                         _ValueType>)
3471debfc3dSmrg       __glibcxx_requires_valid_range(__first, __last);
3481debfc3dSmrg 
3491debfc3dSmrg       if (__first == __last)
3501debfc3dSmrg 	return __result;
3511debfc3dSmrg       _ValueType __value = *__first;
3521debfc3dSmrg       *__result = __value;
3531debfc3dSmrg       while (++__first != __last)
3541debfc3dSmrg 	{
3551debfc3dSmrg 	  _ValueType __tmp = *__first;
356c0a68be4Smrg 	  *++__result = __tmp - _GLIBCXX_MOVE_IF_20(__value);
3571debfc3dSmrg 	  __value = _GLIBCXX_MOVE(__tmp);
3581debfc3dSmrg 	}
3591debfc3dSmrg       return ++__result;
3601debfc3dSmrg     }
3611debfc3dSmrg 
3621debfc3dSmrg   /**
3631debfc3dSmrg    *  @brief  Return differences between adjacent values.
3641debfc3dSmrg    *
3651debfc3dSmrg    *  Computes the difference between adjacent values in the range
3661debfc3dSmrg    *  [__first,__last) using the function object @p __binary_op and writes the
3671debfc3dSmrg    *  result to @p __result.
3681debfc3dSmrg    *
3691debfc3dSmrg    *  @param  __first  Start of input range.
3701debfc3dSmrg    *  @param  __last  End of input range.
3711debfc3dSmrg    *  @param  __result  Output sum.
3721debfc3dSmrg    *  @param  __binary_op Function object.
3731debfc3dSmrg    *  @return  Iterator pointing just beyond the values written to result.
3741debfc3dSmrg    *
3751debfc3dSmrg    *  _GLIBCXX_RESOLVE_LIB_DEFECTS
3761debfc3dSmrg    *  DR 539. partial_sum and adjacent_difference should mention requirements
3771debfc3dSmrg    */
3781debfc3dSmrg   template<typename _InputIterator, typename _OutputIterator,
3791debfc3dSmrg 	   typename _BinaryOperation>
380*8feb0f0bSmrg     _GLIBCXX20_CONSTEXPR
3811debfc3dSmrg     _OutputIterator
3821debfc3dSmrg     adjacent_difference(_InputIterator __first, _InputIterator __last,
3831debfc3dSmrg 			_OutputIterator __result, _BinaryOperation __binary_op)
3841debfc3dSmrg     {
3851debfc3dSmrg       typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
3861debfc3dSmrg 
3871debfc3dSmrg       // concept requirements
3881debfc3dSmrg       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3891debfc3dSmrg       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3901debfc3dSmrg 				                         _ValueType>)
3911debfc3dSmrg       __glibcxx_requires_valid_range(__first, __last);
3921debfc3dSmrg 
3931debfc3dSmrg       if (__first == __last)
3941debfc3dSmrg 	return __result;
3951debfc3dSmrg       _ValueType __value = *__first;
3961debfc3dSmrg       *__result = __value;
3971debfc3dSmrg       while (++__first != __last)
3981debfc3dSmrg 	{
3991debfc3dSmrg 	  _ValueType __tmp = *__first;
400c0a68be4Smrg 	  *++__result = __binary_op(__tmp, _GLIBCXX_MOVE_IF_20(__value));
4011debfc3dSmrg 	  __value = _GLIBCXX_MOVE(__tmp);
4021debfc3dSmrg 	}
4031debfc3dSmrg       return ++__result;
4041debfc3dSmrg     }
4051debfc3dSmrg 
406*8feb0f0bSmrg   /// @} group numeric_ops
407c0a68be4Smrg 
408c0a68be4Smrg #undef _GLIBCXX_MOVE_IF_20
409c0a68be4Smrg 
4101debfc3dSmrg _GLIBCXX_END_NAMESPACE_ALGO
4111debfc3dSmrg } // namespace std
4121debfc3dSmrg 
4131debfc3dSmrg #endif /* _STL_NUMERIC_H */
414