diff options
Diffstat (limited to 'libstdc++-v3/include/bits/stl_numeric.h')
-rw-r--r-- | libstdc++-v3/include/bits/stl_numeric.h | 63 |
1 files changed, 43 insertions, 20 deletions
diff --git a/libstdc++-v3/include/bits/stl_numeric.h b/libstdc++-v3/include/bits/stl_numeric.h index 0a084e5..8656e99 100644 --- a/libstdc++-v3/include/bits/stl_numeric.h +++ b/libstdc++-v3/include/bits/stl_numeric.h @@ -38,7 +38,9 @@ namespace std template <class _InputIterator, class _Tp> _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init) { - __STL_REQUIRES(_InputIterator, _InputIterator); + // concept requirements + glibcpp_function_requires(InputIteratorConcept<_InputIterator>); + for ( ; __first != __last; ++__first) __init = __init + *__first; return __init; @@ -48,7 +50,9 @@ template <class _InputIterator, class _Tp, class _BinaryOperation> _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op) { - __STL_REQUIRES(_InputIterator, _InputIterator); + // concept requirements + glibcpp_function_requires(InputIteratorConcept<_InputIterator>); + for ( ; __first != __last; ++__first) __init = __binary_op(__init, *__first); return __init; @@ -58,8 +62,10 @@ template <class _InputIterator1, class _InputIterator2, class _Tp> _Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) { - __STL_REQUIRES(_InputIterator2, _InputIterator); - __STL_REQUIRES(_InputIterator2, _InputIterator); + // concept requirements + glibcpp_function_requires(InputIteratorConcept<_InputIterator1>); + glibcpp_function_requires(InputIteratorConcept<_InputIterator2>); + for ( ; __first1 != __last1; ++__first1, ++__first2) __init = __init + (*__first1 * *__first2); return __init; @@ -72,8 +78,10 @@ _Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2) { - __STL_REQUIRES(_InputIterator2, _InputIterator); - __STL_REQUIRES(_InputIterator2, _InputIterator); + // concept requirements + glibcpp_function_requires(InputIteratorConcept<_InputIterator1>); + glibcpp_function_requires(InputIteratorConcept<_InputIterator2>); + for ( ; __first1 != __last1; ++__first1, ++__first2) __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); return __init; @@ -97,11 +105,14 @@ _OutputIterator partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result) { - __STL_REQUIRES(_InputIterator, _InputIterator); - __STL_REQUIRES(_OutputIterator, _OutputIterator); + // concept requirements + glibcpp_function_requires(InputIteratorConcept<_InputIterator>); + glibcpp_function_requires(OutputIteratorConcept<_OutputIterator, + typename iterator_traits<_InputIterator>::value_type>); + if (__first == __last) return __result; *__result = *__first; - return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first)); + return __partial_sum(__first, __last, __result, __value_type(__first)); } template <class _InputIterator, class _OutputIterator, class _Tp, @@ -123,11 +134,14 @@ _OutputIterator partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryOperation __binary_op) { - __STL_REQUIRES(_InputIterator, _InputIterator); - __STL_REQUIRES(_OutputIterator, _OutputIterator); + // concept requirements + glibcpp_function_requires(InputIteratorConcept<_InputIterator>); + glibcpp_function_requires(OutputIteratorConcept<_OutputIterator, + typename iterator_traits<_InputIterator>::value_type>); + if (__first == __last) return __result; *__result = *__first; - return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first), + return __partial_sum(__first, __last, __result, __value_type(__first), __binary_op); } @@ -150,12 +164,15 @@ _OutputIterator adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result) { - __STL_REQUIRES(_InputIterator, _InputIterator); - __STL_REQUIRES(_OutputIterator, _OutputIterator); + // concept requirements + glibcpp_function_requires(InputIteratorConcept<_InputIterator>); + glibcpp_function_requires(OutputIteratorConcept<_OutputIterator, + typename iterator_traits<_InputIterator>::value_type>); + if (__first == __last) return __result; *__result = *__first; return __adjacent_difference(__first, __last, __result, - __VALUE_TYPE(__first)); + __value_type(__first)); } template <class _InputIterator, class _OutputIterator, class _Tp, @@ -178,12 +195,15 @@ _OutputIterator adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryOperation __binary_op) { - __STL_REQUIRES(_InputIterator, _InputIterator); - __STL_REQUIRES(_OutputIterator, _OutputIterator); + // concept requirements + glibcpp_function_requires(InputIteratorConcept<_InputIterator>); + glibcpp_function_requires(OutputIteratorConcept<_OutputIterator, + typename iterator_traits<_InputIterator>::value_type>); + if (__first == __last) return __result; *__result = *__first; return __adjacent_difference(__first, __last, __result, - __VALUE_TYPE(__first), + __value_type(__first), __binary_op); } @@ -241,8 +261,11 @@ template <class _ForwardIter, class _Tp> void iota(_ForwardIter __first, _ForwardIter __last, _Tp __value) { - __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); - __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type); + // concept requirements + glibcpp_function_requires(Mutable_ForwardIteratorConcept<_ForwardIter>); + glibcpp_function_requires(ConvertibleConcept<_Tp, + typename iterator_traits<_ForwardIter>::value_type>); + while (__first != __last) *__first++ = __value++; } |