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