|
|
|
1 |
|
// numeric standard header |
2 |
|
#pragma once |
3 |
|
#ifndef _NUMERIC_ |
4 |
|
#define _NUMERIC_ |
5 |
|
#ifndef RC_INVOKED |
6 |
|
#include <iterator> |
7 |
|
#include <xutility> |
8 |
|
|
9 |
|
#include <functional> |
10 |
|
|
11 |
|
#ifdef _MSC_VER |
12 |
|
#pragma pack(push,_CRT_PACKING) |
13 |
|
#pragma warning(push,3) |
14 |
|
#endif /* _MSC_VER */ |
15 |
|
|
16 |
|
_STD_BEGIN |
17 |
|
|
18 |
|
// TEMPLATE FUNCTION accumulate |
19 |
|
template<class _InIt, |
20 |
|
class _Ty> inline |
21 |
|
_Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val) |
22 |
|
{ // return sum of _Val and all in [_First, _Last) |
23 |
|
_DEBUG_RANGE(_First, _Last); |
24 |
|
for (; _First != _Last; ++_First) |
25 |
|
_Val = _Val + *_First; |
26 |
|
return (_Val); |
27 |
|
} |
28 |
|
|
29 |
|
template<class _InIt, |
30 |
|
class _Ty> inline |
31 |
|
_Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val) |
32 |
|
{ // return sum of _Val and all in [_First, _Last) |
33 |
|
return _Accumulate(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Val); |
34 |
|
} |
35 |
|
|
36 |
|
// TEMPLATE FUNCTION accumulate WITH BINOP |
37 |
|
template<class _InIt, |
38 |
|
class _Ty, |
39 |
|
class _Fn2> inline |
40 |
|
_Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func) |
41 |
|
{ // return sum of _Val and all in [_First, _Last), using _Func |
42 |
|
_DEBUG_RANGE(_First, _Last); |
43 |
|
_DEBUG_POINTER(_Func); |
44 |
|
for (; _First != _Last; ++_First) |
45 |
|
_Val = _Func(_Val, *_First); |
46 |
|
return (_Val); |
47 |
|
} |
48 |
|
|
49 |
|
template<class _InIt, |
50 |
|
class _Ty, |
51 |
|
class _Fn2> inline |
52 |
|
_Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func) |
53 |
|
{ // return sum of _Val and all in [_First, _Last), using _Func |
54 |
|
return _Accumulate(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Val, _Func); |
55 |
|
} |
56 |
|
|
57 |
|
// TEMPLATE FUNCTION inner_product |
58 |
|
template<class _InIt1, class _InIt2, class _Ty, class _InItCats> |
59 |
|
inline |
60 |
|
_Ty _Inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
61 |
|
_InItCats, _Range_checked_iterator_tag) |
62 |
|
{ // return inner product of sequences |
63 |
|
_DEBUG_RANGE(_First1, _Last1); |
64 |
|
for (; _First1 != _Last1; ++_First1, ++_First2) |
65 |
|
_Val = _Val + *_First1 * *_First2; |
66 |
|
return (_Val); |
67 |
|
} |
68 |
|
|
69 |
|
#if _SECURE_SCL |
70 |
|
template<class _InIt1, class _InIt2, class _Ty> |
71 |
|
inline |
72 |
|
_Ty _Inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
73 |
|
random_access_iterator_tag, _Range_checked_iterator_tag) |
74 |
|
{ |
75 |
|
// for range checked iterators, this will make sure there is enough space |
76 |
|
_InIt2 _Last2 = _First2 + (_Last1 - _First1); (_Last2); |
77 |
|
return _Inner_product(_First1, _Last1, _CHECKED_BASE(_First2), _Val, |
78 |
|
forward_iterator_tag(), _Range_checked_iterator_tag()); |
79 |
|
} |
80 |
|
#endif |
81 |
|
|
82 |
|
#if _SECURE_SCL |
83 |
|
|
84 |
|
template<class _InIt1, class _InIt2, class _Ty> |
85 |
|
inline |
86 |
|
_IF_CHK_(_InIt2, _Ty) inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val) |
87 |
|
{ |
88 |
|
return _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, |
89 |
|
_Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
90 |
|
} |
91 |
|
|
92 |
|
template<class _InIt1, class _InElem2, class _Ty, size_t _Size> |
93 |
|
inline |
94 |
|
_Ty inner_product(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size], _Ty _Val) |
95 |
|
{ |
96 |
|
return inner_product(_First1, _Last1, |
97 |
|
_STDEXT make_checked_array_iterator(_First2, _Size), _Val); |
98 |
|
} |
99 |
|
|
100 |
|
template<class _InIt1, class _InIt2, class _Ty> |
101 |
|
inline |
102 |
|
_SCL_INSECURE_DEPRECATE |
103 |
|
_IF_NOT_CHK_(_InIt2, _Ty) inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val) |
104 |
|
{ |
105 |
|
return _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, |
106 |
|
_Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
107 |
|
} |
108 |
|
|
109 |
|
#else |
110 |
|
|
111 |
|
template<class _InIt1, class _InIt2, class _Ty> |
112 |
|
inline |
113 |
|
_Ty inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val) |
114 |
|
{ |
115 |
|
return _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, |
116 |
|
_Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
117 |
|
} |
118 |
|
|
119 |
|
#endif |
120 |
|
|
121 |
|
// TEMPLATE FUNCTION inner_product WITH BINOPS |
122 |
|
template<class _InIt1, class _InIt2, class _Ty, class _Fn21, class _Fn22, class _InItCats> |
123 |
|
inline |
124 |
|
_Ty _Inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
125 |
|
_Fn21 _Func1, _Fn22 _Func2, |
126 |
|
_InItCats, _Range_checked_iterator_tag) |
127 |
|
{ // return inner product of sequences, using _Func1 and _Func2 |
128 |
|
_DEBUG_RANGE(_First1, _Last1); |
129 |
|
_DEBUG_POINTER(_Func1); |
130 |
|
_DEBUG_POINTER(_Func2); |
131 |
|
for (; _First1 != _Last1; ++_First1, ++_First2) |
132 |
|
_Val = _Func1(_Val, _Func2(*_First1, *_First2)); |
133 |
|
return (_Val); |
134 |
|
} |
135 |
|
|
136 |
|
#if _SECURE_SCL |
137 |
|
template<class _InIt1, class _InIt2, class _Ty, class _Fn21, class _Fn22> |
138 |
|
inline |
139 |
|
_Ty _Inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
140 |
|
_Fn21 _Func1, _Fn22 _Func2, |
141 |
|
random_access_iterator_tag, _Range_checked_iterator_tag) |
142 |
|
{ |
143 |
|
// for range checked iterators, this will make sure there is enough space |
144 |
|
_InIt2 _Last2 = _First2 + (_Last1 - _First1); (_Last2); |
145 |
|
return _Inner_product(_First1, _Last1, _CHECKED_BASE(_First2), _Val, _Func1, _Func2, |
146 |
|
forward_iterator_tag(), _Range_checked_iterator_tag()); |
147 |
|
} |
148 |
|
#endif |
149 |
|
|
150 |
|
#if _SECURE_SCL |
151 |
|
|
152 |
|
template<class _InIt1, class _InIt2, class _Ty, class _Fn21, class _Fn22> |
153 |
|
inline |
154 |
|
_IF_CHK_(_InIt2, _Ty) inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
155 |
|
_Fn21 _Func1, _Fn22 _Func2) |
156 |
|
{ |
157 |
|
return _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, _Func1, _Func2, |
158 |
|
_Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
159 |
|
} |
160 |
|
|
161 |
|
template<class _InIt1, class _InElem2, class _Ty, class _Fn21, class _Fn22, size_t _Size> |
162 |
|
inline |
163 |
|
_Ty inner_product(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size], _Ty _Val, |
164 |
|
_Fn21 _Func1, _Fn22 _Func2) |
165 |
|
{ |
166 |
|
return inner_product(_First1, _Last1, |
167 |
|
_STDEXT make_checked_array_iterator(_First2, _Size), |
168 |
|
_Val, _Func1, _Func2); |
169 |
|
} |
170 |
|
|
171 |
|
template<class _InIt1, class _InIt2, class _Ty, class _Fn21, class _Fn22> |
172 |
|
inline |
173 |
|
_SCL_INSECURE_DEPRECATE |
174 |
|
_IF_NOT_CHK_(_InIt2, _Ty) inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
175 |
|
_Fn21 _Func1, _Fn22 _Func2) |
176 |
|
{ |
177 |
|
return _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, _Func1, _Func2, |
178 |
|
_Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
179 |
|
} |
180 |
|
|
181 |
|
#else |
182 |
|
|
183 |
|
template<class _InIt1, class _InIt2, class _Ty, class _Fn21, class _Fn22> |
184 |
|
inline |
185 |
|
_Ty inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
186 |
|
_Fn21 _Func1, _Fn22 _Func2) |
187 |
|
{ |
188 |
|
return _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, _Func1, _Func2, |
189 |
|
_Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
190 |
|
} |
191 |
|
|
192 |
|
#endif |
193 |
|
|
194 |
|
// TEMPLATE FUNCTION partial_sum |
195 |
|
template<class _InIt, class _OutIt, class _Ty, class _InOutItCat> |
196 |
|
inline |
197 |
|
_OutIt _Partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest, |
198 |
|
_Ty *, _InOutItCat, _Range_checked_iterator_tag) |
199 |
|
{ // compute partial sums into _Dest |
200 |
|
_DEBUG_RANGE(_First, _Last); |
201 |
|
_DEBUG_POINTER(_Dest); |
202 |
|
_Ty _Val = *_First; |
203 |
|
for (*_Dest = _Val; ++_First != _Last; *++_Dest = _Val) |
204 |
|
_Val = _Val + *_First; |
205 |
|
return (++_Dest); |
206 |
|
} |
207 |
|
|
208 |
|
#if _SECURE_SCL |
209 |
|
template<class _InIt, class _OutIt, class _Ty> |
210 |
|
inline |
211 |
|
_OutIt _Partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest, |
212 |
|
_Ty *_Val_type, random_access_iterator_tag, _Range_checked_iterator_tag) |
213 |
|
{ |
214 |
|
// for range checked iterators, this will make sure there is enough space |
215 |
|
_OutIt _Result = _Dest + (_Last - _First); |
216 |
|
_Partial_sum(_First, _Last, _CHECKED_BASE(_Dest), |
217 |
|
_Val_type, forward_iterator_tag(), _Range_checked_iterator_tag()); |
218 |
|
return _Result; |
219 |
|
} |
220 |
|
#endif |
221 |
|
|
222 |
|
#if _SECURE_SCL |
223 |
|
|
224 |
|
template<class _InIt, class _OutIt> |
225 |
|
inline |
226 |
|
_IF_CHK(_OutIt) partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest) |
227 |
|
{ // compute partial sums into _Dest |
228 |
|
return (_First == _Last ? _Dest |
229 |
|
: _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
230 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
231 |
|
} |
232 |
|
|
233 |
|
template<class _InIt, class _OutElem, size_t _Size> |
234 |
|
inline |
235 |
|
_OutElem* partial_sum(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size]) |
236 |
|
{ // compute partial sums into _Dest |
237 |
|
return (_First == _Last ? _Dest |
238 |
|
: (partial_sum(_First, _Last, _STDEXT make_checked_array_iterator(_Dest, _Size)).base())); |
239 |
|
} |
240 |
|
|
241 |
|
template<class _InIt, class _OutIt> |
242 |
|
inline |
243 |
|
_SCL_INSECURE_DEPRECATE |
244 |
|
_IF_NOT_CHK(_OutIt) partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest) |
245 |
|
{ // compute partial sums into _Dest |
246 |
|
return (_First == _Last ? _Dest |
247 |
|
: _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
248 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
249 |
|
} |
250 |
|
|
251 |
|
#else |
252 |
|
|
253 |
|
template<class _InIt, class _OutIt> |
254 |
|
inline |
255 |
|
_OutIt partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest) |
256 |
|
{ // compute partial sums into _Dest |
257 |
|
return (_First == _Last ? _Dest |
258 |
|
: _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
259 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
260 |
|
} |
261 |
|
|
262 |
|
#endif |
263 |
|
|
264 |
|
// TEMPLATE FUNCTION partial_sum WITH BINOP |
265 |
|
template<class _InIt, class _OutIt, class _Fn2, class _Ty, class _InOutItCat> |
266 |
|
inline |
267 |
|
_OutIt _Partial_sum(_InIt _First, _InIt _Last, |
268 |
|
_OutIt _Dest, _Fn2 _Func, |
269 |
|
_Ty *, _InOutItCat, _Range_checked_iterator_tag) |
270 |
|
{ // compute partial sums into _Dest, using _Func |
271 |
|
_DEBUG_RANGE(_First, _Last); |
272 |
|
_DEBUG_POINTER(_Dest); |
273 |
|
_DEBUG_POINTER(_Func); |
274 |
|
_Ty _Val = *_First; |
275 |
|
for (*_Dest = _Val; ++_First != _Last; *++_Dest = _Val) |
276 |
|
_Val = _Func(_Val, *_First); |
277 |
|
return (++_Dest); |
278 |
|
} |
279 |
|
|
280 |
|
#if _SECURE_SCL |
281 |
|
template<class _InIt, class _OutIt, class _Fn2, class _Ty> |
282 |
|
inline |
283 |
|
_OutIt _Partial_sum(_InIt _First, _InIt _Last, |
284 |
|
_OutIt _Dest, _Fn2 _Func, |
285 |
|
_Ty *_Val_type, random_access_iterator_tag, _Range_checked_iterator_tag) |
286 |
|
{ |
287 |
|
// for range checked iterators, this will make sure there is enough space |
288 |
|
_OutIt _Result = _Dest + (_Last - _First); |
289 |
|
_Partial_sum(_First, _Last, _CHECKED_BASE(_Dest), _Func, |
290 |
|
_Val_type, forward_iterator_tag(), _Range_checked_iterator_tag()); |
291 |
|
return _Result; |
292 |
|
} |
293 |
|
#endif |
294 |
|
|
295 |
|
#if _SECURE_SCL |
296 |
|
|
297 |
|
template<class _InIt, class _OutIt, class _Fn2> |
298 |
|
inline |
299 |
|
_IF_CHK(_OutIt) partial_sum(_InIt _First, _InIt _Last, |
300 |
|
_OutIt _Dest, _Fn2 _Func) |
301 |
|
{ // compute partial sums into _Dest, using _Func |
302 |
|
return (_First == _Last ? _Dest |
303 |
|
: _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, _Func, |
304 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
305 |
|
} |
306 |
|
|
307 |
|
template<class _InIt, class _OutElem, class _Fn2, size_t _Size> |
308 |
|
inline |
309 |
|
_OutElem* partial_sum(_InIt _First, _InIt _Last, |
310 |
|
_OutElem (&_Dest)[_Size], _Fn2 _Func) |
311 |
|
{ // compute partial sums into _Dest, using _Func |
312 |
|
return (_First == _Last ? _Dest |
313 |
|
: (partial_sum(_First, _Last, |
314 |
|
_STDEXT make_checked_array_iterator(_Dest, _Size), _Func).base())); |
315 |
|
} |
316 |
|
|
317 |
|
template<class _InIt, class _OutIt, class _Fn2> |
318 |
|
inline |
319 |
|
_SCL_INSECURE_DEPRECATE |
320 |
|
_IF_NOT_CHK(_OutIt) partial_sum(_InIt _First, _InIt _Last, |
321 |
|
_OutIt _Dest, _Fn2 _Func) |
322 |
|
{ // compute partial sums into _Dest, using _Func |
323 |
|
return (_First == _Last ? _Dest |
324 |
|
: _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, _Func, |
325 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
326 |
|
} |
327 |
|
|
328 |
|
#else |
329 |
|
|
330 |
|
template<class _InIt, class _OutIt, class _Fn2> |
331 |
|
inline |
332 |
|
_OutIt partial_sum(_InIt _First, _InIt _Last, |
333 |
|
_OutIt _Dest, _Fn2 _Func) |
334 |
|
{ // compute partial sums into _Dest, using _Func |
335 |
|
return (_First == _Last ? _Dest |
336 |
|
: _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, _Func, |
337 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
338 |
|
} |
339 |
|
|
340 |
|
#endif |
341 |
|
|
342 |
|
// TEMPLATE FUNCTION adjacent_difference |
343 |
|
template<class _InIt, class _OutIt, class _Ty, class _InOutItCat> |
344 |
|
inline |
345 |
|
_OutIt _Adjacent_difference(_InIt _First, _InIt _Last, |
346 |
|
_OutIt _Dest, _Ty *, _InOutItCat, _Range_checked_iterator_tag) |
347 |
|
{ // compute adjacent differences into _Dest |
348 |
|
_DEBUG_RANGE(_First, _Last); |
349 |
|
_DEBUG_POINTER(_Dest); |
350 |
|
_Ty _Val = *_First; |
351 |
|
for (*_Dest = _Val; ++_First != _Last; ) |
352 |
|
{ // compute another difference |
353 |
|
_Ty _Tmp = *_First; |
354 |
|
*++_Dest = _Tmp - _Val; |
355 |
|
_Val = _Tmp; |
356 |
|
} |
357 |
|
return (++_Dest); |
358 |
|
} |
359 |
|
|
360 |
|
#if _SECURE_SCL |
361 |
|
template<class _InIt, class _OutIt, class _Ty> |
362 |
|
inline |
363 |
|
_OutIt _Adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest, |
364 |
|
_Ty *_Val_type, random_access_iterator_tag, _Range_checked_iterator_tag) |
365 |
|
{ |
366 |
|
// for range checked iterators, this will make sure there is enough space |
367 |
|
_OutIt _Result = _Dest + (_Last - _First); |
368 |
|
_Adjacent_difference(_First, _Last, _CHECKED_BASE(_Dest), |
369 |
|
_Val_type, forward_iterator_tag(), _Range_checked_iterator_tag()); |
370 |
|
return _Result; |
371 |
|
} |
372 |
|
#endif |
373 |
|
|
374 |
|
#if _SECURE_SCL |
375 |
|
|
376 |
|
template<class _InIt, class _OutIt> |
377 |
|
inline |
378 |
|
_IF_CHK(_OutIt) adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest) |
379 |
|
{ // compute adjacent differences into _Dest |
380 |
|
return (_First == _Last ? _Dest |
381 |
|
: _Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
382 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
383 |
|
} |
384 |
|
|
385 |
|
template<class _InIt, class _OutElem, size_t _Size> |
386 |
|
inline |
387 |
|
_OutElem* adjacent_difference(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size]) |
388 |
|
{ // compute adjacent differences into _Dest |
389 |
|
return (_First == _Last ? _Dest |
390 |
|
: (adjacent_difference(_First, _Last, |
391 |
|
_STDEXT make_checked_array_iterator(_Dest, _Size)).base())); |
392 |
|
} |
393 |
|
|
394 |
|
template<class _InIt, class _OutIt> |
395 |
|
inline |
396 |
|
_SCL_INSECURE_DEPRECATE |
397 |
|
_IF_NOT_CHK(_OutIt) adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest) |
398 |
|
{ // compute adjacent differences into _Dest |
399 |
|
return (_First == _Last ? _Dest |
400 |
|
: _Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
401 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
402 |
|
} |
403 |
|
|
404 |
|
#else |
405 |
|
|
406 |
|
template<class _InIt, class _OutIt> |
407 |
|
inline |
408 |
|
_OutIt adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest) |
409 |
|
{ // compute adjacent differences into _Dest |
410 |
|
return (_First == _Last ? _Dest |
411 |
|
: _Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
412 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
413 |
|
} |
414 |
|
|
415 |
|
#endif |
416 |
|
|
417 |
|
// TEMPLATE FUNCTION adjacent_difference WITH BINOP |
418 |
|
template<class _InIt, class _OutIt, class _Fn2, class _Ty, class _InOutItCat> |
419 |
|
inline |
420 |
|
_OutIt _Adjacent_difference(_InIt _First, _InIt _Last, |
421 |
|
_OutIt _Dest, _Fn2 _Func, |
422 |
|
_Ty *, _InOutItCat, _Range_checked_iterator_tag) |
423 |
|
{ // compute adjacent differences into _Dest, using _Func |
424 |
|
_DEBUG_RANGE(_First, _Last); |
425 |
|
_DEBUG_POINTER(_Dest); |
426 |
|
_DEBUG_POINTER(_Func); |
427 |
|
_Ty _Val = *_First; |
428 |
|
for (*_Dest = _Val; ++_First != _Last; ) |
429 |
|
{ // compute another difference |
430 |
|
_Ty _Tmp = *_First; |
431 |
|
*++_Dest = _Func(_Tmp, _Val); |
432 |
|
_Val = _Tmp; |
433 |
|
} |
434 |
|
return (++_Dest); |
435 |
|
} |
436 |
|
|
437 |
|
#if _SECURE_SCL |
438 |
|
template<class _InIt, class _OutIt, class _Fn2, class _Ty> |
439 |
|
inline |
440 |
|
_OutIt _Adjacent_difference(_InIt _First, _InIt _Last, |
441 |
|
_OutIt _Dest, _Fn2 _Func, |
442 |
|
_Ty *_Val_type, random_access_iterator_tag, _Range_checked_iterator_tag) |
443 |
|
{ |
444 |
|
// for range checked iterators, this will make sure there is enough space |
445 |
|
_OutIt _Result = _Dest + (_Last - _First); |
446 |
|
_Adjacent_difference(_First, _Last, _CHECKED_BASE(_Dest), _Func, |
447 |
|
_Val_type, forward_iterator_tag(), _Range_checked_iterator_tag()); |
448 |
|
return _Result; |
449 |
|
} |
450 |
|
#endif |
451 |
|
|
452 |
|
#if _SECURE_SCL |
453 |
|
|
454 |
|
template<class _InIt, class _OutIt, class _Fn2> |
455 |
|
inline |
456 |
|
_IF_CHK(_OutIt) adjacent_difference(_InIt _First, _InIt _Last, |
457 |
|
_OutIt _Dest, _Fn2 _Func) |
458 |
|
{ // compute adjacent differences into _Dest, using _Func |
459 |
|
return (_First == _Last ? _Dest : |
460 |
|
_Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), |
461 |
|
_Dest, _Func, |
462 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
463 |
|
} |
464 |
|
|
465 |
|
template<class _InIt, class _OutElem, class _Fn2, size_t _Size> |
466 |
|
inline |
467 |
|
_OutElem* adjacent_difference(_InIt _First, _InIt _Last, |
468 |
|
_OutElem (&_Dest)[_Size], _Fn2 _Func) |
469 |
|
{ // compute adjacent differences into _Dest, using _Func |
470 |
|
return (_First == _Last ? _Dest : |
471 |
|
(adjacent_difference(_First, _Last, |
472 |
|
_STDEXT make_checked_array_iterator(_Dest, _Size), _Func).base())); |
473 |
|
} |
474 |
|
|
475 |
|
template<class _InIt, class _OutIt, class _Fn2> |
476 |
|
inline |
477 |
|
_SCL_INSECURE_DEPRECATE |
478 |
|
_IF_NOT_CHK(_OutIt) adjacent_difference(_InIt _First, _InIt _Last, |
479 |
|
_OutIt _Dest, _Fn2 _Func) |
480 |
|
{ // compute adjacent differences into _Dest, using _Func |
481 |
|
return (_First == _Last ? _Dest : |
482 |
|
_Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), |
483 |
|
_Dest, _Func, |
484 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
485 |
|
} |
486 |
|
|
487 |
|
#else |
488 |
|
|
489 |
|
template<class _InIt, class _OutIt, class _Fn2> |
490 |
|
inline |
491 |
|
_OutIt adjacent_difference(_InIt _First, _InIt _Last, |
492 |
|
_OutIt _Dest, _Fn2 _Func) |
493 |
|
{ // compute adjacent differences into _Dest, using _Func |
494 |
|
return (_First == _Last ? _Dest : |
495 |
|
_Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), |
496 |
|
_Dest, _Func, |
497 |
|
_Val_type(_First), _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
498 |
|
} |
499 |
|
|
500 |
|
#endif |
501 |
|
|
502 |
|
_STD_END |
503 |
|
|
504 |
|
_STDEXT_BEGIN |
505 |
|
|
506 |
|
template<class _InIt, |
507 |
|
class _OutIt> inline |
508 |
|
_OutIt unchecked_partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest) |
509 |
|
{ // compute partial sums into _Dest |
510 |
|
return (_First == _Last ? _Dest |
511 |
|
: _STD _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
512 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
513 |
|
} |
514 |
|
|
515 |
|
template<class _InIt, class _OutIt> |
516 |
|
inline |
517 |
|
_IF_CHK(_OutIt) checked_partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest) |
518 |
|
{ // compute partial sums into _Dest |
519 |
|
return (_First == _Last ? _Dest |
520 |
|
: _STD _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
521 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
522 |
|
} |
523 |
|
|
524 |
|
template<class _InIt, class _OutElem, size_t _Size> |
525 |
|
inline |
526 |
|
_OutElem* checked_partial_sum(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size]) |
527 |
|
{ // compute partial sums into _Dest |
528 |
|
return (_First == _Last ? _Dest |
529 |
|
: (checked_partial_sum(_First, _Last, _STDEXT make_checked_array_iterator(_Dest, _Size)).base())); |
530 |
|
} |
531 |
|
|
532 |
|
template<class _InIt, class _OutIt> |
533 |
|
inline |
534 |
|
_SCL_CHECKED_ALGORITHM_WARN |
535 |
|
_IF_NOT_CHK(_OutIt) checked_partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest) |
536 |
|
{ // compute partial sums into _Dest |
537 |
|
return (_First == _Last ? _Dest |
538 |
|
: _STD _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
539 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
540 |
|
} |
541 |
|
|
542 |
|
template<class _InIt, |
543 |
|
class _OutIt, |
544 |
|
class _Fn2> inline |
545 |
|
_OutIt unchecked_partial_sum(_InIt _First, _InIt _Last, |
546 |
|
_OutIt _Dest, _Fn2 _Func) |
547 |
|
{ // compute partial sums into _Dest, using _Func |
548 |
|
return (_First == _Last ? _Dest |
549 |
|
: _STD _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, _Func, |
550 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
551 |
|
} |
552 |
|
|
553 |
|
template<class _InIt, class _OutIt, class _Fn2> |
554 |
|
inline |
555 |
|
_IF_CHK(_OutIt) checked_partial_sum(_InIt _First, _InIt _Last, |
556 |
|
_OutIt _Dest, _Fn2 _Func) |
557 |
|
{ // compute partial sums into _Dest, using _Func |
558 |
|
return (_First == _Last ? _Dest |
559 |
|
: _STD _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, _Func, |
560 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
561 |
|
} |
562 |
|
|
563 |
|
template<class _InIt, class _OutElem, class _Fn2, size_t _Size> |
564 |
|
inline |
565 |
|
_OutElem* checked_partial_sum(_InIt _First, _InIt _Last, |
566 |
|
_OutElem (&_Dest)[_Size], _Fn2 _Func) |
567 |
|
{ // compute partial sums into _Dest, using _Func |
568 |
|
return (_First == _Last ? _Dest |
569 |
|
: (checked_partial_sum(_First, _Last, |
570 |
|
_STDEXT make_checked_array_iterator(_Dest, _Size), _Func).base())); |
571 |
|
} |
572 |
|
|
573 |
|
template<class _InIt, class _OutIt, class _Fn2> |
574 |
|
inline |
575 |
|
_SCL_CHECKED_ALGORITHM_WARN |
576 |
|
_IF_NOT_CHK(_OutIt) checked_partial_sum(_InIt _First, _InIt _Last, |
577 |
|
_OutIt _Dest, _Fn2 _Func) |
578 |
|
{ // compute partial sums into _Dest, using _Func |
579 |
|
return (_First == _Last ? _Dest |
580 |
|
: _STD _Partial_sum(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, _Func, |
581 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
582 |
|
} |
583 |
|
|
584 |
|
template<class _InIt, |
585 |
|
class _OutIt> inline |
586 |
|
_OutIt unchecked_adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest) |
587 |
|
{ // compute adjacent differences into _Dest |
588 |
|
return (_First == _Last ? _Dest |
589 |
|
: _STD _Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
600 |
|
} |
601 |
|
|
602 |
|
template<class _InIt, class _OutElem, size_t _Size> |
603 |
|
inline |
604 |
|
_OutElem* checked_adjacent_difference(_InIt _First, _InIt _Last, _OutElem (&_Dest)[_Size]) |
605 |
|
{ // compute adjacent differences into _Dest |
606 |
|
return (_First == _Last ? _Dest |
607 |
|
: (checked_adjacent_difference(_First, _Last, |
608 |
|
_STDEXT make_checked_array_iterator(_Dest, _Size)).base())); |
609 |
|
} |
610 |
|
|
611 |
|
template<class _InIt, class _OutIt> |
612 |
|
inline |
613 |
|
_SCL_CHECKED_ALGORITHM_WARN |
614 |
|
_IF_NOT_CHK(_OutIt) checked_adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest) |
615 |
|
{ // compute adjacent differences into _Dest |
616 |
|
return (_First == _Last ? _Dest |
617 |
|
: _STD _Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Dest, |
618 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
619 |
|
} |
620 |
|
|
621 |
|
template<class _InIt, |
622 |
|
class _OutIt, |
623 |
|
class _Fn2> inline |
624 |
|
_OutIt unchecked_adjacent_difference(_InIt _First, _InIt _Last, |
625 |
|
_OutIt _Dest, _Fn2 _Func) |
626 |
|
{ // compute adjacent differences into _Dest, using _Func |
627 |
|
return (_First == _Last ? _Dest : |
628 |
|
_STD _Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), |
629 |
|
_Dest, _Func, |
630 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
631 |
|
} |
632 |
|
|
633 |
|
template<class _InIt, class _OutIt, class _Fn2> |
634 |
|
inline |
635 |
|
_IF_CHK(_OutIt) checked_adjacent_difference(_InIt _First, _InIt _Last, |
636 |
|
_OutIt _Dest, _Fn2 _Func) |
637 |
|
{ // compute adjacent differences into _Dest, using _Func |
638 |
|
return (_First == _Last ? _Dest : |
639 |
|
_STD _Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), |
640 |
|
_Dest, _Func, |
641 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
642 |
|
} |
643 |
|
|
644 |
|
template<class _InIt, class _OutElem, class _Fn2, size_t _Size> |
645 |
|
inline |
646 |
|
_OutElem* checked_adjacent_difference(_InIt _First, _InIt _Last, |
647 |
|
_OutElem (&_Dest)[_Size], _Fn2 _Func) |
648 |
|
{ // compute adjacent differences into _Dest, using _Func |
649 |
|
return (_First == _Last ? _Dest : |
650 |
|
(checked_adjacent_difference(_First, _Last, |
651 |
|
_STDEXT make_checked_array_iterator(_Dest, _Size), _Func).base())); |
652 |
|
} |
653 |
|
|
654 |
|
template<class _InIt, class _OutIt, class _Fn2> |
655 |
|
inline |
656 |
|
_SCL_CHECKED_ALGORITHM_WARN |
657 |
|
_IF_NOT_CHK(_OutIt) checked_adjacent_difference(_InIt _First, _InIt _Last, |
658 |
|
_OutIt _Dest, _Fn2 _Func) |
659 |
|
{ // compute adjacent differences into _Dest, using _Func |
660 |
|
return (_First == _Last ? _Dest : |
661 |
|
_STD _Adjacent_difference(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), |
662 |
|
_Dest, _Func, |
663 |
|
_STD _Val_type(_First), _STD _Iter_random(_First, _Dest), _STD _Range_checked_iterator_tag())); |
664 |
|
} |
665 |
|
|
666 |
|
template<class _InIt1, class _InIt2, class _Ty> |
667 |
|
inline |
668 |
|
_Ty unchecked_inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val) |
669 |
|
{ |
670 |
|
return _STD _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, |
671 |
|
_STD _Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
672 |
|
} |
673 |
|
|
674 |
|
template<class _InIt1, class _InIt2, class _Ty> |
675 |
|
inline |
676 |
|
_IF_CHK_(_InIt2, _Ty) checked_inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val) |
677 |
|
{ |
678 |
|
return _STD _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, |
679 |
|
_STD _Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
680 |
|
} |
681 |
|
|
682 |
|
template<class _InIt1, class _InElem2, class _Ty, size_t _Size> |
683 |
|
inline |
684 |
|
_Ty checked_inner_product(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size], _Ty _Val) |
685 |
|
{ |
686 |
|
return checked_inner_product(_First1, _Last1, |
687 |
|
_STDEXT make_checked_array_iterator(_First2, _Size), _Val); |
688 |
|
} |
689 |
|
|
690 |
|
template<class _InIt1, class _InIt2, class _Ty> |
691 |
|
inline |
692 |
|
_SCL_CHECKED_ALGORITHM_WARN |
693 |
|
_IF_NOT_CHK_(_InIt2, _Ty) checked_inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val) |
694 |
|
{ |
695 |
|
return _STD _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, |
696 |
|
_STD _Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
697 |
|
} |
698 |
|
|
699 |
|
template<class _InIt1, class _InIt2, class _Ty, class _Fn21, class _Fn22> |
700 |
|
inline |
701 |
|
_Ty unchecked_inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
702 |
|
_Fn21 _Func1, _Fn22 _Func2) |
703 |
|
{ |
704 |
|
return _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, |
705 |
|
_Val, _Func1, _Func2, |
706 |
|
_STD _Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
707 |
|
} |
708 |
|
|
709 |
|
template<class _InIt1, class _InIt2, class _Ty, class _Fn21, class _Fn22> |
710 |
|
inline |
711 |
|
_IF_CHK_(_InIt2, _Ty) checked_inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
712 |
|
_Fn21 _Func1, _Fn22 _Func2) |
713 |
|
{ |
714 |
|
return _STD _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, _Func1, _Func2, |
715 |
|
_STD _Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
716 |
|
} |
717 |
|
|
718 |
|
template<class _InIt1, class _InElem2, class _Ty, class _Fn21, class _Fn22, size_t _Size> |
719 |
|
inline |
720 |
|
_Ty checked_inner_product(_InIt1 _First1, _InIt1 _Last1, _InElem2 (&_First2)[_Size], _Ty _Val, |
721 |
|
_Fn21 _Func1, _Fn22 _Func2) |
722 |
|
{ |
723 |
|
return checked_inner_product(_First1, _Last1, |
724 |
|
_STDEXT make_checked_array_iterator(_First2, _Size), |
725 |
|
_Val, _Func1, _Func2); |
726 |
|
} |
727 |
|
|
728 |
|
template<class _InIt1, class _InIt2, class _Ty, class _Fn21, class _Fn22> |
729 |
|
inline |
730 |
|
_SCL_CHECKED_ALGORITHM_WARN |
731 |
|
_IF_NOT_CHK_(_InIt2, _Ty) checked_inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, |
732 |
|
_Fn21 _Func1, _Fn22 _Func2) |
733 |
|
{ |
734 |
|
return _STD _Inner_product(_CHECKED_BASE(_First1), _CHECKED_BASE(_Last1), _First2, _Val, _Func1, _Func2, |
735 |
|
_STD _Iter_random(_First1, _First2), _STD _Range_checked_iterator_tag()); |
736 |
|
} |
737 |
|
|
738 |
|
#if _HAS_TRADITIONAL_STL |
739 |
|
template<class _FwdIt, |
740 |
|
class _Ty> inline |
741 |
|
void iota(_FwdIt _First, _FwdIt _Last, _Ty _Val) |
742 |
|
{ // compute increasing sequence into [_First, _Last) |
743 |
|
_DEBUG_RANGE(_First, _Last); |
744 |
|
for (; _First != _Last; ++_First, ++_Val) |
745 |
|
*_First = _Val; |
746 |
|
} |
747 |
|
#endif /* _HAS_TRADITIONAL_STL */ |
748 |
|
|
749 |
|
_STDEXT_END |
750 |
|
|
751 |
|
#ifdef _MSC_VER |
752 |
|
#pragma warning(pop) |
753 |
|
#pragma pack(pop) |
754 |
|
#endif /* _MSC_VER */ |
755 |
|
|
756 |
|
#endif /* RC_INVOKED */ |
757 |
|
#endif /* _NUMERIC_ */ |
758 |
|
|
759 |
|
/* |
760 |
|
* Copyright (c) 1992-2006 by P.J. Plauger. ALL RIGHTS RESERVED. |
761 |
|
* Consult your license regarding permissions and restrictions. |
762 |
|
*/ |
763 |
|
|
764 |
|
/* |
765 |
|
* This file is derived from software bearing the following |
766 |
|
* restrictions: |
767 |
|
* |
768 |
|
* Copyright (c) 1994 |
769 |
|
* Hewlett-Packard Company |
770 |
|
* |
771 |
|
* Permission to use, copy, modify, distribute and sell this |
772 |
|
* software and its documentation for any purpose is hereby |
773 |
|
* granted without fee, provided that the above copyright notice |
774 |
|
* appear in all copies and that both that copyright notice and |
775 |
|
* this permission notice appear in supporting documentation. |
776 |
|
* Hewlett-Packard Company makes no representations about the |
777 |
|
* suitability of this software for any purpose. It is provided |
778 |
|
* "as is" without express or implied warranty. |
779 |
|
V5.02:0009 */ |
780 |
|
|
|
|
|