13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===---------------------------- numeric ---------------------------------===// 33e519524SHoward Hinnant// 4*5b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 63e519524SHoward Hinnant// This file is distributed under the University of Illinois Open Source 73e519524SHoward Hinnant// License. See LICENSE.TXT for details. 83e519524SHoward Hinnant// 93e519524SHoward Hinnant//===----------------------------------------------------------------------===// 103e519524SHoward Hinnant 113e519524SHoward Hinnant#ifndef _LIBCPP_NUMERIC 123e519524SHoward Hinnant#define _LIBCPP_NUMERIC 133e519524SHoward Hinnant 143e519524SHoward Hinnant/* 153e519524SHoward Hinnant numeric synopsis 163e519524SHoward Hinnant 173e519524SHoward Hinnantnamespace std 183e519524SHoward Hinnant{ 193e519524SHoward Hinnant 203e519524SHoward Hinnanttemplate <class InputIterator, class T> 213e519524SHoward Hinnant T 223e519524SHoward Hinnant accumulate(InputIterator first, InputIterator last, T init); 233e519524SHoward Hinnant 243e519524SHoward Hinnanttemplate <class InputIterator, class T, class BinaryOperation> 253e519524SHoward Hinnant T 263e519524SHoward Hinnant accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); 273e519524SHoward Hinnant 283e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class T> 293e519524SHoward Hinnant T 303e519524SHoward Hinnant inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); 313e519524SHoward Hinnant 323e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> 333e519524SHoward Hinnant T 343e519524SHoward Hinnant inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, 353e519524SHoward Hinnant T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); 363e519524SHoward Hinnant 373e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator> 383e519524SHoward Hinnant OutputIterator 393e519524SHoward Hinnant partial_sum(InputIterator first, InputIterator last, OutputIterator result); 403e519524SHoward Hinnant 413e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class BinaryOperation> 423e519524SHoward Hinnant OutputIterator 433e519524SHoward Hinnant partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); 443e519524SHoward Hinnant 453e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator> 463e519524SHoward Hinnant OutputIterator 473e519524SHoward Hinnant adjacent_difference(InputIterator first, InputIterator last, OutputIterator result); 483e519524SHoward Hinnant 493e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class BinaryOperation> 503e519524SHoward Hinnant OutputIterator 513e519524SHoward Hinnant adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); 523e519524SHoward Hinnant 533e519524SHoward Hinnant} // std 543e519524SHoward Hinnant 553e519524SHoward Hinnant*/ 563e519524SHoward Hinnant 573e519524SHoward Hinnant#include <__config> 583e519524SHoward Hinnant#include <iterator> 593e519524SHoward Hinnant 603e519524SHoward Hinnant#pragma GCC system_header 613e519524SHoward Hinnant 623e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 633e519524SHoward Hinnant 643e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp> 653e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 663e519524SHoward Hinnant_Tp 673e519524SHoward Hinnantaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init) 683e519524SHoward Hinnant{ 693e519524SHoward Hinnant for (; __first != __last; ++__first) 703e519524SHoward Hinnant __init = __init + *__first; 713e519524SHoward Hinnant return __init; 723e519524SHoward Hinnant} 733e519524SHoward Hinnant 743e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp, class _BinaryOperation> 753e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 763e519524SHoward Hinnant_Tp 773e519524SHoward Hinnantaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op) 783e519524SHoward Hinnant{ 793e519524SHoward Hinnant for (; __first != __last; ++__first) 803e519524SHoward Hinnant __init = __binary_op(__init, *__first); 813e519524SHoward Hinnant return __init; 823e519524SHoward Hinnant} 833e519524SHoward Hinnant 843e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Tp> 853e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 863e519524SHoward Hinnant_Tp 873e519524SHoward Hinnantinner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) 883e519524SHoward Hinnant{ 893e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2) 903e519524SHoward Hinnant __init = __init + *__first1 * *__first2; 913e519524SHoward Hinnant return __init; 923e519524SHoward Hinnant} 933e519524SHoward Hinnant 943e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2> 953e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 963e519524SHoward Hinnant_Tp 973e519524SHoward Hinnantinner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, 983e519524SHoward Hinnant _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2) 993e519524SHoward Hinnant{ 1003e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2) 1013e519524SHoward Hinnant __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); 1023e519524SHoward Hinnant return __init; 1033e519524SHoward Hinnant} 1043e519524SHoward Hinnant 1053e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1063e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1073e519524SHoward Hinnant_OutputIterator 1083e519524SHoward Hinnantpartial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1093e519524SHoward Hinnant{ 1103e519524SHoward Hinnant if (__first != __last) 1113e519524SHoward Hinnant { 1123e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t(*__first); 1133e519524SHoward Hinnant *__result = __t; 1143e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1153e519524SHoward Hinnant { 1163e519524SHoward Hinnant __t = __t + *__first; 1173e519524SHoward Hinnant *__result = __t; 1183e519524SHoward Hinnant } 1193e519524SHoward Hinnant } 1203e519524SHoward Hinnant return __result; 1213e519524SHoward Hinnant} 1223e519524SHoward Hinnant 1233e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation> 1243e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1253e519524SHoward Hinnant_OutputIterator 1263e519524SHoward Hinnantpartial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, 1273e519524SHoward Hinnant _BinaryOperation __binary_op) 1283e519524SHoward Hinnant{ 1293e519524SHoward Hinnant if (__first != __last) 1303e519524SHoward Hinnant { 1313e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t(*__first); 1323e519524SHoward Hinnant *__result = __t; 1333e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1343e519524SHoward Hinnant { 1353e519524SHoward Hinnant __t = __binary_op(__t, *__first); 1363e519524SHoward Hinnant *__result = __t; 1373e519524SHoward Hinnant } 1383e519524SHoward Hinnant } 1393e519524SHoward Hinnant return __result; 1403e519524SHoward Hinnant} 1413e519524SHoward Hinnant 1423e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1433e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1443e519524SHoward Hinnant_OutputIterator 1453e519524SHoward Hinnantadjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1463e519524SHoward Hinnant{ 1473e519524SHoward Hinnant if (__first != __last) 1483e519524SHoward Hinnant { 1493e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t1(*__first); 1503e519524SHoward Hinnant *__result = __t1; 1513e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1523e519524SHoward Hinnant { 1533e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t2(*__first); 1543e519524SHoward Hinnant *__result = __t2 - __t1; 1553e519524SHoward Hinnant __t1 = __t2; 1563e519524SHoward Hinnant } 1573e519524SHoward Hinnant } 1583e519524SHoward Hinnant return __result; 1593e519524SHoward Hinnant} 1603e519524SHoward Hinnant 1613e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation> 1623e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1633e519524SHoward Hinnant_OutputIterator 1643e519524SHoward Hinnantadjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result, 1653e519524SHoward Hinnant _BinaryOperation __binary_op) 1663e519524SHoward Hinnant{ 1673e519524SHoward Hinnant if (__first != __last) 1683e519524SHoward Hinnant { 1693e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t1(*__first); 1703e519524SHoward Hinnant *__result = __t1; 1713e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1723e519524SHoward Hinnant { 1733e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t2(*__first); 1743e519524SHoward Hinnant *__result = __binary_op(__t2, __t1); 1753e519524SHoward Hinnant __t1 = __t2; 1763e519524SHoward Hinnant } 1773e519524SHoward Hinnant } 1783e519524SHoward Hinnant return __result; 1793e519524SHoward Hinnant} 1803e519524SHoward Hinnant 1813e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 1823e519524SHoward Hinnant 1833e519524SHoward Hinnant#endif // _LIBCPP_NUMERIC 184