00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 #ifndef _CPP_BITS_STL_NUMERIC_H
00062 #define _CPP_BITS_STL_NUMERIC_H 1
00063
00064 namespace std
00065 {
00066
00067 template<typename _InputIterator, typename _Tp>
00068 _Tp
00069 accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
00070 {
00071
00072 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>)
00073
00074 for ( ; __first != __last; ++__first)
00075 __init = __init + *__first;
00076 return __init;
00077 }
00078
00079 template<typename _InputIterator, typename _Tp, typename _BinaryOperation>
00080 _Tp
00081 accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
00082 _BinaryOperation __binary_op)
00083 {
00084
00085 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>)
00086
00087 for ( ; __first != __last; ++__first)
00088 __init = __binary_op(__init, *__first);
00089 return __init;
00090 }
00091
00092 template<typename _InputIterator1, typename _InputIterator2, typename _Tp>
00093 _Tp
00094 inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
00095 _InputIterator2 __first2, _Tp __init)
00096 {
00097
00098 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator1>)
00099 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator2>)
00100
00101 for ( ; __first1 != __last1; ++__first1, ++__first2)
00102 __init = __init + (*__first1 * *__first2);
00103 return __init;
00104 }
00105
00106 template<typename _InputIterator1, typename _InputIterator2, typename _Tp,
00107 typename _BinaryOperation1, typename _BinaryOperation2>
00108 _Tp
00109 inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
00110 _InputIterator2 __first2, _Tp __init,
00111 _BinaryOperation1 __binary_op1,
00112 _BinaryOperation2 __binary_op2)
00113 {
00114
00115 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator1>)
00116 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator2>)
00117
00118 for ( ; __first1 != __last1; ++__first1, ++__first2)
00119 __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
00120 return __init;
00121 }
00122
00123 template<typename _InputIterator, typename _OutputIterator>
00124 _OutputIterator
00125 partial_sum(_InputIterator __first, _InputIterator __last,
00126 _OutputIterator __result)
00127 {
00128 typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
00129
00130
00131 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>)
00132 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIterator, _ValueType>)
00133
00134 if (__first == __last) return __result;
00135 *__result = *__first;
00136 _ValueType __value = *__first;
00137 while (++__first != __last) {
00138 __value = __value + *__first;
00139 *++__result = __value;
00140 }
00141 return ++__result;
00142 }
00143
00144 template<typename _InputIterator, typename _OutputIterator, typename _BinaryOperation>
00145 _OutputIterator
00146 partial_sum(_InputIterator __first, _InputIterator __last,
00147 _OutputIterator __result, _BinaryOperation __binary_op)
00148 {
00149 typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
00150
00151
00152 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>)
00153 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIterator, _ValueType>)
00154
00155 if (__first == __last) return __result;
00156 *__result = *__first;
00157 _ValueType __value = *__first;
00158 while (++__first != __last) {
00159 __value = __binary_op(__value, *__first);
00160 *++__result = __value;
00161 }
00162 return ++__result;
00163 }
00164
00165 template<typename _InputIterator, typename _OutputIterator>
00166 _OutputIterator
00167 adjacent_difference(_InputIterator __first,
00168 _InputIterator __last, _OutputIterator __result)
00169 {
00170 typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
00171
00172
00173 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>)
00174 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIterator, _ValueType>)
00175
00176 if (__first == __last) return __result;
00177 *__result = *__first;
00178 _ValueType __value = *__first;
00179 while (++__first != __last) {
00180 _ValueType __tmp = *__first;
00181 *++__result = __tmp - __value;
00182 __value = __tmp;
00183 }
00184 return ++__result;
00185 }
00186
00187 template<typename _InputIterator, typename _OutputIterator, typename _BinaryOperation>
00188 _OutputIterator
00189 adjacent_difference(_InputIterator __first, _InputIterator __last,
00190 _OutputIterator __result, _BinaryOperation __binary_op)
00191 {
00192 typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
00193
00194
00195 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>)
00196 __glibcpp_function_requires(_OutputIteratorConcept<_OutputIterator, _ValueType>)
00197
00198 if (__first == __last) return __result;
00199 *__result = *__first;
00200 _ValueType __value = *__first;
00201 while (++__first != __last) {
00202 _ValueType __tmp = *__first;
00203 *++__result = __binary_op(__tmp, __value);
00204 __value = __tmp;
00205 }
00206 return ++__result;
00207 }
00208
00209 }
00210
00211 #endif
00212
00213
00214
00215