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