13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===---------------------------- numeric ---------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7412dbebeSHoward 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 63073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 643e519524SHoward Hinnant#pragma GCC system_header 65073458b1SHoward Hinnant#endif 663e519524SHoward Hinnant 673e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 683e519524SHoward Hinnant 693e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp> 703e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 713e519524SHoward Hinnant_Tp 723e519524SHoward Hinnantaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init) 733e519524SHoward Hinnant{ 743e519524SHoward Hinnant for (; __first != __last; ++__first) 753e519524SHoward Hinnant __init = __init + *__first; 763e519524SHoward Hinnant return __init; 773e519524SHoward Hinnant} 783e519524SHoward Hinnant 793e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp, class _BinaryOperation> 803e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 813e519524SHoward Hinnant_Tp 823e519524SHoward Hinnantaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op) 833e519524SHoward Hinnant{ 843e519524SHoward Hinnant for (; __first != __last; ++__first) 853e519524SHoward Hinnant __init = __binary_op(__init, *__first); 863e519524SHoward Hinnant return __init; 873e519524SHoward Hinnant} 883e519524SHoward Hinnant 893e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Tp> 903e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 913e519524SHoward Hinnant_Tp 923e519524SHoward Hinnantinner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) 933e519524SHoward Hinnant{ 943e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2) 953e519524SHoward Hinnant __init = __init + *__first1 * *__first2; 963e519524SHoward Hinnant return __init; 973e519524SHoward Hinnant} 983e519524SHoward Hinnant 993e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2> 1003e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1013e519524SHoward Hinnant_Tp 1023e519524SHoward Hinnantinner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, 1033e519524SHoward Hinnant _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2) 1043e519524SHoward Hinnant{ 1053e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2) 1063e519524SHoward Hinnant __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); 1073e519524SHoward Hinnant return __init; 1083e519524SHoward Hinnant} 1093e519524SHoward Hinnant 1103e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1113e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1123e519524SHoward Hinnant_OutputIterator 1133e519524SHoward Hinnantpartial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1143e519524SHoward Hinnant{ 1153e519524SHoward Hinnant if (__first != __last) 1163e519524SHoward Hinnant { 1173e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t(*__first); 1183e519524SHoward Hinnant *__result = __t; 1193e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1203e519524SHoward Hinnant { 1213e519524SHoward Hinnant __t = __t + *__first; 1223e519524SHoward Hinnant *__result = __t; 1233e519524SHoward Hinnant } 1243e519524SHoward Hinnant } 1253e519524SHoward Hinnant return __result; 1263e519524SHoward Hinnant} 1273e519524SHoward Hinnant 1283e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation> 1293e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1303e519524SHoward Hinnant_OutputIterator 1313e519524SHoward Hinnantpartial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, 1323e519524SHoward Hinnant _BinaryOperation __binary_op) 1333e519524SHoward Hinnant{ 1343e519524SHoward Hinnant if (__first != __last) 1353e519524SHoward Hinnant { 1363e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t(*__first); 1373e519524SHoward Hinnant *__result = __t; 1383e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1393e519524SHoward Hinnant { 1403e519524SHoward Hinnant __t = __binary_op(__t, *__first); 1413e519524SHoward Hinnant *__result = __t; 1423e519524SHoward Hinnant } 1433e519524SHoward Hinnant } 1443e519524SHoward Hinnant return __result; 1453e519524SHoward Hinnant} 1463e519524SHoward Hinnant 1473e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1483e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1493e519524SHoward Hinnant_OutputIterator 1503e519524SHoward Hinnantadjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1513e519524SHoward Hinnant{ 1523e519524SHoward Hinnant if (__first != __last) 1533e519524SHoward Hinnant { 1543e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t1(*__first); 1553e519524SHoward Hinnant *__result = __t1; 1563e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1573e519524SHoward Hinnant { 1583e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t2(*__first); 1593e519524SHoward Hinnant *__result = __t2 - __t1; 160*9ff3203fSHoward Hinnant __t1 = _VSTD::move(__t2); 1613e519524SHoward Hinnant } 1623e519524SHoward Hinnant } 1633e519524SHoward Hinnant return __result; 1643e519524SHoward Hinnant} 1653e519524SHoward Hinnant 1663e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation> 1673e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1683e519524SHoward Hinnant_OutputIterator 1693e519524SHoward Hinnantadjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result, 1703e519524SHoward Hinnant _BinaryOperation __binary_op) 1713e519524SHoward Hinnant{ 1723e519524SHoward Hinnant if (__first != __last) 1733e519524SHoward Hinnant { 1743e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t1(*__first); 1753e519524SHoward Hinnant *__result = __t1; 1763e519524SHoward Hinnant for (++__first, ++__result; __first != __last; ++__first, ++__result) 1773e519524SHoward Hinnant { 1783e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t2(*__first); 1793e519524SHoward Hinnant *__result = __binary_op(__t2, __t1); 180*9ff3203fSHoward Hinnant __t1 = _VSTD::move(__t2); 1813e519524SHoward Hinnant } 1823e519524SHoward Hinnant } 1833e519524SHoward Hinnant return __result; 1843e519524SHoward Hinnant} 1853e519524SHoward Hinnant 18640c7ef90SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 18740c7ef90SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 18840c7ef90SHoward Hinnantvoid 189e4383379SHoward Hinnantiota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_) 19040c7ef90SHoward Hinnant{ 191e4383379SHoward Hinnant for (; __first != __last; ++__first, ++__value_) 192e4383379SHoward Hinnant *__first = __value_; 19340c7ef90SHoward Hinnant} 19440c7ef90SHoward Hinnant 1953e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 1963e519524SHoward Hinnant 1973e519524SHoward Hinnant#endif // _LIBCPP_NUMERIC 198