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,
Lines 590 ... 599 are skipped.
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