1 // numeric stl/clr header
2 #ifndef _CLI_NUMERIC_
3 #define _CLI_NUMERIC_
4 #include <cliext/memory>
5
6 namespace cliext {
7         // TEMPLATE FUNCTION accumulate
8 template<class _InIt,
9     class _Ty> inline
10     _Ty accumulate_unchecked(_InIt _First, _InIt _Last, _Ty _Val)
11     {    // return sum of _Val and all in [_First, _Last)
12     for (; _First != _Last; ++_First)
13         _Val = _Val + *_First;
14     return (_Val);
15     }
16
17 template<class _InIt,
18     class _Ty> inline
19     _Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val)
20     {    // return sum of _Val and all in [_First, _Last)
21     _STLCLRDB_RANGE(_First, _Last);
22     return (cliext::accumulate_unchecked(
23         _Unchecked(_First), _Unchecked(_Last), _Val));
24     }
25
26         // TEMPLATE FUNCTION accumulate WITH BINOP
27 template<class _InIt,
28     class _Ty,
29     class _Fn2> inline
30     _Ty accumulate_unchecked(_InIt _First, _InIt _Last,
31         _Ty _Val, _Fn2 _Func)
32     {    // return sum of _Val and all in [_First, _Last), using _Func
33     for (; _First != _Last; ++_First)
34         _Val = _Func(_Val, *_First);
35     return (_Val);
36     }
37
38 template<class _InIt,
39     class _Ty,
40     class _Fn2> inline
41     _Ty accumulate(_InIt _First, _InIt _Last,
42         _Ty _Val, _Fn2 _Func)
43     {    // return sum of _Val and all in [_First, _Last), using _Func
44     _STLCLRDB_RANGE(_First, _Last);
45     _STLCLRDB_POINTER(_Func);
46     return (cliext::accumulate_unchecked(
47         _Unchecked(_First), _Unchecked(_Last), _Val, _Func));
48     }
49
50         // TEMPLATE FUNCTION inner_product
51 template<class _InIt1,
52     class _InIt2,
53     class _Ty> inline
54     _Ty inner_product_unchecked(_InIt1 _First1, _InIt1 _Last1,
55         _InIt2 _First2, _Ty _Val)
56     {    // return inner product of sequences
57     for (; _First1 != _Last1; ++_First1, ++_First2)
58         _Val = _Val + *_First1 * *_First2;
59     return (_Val);
60     }
61
62 template<class _InIt1,
63     class _InIt2,
64     class _Ty> inline
65     _Ty inner_product(_InIt1 _First1, _InIt1 _Last1,
66         _InIt2 _First2, _Ty _Val)
67     {    // return inner product of sequences
68     _STLCLRDB_RANGE(_First1, _Last1);
69     _STLCLRDB_POINTER(_First2);
70     return (cliext::inner_product_unchecked(
71         _Unchecked(_First1), _Unchecked(_Last1),
72         _Unchecked(_First2), _Val));
73     }
74
75         // TEMPLATE FUNCTION inner_product WITH BINOPS
76 template<class _InIt1,
77     class _InIt2,
78     class _Ty,
79     class _Fn21,
80     class _Fn22> inline
81     _Ty inner_product_unchecked(_InIt1 _First1, _InIt1 _Last1,
82         _InIt2 _First2, _Ty _Val, _Fn21 _Func1, _Fn22 _Func2)
83     {    // return inner product of sequences, using _Func1 and _Func2
84     for (; _First1 != _Last1; ++_First1, ++_First2)
85         _Val = _Func1(_Val, _Func2(*_First1, *_First2));
86     return (_Val);
87     }
88
89 template<class _InIt1,
90     class _InIt2,
91     class _Ty,
92     class _Fn21,
93     class _Fn22> inline
94     _Ty inner_product(_InIt1 _First1, _InIt1 _Last1,
95         _InIt2 _First2, _Ty _Val, _Fn21 _Func1, _Fn22 _Func2)
96     {    // return inner product of sequences, using _Func1 and _Func2
97     _STLCLRDB_RANGE(_First1, _Last1);
98     _STLCLRDB_POINTER(_First2);
99     _STLCLRDB_POINTER(_Func1);
100     _STLCLRDB_POINTER(_Func2);
101     return (cliext::inner_product_unchecked(
102         _Unchecked(_First1), _Unchecked(_Last1),
103         _Unchecked(_First2), _Val, _Func1, _Func2));
104     }
105
106         // TEMPLATE FUNCTION partial_sum
107 template<class _InIt,
108     class _OutIt> inline
109     _OutIt partial_sum_unchecked(_InIt _First, _InIt _Last,
110         _OutIt _Dest)
111     {    // compute partial sums into _Dest
112     typedef iterator_traits<_InIt>::value_type _Ty;
113
114     if (_First == _Last)
115         return (_Dest);
116     else
117         {    // compute nontrivial sum
118         _Ty _Val = *_First;
119
120         for (*_Dest = _Val; ++_First != _Last; *++_Dest = _Val)
121             _Val = _Val + *_First;
122         return (++_Dest);
123         }
124     }
Lines 125 ... 134 are skipped.
135         _Unchecked(_Dest)));
136     }
137
138         // TEMPLATE FUNCTION partial_sum WITH BINOP
139 template<class _InIt,
140     class _OutIt,
141     class _Fn2> inline
142     _OutIt partial_sum_unchecked(_InIt _First, _InIt _Last,
143         _OutIt _Dest, _Fn2 _Func)
144     {    // compute partial sums into _Dest, using _Func
145     typedef iterator_traits<_InIt>::value_type _Ty;
146
147     if (_First == _Last)
148         return (_Dest);
149     else
150         {    // compute nontrivial sum
151         _Ty _Val = *_First;
152
153         for (*_Dest = _Val; ++_First != _Last; *++_Dest = _Val)
154             _Val = _Func(_Val, *_First);
155         return (++_Dest);
156         }
157     }
158
159 template<class _InIt,
160     class _OutIt,
161     class _Fn2> inline
162     _OutIt partial_sum(_InIt _First, _InIt _Last,
163         _OutIt _Dest, _Fn2 _Func)
164     {    // compute partial sums into _Dest, using _Func
165     _STLCLRDB_RANGE(_First, _Last);
166     _STLCLRDB_POINTER(_Dest);
167     _STLCLRDB_POINTER(_Func);
168     return (cliext::partial_sum_unchecked(
169         _Unchecked(_First), _Unchecked(_Last),
170         _Unchecked(_Dest), _Func));
171     }
172
173         // TEMPLATE FUNCTION adjacent_difference
174 template<class _InIt,
175     class _OutIt> inline
176     _OutIt adjacent_difference_unchecked(_InIt _First, _InIt _Last,
177         _OutIt _Dest)
178     {    // compute adjacent differences into _Dest
179     typedef iterator_traits<_InIt>::value_type _Ty;
180
181     if (_First == _Last)
182         return (_Dest);
183     else
184         {    // compute nontrivial difference
185         _Ty _Val = *_First;
186
187         for (*_Dest = _Val; ++_First != _Last; )
188             {    // compute another difference
189             _Ty _Tmp = *_First;
190
191             *++_Dest = _Tmp - _Val;
192             _Val = _Tmp;
193             }
194         return (++_Dest);
195         }
196     }
197
198 template<class _InIt,
199     class _OutIt> inline
200     _OutIt adjacent_difference(_InIt _First, _InIt _Last,
201         _OutIt _Dest)
202     {    // compute adjacent differences into _Dest
203     _STLCLRDB_RANGE(_First, _Last);
204     _STLCLRDB_POINTER(_Dest);
205     return (cliext::adjacent_difference_unchecked(
206         _Unchecked(_First), _Unchecked(_Last),
207         _Unchecked(_Dest)));
208     }
209
210         // TEMPLATE FUNCTION adjacent_difference WITH BINOP
211 template<class _InIt,
212     class _OutIt,
213     class _Fn2> inline
214     _OutIt adjacent_difference_unchecked(_InIt _First, _InIt _Last,
215         _OutIt _Dest, _Fn2 _Func)
216     {    // compute adjacent differences into _Dest, using _Func
217     typedef iterator_traits<_InIt>::value_type _Ty;
218
219     if (_First == _Last)
220         return (_Dest);
221     else
222         {    // compute nontrivial difference
223         _Ty _Val = *_First;
224
225         for (*_Dest = _Val; ++_First != _Last; )
226             {    // compute another difference
227             _Ty _Tmp = *_First;
228
229             *++_Dest = _Func(_Tmp, _Val);
230             _Val = _Tmp;
231             }
232         return (++_Dest);
233         }
234     }
235
236 template<class _InIt,
237     class _OutIt,
238     class _Fn2> inline
239     _OutIt adjacent_difference(_InIt _First, _InIt _Last,
240         _OutIt _Dest, _Fn2 _Func)
241     {    // compute adjacent differences into _Dest, using _Func
242     _STLCLRDB_RANGE(_First, _Last);
243     _STLCLRDB_POINTER(_Dest);
244     _STLCLRDB_POINTER(_Func);
245     return (cliext::adjacent_difference_unchecked(
246         _Unchecked(_First), _Unchecked(_Last),
247         _Unchecked(_Dest), _Func));
248     }
249 } // namespace cliext
250 #endif /* _CLI_NUMERIC_ */
251
252 /*
253  * Copyright (c) 2004-2007 by Dinkumware, Ltd.  ALL RIGHTS RESERVED.
254  * Consult your license regarding permissions and restrictions.
255 V5.03:0009 */
256