19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_NUMERIC_C
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_NUMERIC_C
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_NUMERIC_H
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_numeric.h>
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _OutputIterator, class _Tp,
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _BinaryOperation>
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_OutputIterator
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__partial_sum(_InputIterator __first, _InputIterator __last,
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              _OutputIterator __result, _Tp*, _BinaryOperation __binary_op) {
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(__check_range(__first, __last))
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__first == __last) return __result;
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  *__result = *__first;
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Tp __val = *__first;
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while (++__first != __last) {
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __val = __binary_op(__val, *__first);
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *++__result = __val;
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return ++__result;
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _InputIterator, class _OutputIterator, class _Tp,
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          class _BinaryOperation>
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_OutputIterator
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__adjacent_difference(_InputIterator __first, _InputIterator __last,
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                      _OutputIterator __result, _Tp*,
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                      _BinaryOperation __binary_op) {
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DEBUG_CHECK(__check_range(__first, __last))
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__first == __last) return __result;
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  *__result = *__first;
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Tp __val = *__first;
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  while (++__first != __last) {
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Tp __tmp = *__first;
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    *++__result = __binary_op(__tmp, __val);
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __val = __tmp;
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return ++__result;
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Integer, class _MonoidOperation>
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Tp __power(_Tp __x, _Integer __n, _MonoidOperation __opr) {
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_MPWFIX_TRY
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__n == 0)
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __identity_element(__opr);
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while ((__n & 1) == 0) {
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __n >>= 1;
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __x = __opr(__x, __x);
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Tp __result = __x;
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_MPWFIX_TRY
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __n >>= 1;
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    while (__n != 0) {
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __x = __opr(__x, __x);
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if ((__n & 1) != 0)
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __result = __opr(__result, __x);
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __n >>= 1;
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __result;
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_MPWFIX_CATCH
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_MPWFIX_CATCH_ACTION(__x = _Tp())
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*  _STLP_NUMERIC_C */
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
107