// numeric standard header #ifndef _NUMERIC_ #define _NUMERIC_ #include #if _HAS_TRADITIONAL_STL #include #endif /* _HAS_TRADITIONAL_STL */ _STD_BEGIN // TEMPLATE FUNCTION accumulate template inline _Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val) { // return sum of _Val and all in [_First, _Last) _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) _Val = _Val + *_First; return (_Val); } // TEMPLATE FUNCTION accumulate WITH BINOP template inline _Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func) { // return sum of _Val and all in [_First, _Last), using _Func _DEBUG_RANGE(_First, _Last); _DEBUG_POINTER(_Func); for (; _First != _Last; ++_First) _Val = _Func(_Val, *_First); return (_Val); } // TEMPLATE FUNCTION inner_product template inline _Ty inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val) { // return inner product of sequences _DEBUG_RANGE(_First1, _Last1); for (; _First1 != _Last1; ++_First1, ++_First2) _Val = _Val + *_First1 * *_First2; return (_Val); } // TEMPLATE FUNCTION inner_product WITH BINOPS template inline _Ty inner_product(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2, _Ty _Val, _Fn21 _Func1, _Fn22 _Func2) { // return inner product of sequences, using _Func1 and _Func2 _DEBUG_RANGE(_First1, _Last1); _DEBUG_POINTER(_Func1); _DEBUG_POINTER(_Func2); for (; _First1 != _Last1; ++_First1, ++_First2) _Val = _Func1(_Val, _Func2(*_First1, *_First2)); return (_Val); } // TEMPLATE FUNCTION partial_sum template inline _OutIt _Partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest, _Ty *) { // compute partial sums into _Dest _DEBUG_RANGE(_First, _Last); _DEBUG_POINTER(_Dest); _Ty _Val = *_First; for (*_Dest = _Val; ++_First != _Last; *++_Dest = _Val) _Val = _Val + *_First; return (++_Dest); } template inline _OutIt partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest) { // compute partial sums into _Dest return (_First == _Last ? _Dest : _Partial_sum(_First, _Last, _Dest, _Val_type(_First))); } // TEMPLATE FUNCTION partial_sum WITH BINOP template inline _OutIt _Partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn2 _Func, _Ty *) { // compute partial sums into _Dest, using _Func _DEBUG_RANGE(_First, _Last); _DEBUG_POINTER(_Dest); _DEBUG_POINTER(_Func); _Ty _Val = *_First; for (*_Dest = _Val; ++_First != _Last; *++_Dest = _Val) _Val = _Func(_Val, *_First); return (++_Dest); } template inline _OutIt partial_sum(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn2 _Func) { // compute partial sums into _Dest, using _Func return (_First == _Last ? _Dest : _Partial_sum(_First, _Last, _Dest, _Func, _Val_type(_First))); } // TEMPLATE FUNCTION adjacent_difference template inline _OutIt _Adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest, _Ty *) { // compute adjacent differences into _Dest _DEBUG_RANGE(_First, _Last); _DEBUG_POINTER(_Dest); _Ty _Val = *_First; for (*_Dest = _Val; ++_First != _Last; ) { // compute another difference _Ty _Tmp = *_First; *++_Dest = _Tmp - _Val; _Val = _Tmp; } return (++_Dest); } template inline _OutIt adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest) { // compute adjacent differences into _Dest return (_First == _Last ? _Dest : _Adjacent_difference(_First, _Last, _Dest, _Val_type(_First))); } // TEMPLATE FUNCTION adjacent_difference WITH BINOP template inline _OutIt _Adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn2 _Func, _Ty *) { // compute adjacent differences into _Dest, using _Func _DEBUG_RANGE(_First, _Last); _DEBUG_POINTER(_Dest); _DEBUG_POINTER(_Func); _Ty _Val = *_First; for (*_Dest = _Val; ++_First != _Last; ) { // compute another difference _Ty _Tmp = *_First; *++_Dest = _Func(_Tmp, _Val); _Val = _Tmp; } return (++_Dest); } template inline _OutIt adjacent_difference(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn2 _Func) { // compute adjacent differences into _Dest, using _Func return (_First == _Last ? _Dest : _Adjacent_difference(_First, _Last, _Dest, _Func, _Val_type(_First))); } #if _HAS_TRADITIONAL_STL template inline void iota(_FwdIt _First, _FwdIt _Last, _Ty _Val) { // compute increasing sequence into [_First, _Last) _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First, ++_Val) *_First = _Val; } #endif /* _HAS_TRADITIONAL_STL */ _STD_END #endif /* _NUMERIC_ */ /* * Copyright (c) 1992-2004 by P.J. Plauger. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. */ /* * This file is derived from software bearing the following * restrictions: * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this * software and its documentation for any purpose is hereby * granted without fee, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation. * Hewlett-Packard Company makes no representations about the * suitability of this software for any purpose. It is provided * "as is" without express or implied warranty. V4.02:1476 */