13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===---------------------------- numeric ---------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6*412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7*412dbebeSHoward Hinnant// Source Licenses. 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 5340c7ef90SHoward Hinnanttemplate <class ForwardIterator, class T> 5440c7ef90SHoward Hinnant void iota(ForwardIterator first, ForwardIterator last, T value); 5540c7ef90SHoward Hinnant 563e519524SHoward Hinnant} // std 573e519524SHoward Hinnant 583e519524SHoward Hinnant*/ 593e519524SHoward Hinnant 603e519524SHoward Hinnant#include <__config> 613e519524SHoward Hinnant#include <iterator> 623e519524SHoward Hinnant 633e519524SHoward Hinnant#pragma GCC system_header 643e519524SHoward Hinnant 653e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 663e519524SHoward Hinnant 673e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp> 683e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 693e519524SHoward Hinnant_Tp 703e519524SHoward Hinnantaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init) 713e519524SHoward Hinnant{ 723e519524SHoward Hinnant for (; __first != __last; ++__first) 733e519524SHoward Hinnant __init = __init + *__first; 743e519524SHoward Hinnant return __init; 753e519524SHoward Hinnant} 763e519524SHoward Hinnant 773e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp, class _BinaryOperation> 783e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 793e519524SHoward Hinnant_Tp 803e519524SHoward Hinnantaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op) 813e519524SHoward Hinnant{ 823e519524SHoward Hinnant for (; __first != __last; ++__first) 833e519524SHoward Hinnant __init = __binary_op(__init, *__first); 843e519524SHoward Hinnant return __init; 853e519524SHoward Hinnant} 863e519524SHoward Hinnant 873e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Tp> 883e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 893e519524SHoward Hinnant_Tp 903e519524SHoward Hinnantinner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) 913e519524SHoward Hinnant{ 923e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2) 933e519524SHoward Hinnant __init = __init + *__first1 * *__first2; 943e519524SHoward Hinnant return __init; 953e519524SHoward Hinnant} 963e519524SHoward Hinnant 973e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2> 983e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 993e519524SHoward Hinnant_Tp 1003e519524SHoward Hinnantinner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, 1013e519524SHoward Hinnant _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2) 1023e519524SHoward Hinnant{ 1033e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2) 1043e519524SHoward Hinnant __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); 1053e519524SHoward Hinnant return __init; 1063e519524SHoward Hinnant} 1073e519524SHoward Hinnant 1083e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1093e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1103e519524SHoward Hinnant_OutputIterator 1113e519524SHoward Hinnantpartial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1123e519524SHoward Hinnant{ 1133e519524SHoward Hinnant if (__first != __last) 1143e519524SHoward Hinnant { 1153e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t(*__first); 1163e519524SHoward Hinnant *__result = __t; 1173e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1183e519524SHoward Hinnant { 1193e519524SHoward Hinnant __t = __t + *__first; 1203e519524SHoward Hinnant *__result = __t; 1213e519524SHoward Hinnant } 1223e519524SHoward Hinnant } 1233e519524SHoward Hinnant return __result; 1243e519524SHoward Hinnant} 1253e519524SHoward Hinnant 1263e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation> 1273e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1283e519524SHoward Hinnant_OutputIterator 1293e519524SHoward Hinnantpartial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, 1303e519524SHoward Hinnant _BinaryOperation __binary_op) 1313e519524SHoward Hinnant{ 1323e519524SHoward Hinnant if (__first != __last) 1333e519524SHoward Hinnant { 1343e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t(*__first); 1353e519524SHoward Hinnant *__result = __t; 1363e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1373e519524SHoward Hinnant { 1383e519524SHoward Hinnant __t = __binary_op(__t, *__first); 1393e519524SHoward Hinnant *__result = __t; 1403e519524SHoward Hinnant } 1413e519524SHoward Hinnant } 1423e519524SHoward Hinnant return __result; 1433e519524SHoward Hinnant} 1443e519524SHoward Hinnant 1453e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1463e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1473e519524SHoward Hinnant_OutputIterator 1483e519524SHoward Hinnantadjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1493e519524SHoward Hinnant{ 1503e519524SHoward Hinnant if (__first != __last) 1513e519524SHoward Hinnant { 1523e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t1(*__first); 1533e519524SHoward Hinnant *__result = __t1; 1543e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1553e519524SHoward Hinnant { 1563e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t2(*__first); 1573e519524SHoward Hinnant *__result = __t2 - __t1; 1583e519524SHoward Hinnant __t1 = __t2; 1593e519524SHoward Hinnant } 1603e519524SHoward Hinnant } 1613e519524SHoward Hinnant return __result; 1623e519524SHoward Hinnant} 1633e519524SHoward Hinnant 1643e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation> 1653e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1663e519524SHoward Hinnant_OutputIterator 1673e519524SHoward Hinnantadjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result, 1683e519524SHoward Hinnant _BinaryOperation __binary_op) 1693e519524SHoward Hinnant{ 1703e519524SHoward Hinnant if (__first != __last) 1713e519524SHoward Hinnant { 1723e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t1(*__first); 1733e519524SHoward Hinnant *__result = __t1; 1743e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1753e519524SHoward Hinnant { 1763e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t2(*__first); 1773e519524SHoward Hinnant *__result = __binary_op(__t2, __t1); 1783e519524SHoward Hinnant __t1 = __t2; 1793e519524SHoward Hinnant } 1803e519524SHoward Hinnant } 1813e519524SHoward Hinnant return __result; 1823e519524SHoward Hinnant} 1833e519524SHoward Hinnant 18440c7ef90SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 18540c7ef90SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 18640c7ef90SHoward Hinnantvoid 18740c7ef90SHoward Hinnantiota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value) 18840c7ef90SHoward Hinnant{ 18940c7ef90SHoward Hinnant for (; __first != __last; ++__first, ++__value) 19040c7ef90SHoward Hinnant *__first = __value; 19140c7ef90SHoward Hinnant} 19240c7ef90SHoward Hinnant 1933e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 1943e519524SHoward Hinnant 1953e519524SHoward Hinnant#endif // _LIBCPP_NUMERIC 196