19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc. 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk. 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies. 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted, 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice. 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* NOTE: This is an internal header file, included by other STL headers. 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * You should not attempt to use it directly. 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_NUMERIC_H 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_NUMERIC_H 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_FUNCTION_BASE_H 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_function_base.h> 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ITERATOR_BASE_H 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_iterator_base.h> 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _Tp> 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp _Init) { 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( ; __first != __last; ++__first) 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Init = _Init + *__first; 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Init; 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _Tp, class _BinaryOperation> 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp _Init, 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _BinaryOperation __binary_op) { 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( ; __first != __last; ++__first) 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Init = __binary_op(_Init, *__first); 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Init; 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator1, class _InputIterator2, class _Tp> 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1, 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _InputIterator2 __first2, _Tp _Init) { 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1)) 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( ; __first1 != __last1; ++__first1, ++__first2) 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Init = _Init + (*__first1 * *__first2); 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Init; 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator1, class _InputIterator2, class _Tp, 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _BinaryOperation1, class _BinaryOperation2> 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1, 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _InputIterator2 __first2, _Tp _Init, 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _BinaryOperation1 __binary_op1, 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _BinaryOperation2 __binary_op2) { 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1)) 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block for ( ; __first1 != __last1; ++__first1, ++__first2) 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Init = __binary_op1(_Init, __binary_op2(*__first1, *__first2)); 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _Init; 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _OutputIterator, class _Tp, 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _BinaryOperation> 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_OutputIterator 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__partial_sum(_InputIterator __first, _InputIterator __last, 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _OutputIterator __result, _Tp*, _BinaryOperation __binary_op); 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _OutputIterator> 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIterator 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpartial_sum(_InputIterator __first, _InputIterator __last, 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _OutputIterator __result) { 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _STLP_PRIV __partial_sum(__first, __last, __result, _STLP_VALUE_TYPE(__first, _InputIterator), 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_PRIV __plus(_STLP_VALUE_TYPE(__first, _InputIterator))); 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation> 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIterator 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpartial_sum(_InputIterator __first, _InputIterator __last, 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _OutputIterator __result, _BinaryOperation __binary_op) { 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _STLP_PRIV __partial_sum(__first, __last, __result, _STLP_VALUE_TYPE(__first, _InputIterator), 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __binary_op); 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _OutputIterator, class _Tp, 1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block class _BinaryOperation> 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_OutputIterator 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__adjacent_difference(_InputIterator __first, _InputIterator __last, 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _OutputIterator __result, _Tp*, 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _BinaryOperation __binary_op); 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _OutputIterator> 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _OutputIterator 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockadjacent_difference(_InputIterator __first, 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _InputIterator __last, _OutputIterator __result) { 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _STLP_PRIV __adjacent_difference(__first, __last, __result, 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_VALUE_TYPE(__first, _InputIterator), 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_PRIV __minus(_STLP_VALUE_TYPE(__first, _InputIterator))); 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation> 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_OutputIterator 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockadjacent_difference(_InputIterator __first, _InputIterator __last, 1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _OutputIterator __result, _BinaryOperation __binary_op) { 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _STLP_PRIV __adjacent_difference(__first, __last, __result, 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_VALUE_TYPE(__first, _InputIterator), 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __binary_op); 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Integer, class _MonoidOperation> 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp __power(_Tp __x, _Integer __n, _MonoidOperation __opr); 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_EXTENSIONS) 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Returns __x ** __n, where __n >= 0. _Note that "multiplication" 1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// is required to be associative, but not necessarily commutative. 1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Integer> 1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp __power(_Tp __x, _Integer __n) { 1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __power(__x, __n, multiplies<_Tp>()); 1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Alias for the internal name __power. Note that power is an extension, 1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// not part of the C++ standard. 1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Integer, class _MonoidOperation> 1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp power(_Tp __x, _Integer __n, _MonoidOperation __opr) { 1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _STLP_PRIV __power(__x, __n, __opr); 1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Integer> 1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp power(_Tp __x, _Integer __n) { 1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return _STLP_PRIV __power(__x, __n, multiplies<_Tp>()); 1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// iota is not part of the C++ standard. It is an extension. 1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIterator, class _Tp> 1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP 1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __val) { 1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) 1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block while (__first != __last) 1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *__first++ = __val++; 1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block} 1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION) 1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_numeric.c> 1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_NUMERIC_H */ 1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables: 1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++ 1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End: 192