home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 November / PCWorld_2000-11_cd.bin / Software / Topware / devc40 / _SETUP.6 / Group14 / stl_numeric.h < prev    next >
C/C++ Source or Header  |  2000-01-21  |  7KB  |  240 lines

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996,1997
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26.  
  27. /* NOTE: This is an internal header file, included by other STL headers.
  28.  *   You should not attempt to use it directly.
  29.  */
  30.  
  31.  
  32. #ifndef __SGI_STL_INTERNAL_NUMERIC_H
  33. #define __SGI_STL_INTERNAL_NUMERIC_H
  34.  
  35. __STL_BEGIN_NAMESPACE
  36.  
  37. template <class _InputIterator, class _Tp>
  38. _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
  39. {
  40.   for ( ; __first != __last; ++__first)
  41.     __init = __init + *__first;
  42.   return __init;
  43. }
  44.  
  45. template <class _InputIterator, class _Tp, class _BinaryOperation>
  46. _Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
  47.                _BinaryOperation __binary_op)
  48. {
  49.   for ( ; __first != __last; ++__first)
  50.     __init = __binary_op(__init, *__first);
  51.   return __init;
  52. }
  53.  
  54. template <class _InputIterator1, class _InputIterator2, class _Tp>
  55. _Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
  56.                   _InputIterator2 __first2, _Tp __init)
  57. {
  58.   for ( ; __first1 != __last1; ++__first1, ++__first2)
  59.     __init = __init + (*__first1 * *__first2);
  60.   return __init;
  61. }
  62.  
  63. template <class _InputIterator1, class _InputIterator2, class _Tp,
  64.           class _BinaryOperation1, class _BinaryOperation2>
  65. _Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
  66.                   _InputIterator2 __first2, _Tp __init, 
  67.                   _BinaryOperation1 __binary_op1,
  68.                   _BinaryOperation2 __binary_op2)
  69. {
  70.   for ( ; __first1 != __last1; ++__first1, ++__first2)
  71.     __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
  72.   return __init;
  73. }
  74.  
  75. template <class _InputIterator, class _OutputIterator, class _Tp>
  76. _OutputIterator 
  77. __partial_sum(_InputIterator __first, _InputIterator __last,
  78.               _OutputIterator __result, _Tp*)
  79. {
  80.   _Tp __value = *__first;
  81.   while (++__first != __last) {
  82.     __value = __value + *__first;
  83.     *++__result = __value;
  84.   }
  85.   return ++__result;
  86. }
  87.  
  88. template <class _InputIterator, class _OutputIterator>
  89. _OutputIterator 
  90. partial_sum(_InputIterator __first, _InputIterator __last,
  91.             _OutputIterator __result)
  92. {
  93.   if (__first == __last) return __result;
  94.   *__result = *__first;
  95.   return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first));
  96. }
  97.  
  98. template <class _InputIterator, class _OutputIterator, class _Tp,
  99.           class _BinaryOperation>
  100. _OutputIterator 
  101. __partial_sum(_InputIterator __first, _InputIterator __last, 
  102.               _OutputIterator __result, _Tp*, _BinaryOperation __binary_op)
  103. {
  104.   _Tp __value = *__first;
  105.   while (++__first != __last) {
  106.     __value = __binary_op(__value, *__first);
  107.     *++__result = __value;
  108.   }
  109.   return ++__result;
  110. }
  111.  
  112. template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
  113. _OutputIterator 
  114. partial_sum(_InputIterator __first, _InputIterator __last,
  115.             _OutputIterator __result, _BinaryOperation __binary_op)
  116. {
  117.   if (__first == __last) return __result;
  118.   *__result = *__first;
  119.   return __partial_sum(__first, __last, __result, __VALUE_TYPE(__first), 
  120.                        __binary_op);
  121. }
  122.  
  123. template <class _InputIterator, class _OutputIterator, class _Tp>
  124. _OutputIterator 
  125. __adjacent_difference(_InputIterator __first, _InputIterator __last,
  126.                       _OutputIterator __result, _Tp*)
  127. {
  128.   _Tp __value = *__first;
  129.   while (++__first != __last) {
  130.     _Tp __tmp = *__first;
  131.     *++__result = __tmp - __value;
  132.     __value = __tmp;
  133.   }
  134.   return ++__result;
  135. }
  136.  
  137. template <class _InputIterator, class _OutputIterator>
  138. _OutputIterator
  139. adjacent_difference(_InputIterator __first,
  140.                     _InputIterator __last, _OutputIterator __result)
  141. {
  142.   if (__first == __last) return __result;
  143.   *__result = *__first;
  144.   return __adjacent_difference(__first, __last, __result,
  145.                                __VALUE_TYPE(__first));
  146. }
  147.  
  148. template <class _InputIterator, class _OutputIterator, class _Tp, 
  149.           class _BinaryOperation>
  150. _OutputIterator
  151. __adjacent_difference(_InputIterator __first, _InputIterator __last, 
  152.                       _OutputIterator __result, _Tp*,
  153.                       _BinaryOperation __binary_op) {
  154.   _Tp __value = *__first;
  155.   while (++__first != __last) {
  156.     _Tp __tmp = *__first;
  157.     *++__result = __binary_op(__tmp, __value);
  158.     __value = __tmp;
  159.   }
  160.   return ++__result;
  161. }
  162.  
  163. template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
  164. _OutputIterator 
  165. adjacent_difference(_InputIterator __first, _InputIterator __last,
  166.                     _OutputIterator __result, _BinaryOperation __binary_op)
  167. {
  168.   if (__first == __last) return __result;
  169.   *__result = *__first;
  170.   return __adjacent_difference(__first, __last, __result,
  171.                                __VALUE_TYPE(__first),
  172.                                __binary_op);
  173. }
  174.  
  175. // Returns __x ** __n, where __n >= 0.  _Note that "multiplication"
  176. // is required to be associative, but not necessarily commutative.
  177.  
  178.  
  179. template <class _Tp, class _Integer, class _MonoidOperation>
  180. _Tp __power(_Tp __x, _Integer __n, _MonoidOperation __oper)
  181. {
  182.   if (__n == 0)
  183.     return identity_element(__oper);
  184.   else {
  185.     while ((__n & 1) == 0) {
  186.       __n >>= 1;
  187.       __x = __oper(__x, __x);
  188.     }
  189.  
  190.     _Tp __result = __x;
  191.     __n >>= 1;
  192.     while (__n != 0) {
  193.       __x = __oper(__x, __x);
  194.       if ((__n & 1) != 0)
  195.         __result = __oper(__result, __x);
  196.       __n >>= 1;
  197.     }
  198.     return __result;
  199.   }
  200. }
  201.  
  202. template <class _Tp, class _Integer>
  203. inline _Tp __power(_Tp __x, _Integer __n)
  204. {
  205.   return __power(__x, __n, multiplies<_Tp>());
  206. }
  207.  
  208. // Alias for the internal name __power.  Note that power is an extension,
  209. // not part of the C++ standard.
  210.  
  211. template <class _Tp, class _Integer, class _MonoidOperation>
  212. inline _Tp power(_Tp __x, _Integer __n, _MonoidOperation __oper)
  213. {
  214.   return __power(__x, __n, __oper);
  215. }
  216.  
  217. template <class _Tp, class _Integer>
  218. inline _Tp power(_Tp __x, _Integer __n)
  219. {
  220.   return __power(__x, __n);
  221. }
  222.  
  223. // iota is not part of the C++ standard.  It is an extension.
  224.  
  225. template <class _ForwardIterator, class _Tp>
  226. void 
  227. iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value)
  228. {
  229.   while (__first != __last)
  230.     *__first++ = __value++;
  231. }
  232.  
  233. __STL_END_NAMESPACE
  234.  
  235. #endif /* __SGI_STL_INTERNAL_NUMERIC_H */
  236.  
  237. // Local Variables:
  238. // mode:C++
  239. // End:
  240.