home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / stlpt453.zip / STLport-4.5.3 / stlport / stl / _numeric.c < prev    next >
C/C++ Source or Header  |  2002-02-02  |  3KB  |  105 lines

  1. /*
  2.  *
  3.  *
  4.  * Copyright (c) 1994
  5.  * Hewlett-Packard Company
  6.  *
  7.  * Copyright (c) 1996,1997
  8.  * Silicon Graphics Computer Systems, Inc.
  9.  *
  10.  * Copyright (c) 1997
  11.  * Moscow Center for SPARC Technology
  12.  *
  13.  * Copyright (c) 1999 
  14.  * Boris Fomitchev
  15.  *
  16.  * This material is provided "as is", with absolutely no warranty expressed
  17.  * or implied. Any use is at your own risk.
  18.  *
  19.  * Permission to use or copy this software for any purpose is hereby granted 
  20.  * without fee, provided the above notices are retained on all copies.
  21.  * Permission to modify the code and to distribute modified code is granted,
  22.  * provided the above notices are retained, and a notice that the code was
  23.  * modified is included with the above copyright notice.
  24.  *
  25.  */
  26. #ifndef _STLP_NUMERIC_C
  27. #define _STLP_NUMERIC_C
  28.  
  29. #ifndef _STLP_INTERNAL_NUMERIC_H
  30. # include <stl/_numeric.h>
  31. #endif
  32.  
  33. _STLP_BEGIN_NAMESPACE
  34.  
  35. template <class _InputIterator, class _OutputIterator, class _Tp,
  36.           class _BinaryOperation>
  37. _OutputIterator 
  38. __partial_sum(_InputIterator __first, _InputIterator __last, 
  39.               _OutputIterator __result, _Tp*, _BinaryOperation __binary_op)
  40. {
  41.   _STLP_DEBUG_CHECK(__check_range(__first, __last))
  42.   if (__first == __last) return __result;
  43.   *__result = *__first;
  44.  
  45.   _Tp __val = *__first;
  46.   while (++__first != __last) {
  47.     __val = __binary_op(__val, *__first);
  48.     *++__result = __val;
  49.   }
  50.   return ++__result;
  51. }
  52.  
  53. template <class _InputIterator, class _OutputIterator, class _Tp, 
  54.           class _BinaryOperation>
  55. _OutputIterator
  56. __adjacent_difference(_InputIterator __first, _InputIterator __last, 
  57.                       _OutputIterator __result, _Tp*,
  58.                       _BinaryOperation __binary_op) {
  59.   _STLP_DEBUG_CHECK(__check_range(__first, __last))
  60.   if (__first == __last) return __result;
  61.   *__result = *__first;
  62.   _Tp __val = *__first;
  63.   while (++__first != __last) {
  64.     _Tp __tmp = *__first;
  65.     *++__result = __binary_op(__tmp, __val);
  66.     __val = __tmp;
  67.   }
  68.   return ++__result;
  69. }
  70.  
  71.  
  72. template <class _Tp, class _Integer, class _MonoidOperation>
  73. _Tp __power(_Tp __x, _Integer __n, _MonoidOperation __opr) 
  74. {
  75.   _STLP_MPWFIX_TRY
  76.   if (__n == 0)
  77.     return __identity_element(__opr);
  78.   else {
  79.     while ((__n & 1) == 0) {
  80.       __n >>= 1;
  81.       __x = __opr(__x, __x);
  82.     }
  83.     _Tp __result = __x;
  84.     _STLP_MPWFIX_TRY
  85.     __n >>= 1;
  86.     while (__n != 0) {
  87.       __x = __opr(__x, __x);
  88.       if ((__n & 1) != 0)
  89.         __result = __opr(__result, __x);
  90.       __n >>= 1;
  91.     }
  92.     return __result;
  93.     _STLP_MPWFIX_CATCH
  94.   }
  95.   _STLP_MPWFIX_CATCH_ACTION(__x = _Tp())
  96. }
  97.  
  98. _STLP_END_NAMESPACE
  99.  
  100. #endif /*  _STLP_NUMERIC_C */
  101.  
  102. // Local Variables:
  103. // mode:C++
  104. // End:
  105.