1e78f53d1SNikolas Klauser// -*- C++ -*- 2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser// 4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser// 8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_NUMERIC 11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_NUMERIC 12e78f53d1SNikolas Klauser 13e78f53d1SNikolas Klauser/* 14e78f53d1SNikolas Klauser numeric synopsis 15e78f53d1SNikolas Klauser 16e78f53d1SNikolas Klausernamespace std 17e78f53d1SNikolas Klauser{ 18e78f53d1SNikolas Klauser 19e78f53d1SNikolas Klausertemplate <class InputIterator, class T> 20e78f53d1SNikolas Klauser constexpr T // constexpr since C++20 21e78f53d1SNikolas Klauser accumulate(InputIterator first, InputIterator last, T init); 22e78f53d1SNikolas Klauser 23e78f53d1SNikolas Klausertemplate <class InputIterator, class T, class BinaryOperation> 24e78f53d1SNikolas Klauser constexpr T // constexpr since C++20 25e78f53d1SNikolas Klauser accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); 26e78f53d1SNikolas Klauser 27e78f53d1SNikolas Klausertemplate<class InputIterator> 28e78f53d1SNikolas Klauser constexpr typename iterator_traits<InputIterator>::value_type // constexpr since C++20 29e78f53d1SNikolas Klauser reduce(InputIterator first, InputIterator last); // C++17 30e78f53d1SNikolas Klauser 31e78f53d1SNikolas Klausertemplate<class InputIterator, class T> 32e78f53d1SNikolas Klauser constexpr T // constexpr since C++20 33e78f53d1SNikolas Klauser reduce(InputIterator first, InputIterator last, T init); // C++17 34e78f53d1SNikolas Klauser 35e78f53d1SNikolas Klausertemplate<class InputIterator, class T, class BinaryOperation> 36e78f53d1SNikolas Klauser constexpr T // constexpr since C++20 37e78f53d1SNikolas Klauser reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); // C++17 38e78f53d1SNikolas Klauser 39e78f53d1SNikolas Klausertemplate <class InputIterator1, class InputIterator2, class T> 40e78f53d1SNikolas Klauser constexpr T // constexpr since C++20 41e78f53d1SNikolas Klauser inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); 42e78f53d1SNikolas Klauser 43e78f53d1SNikolas Klausertemplate <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> 44e78f53d1SNikolas Klauser constexpr T // constexpr since C++20 45e78f53d1SNikolas Klauser inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, 46e78f53d1SNikolas Klauser T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); 47e78f53d1SNikolas Klauser 48e78f53d1SNikolas Klauser 49e78f53d1SNikolas Klausertemplate<class InputIterator1, class InputIterator2, class T> 50e78f53d1SNikolas Klauser constexpr T // constexpr since C++20 51e78f53d1SNikolas Klauser transform_reduce(InputIterator1 first1, InputIterator1 last1, 52e78f53d1SNikolas Klauser InputIterator2 first2, T init); // C++17 53e78f53d1SNikolas Klauser 54e78f53d1SNikolas Klausertemplate<class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> 55e78f53d1SNikolas Klauser constexpr T // constexpr since C++20 56e78f53d1SNikolas Klauser transform_reduce(InputIterator1 first1, InputIterator1 last1, 57e78f53d1SNikolas Klauser InputIterator2 first2, T init, 58e78f53d1SNikolas Klauser BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); // C++17 59e78f53d1SNikolas Klauser 60e78f53d1SNikolas Klausertemplate<class InputIterator, class T, class BinaryOperation, class UnaryOperation> 61e78f53d1SNikolas Klauser constexpr T // constexpr since C++20 62e78f53d1SNikolas Klauser transform_reduce(InputIterator first, InputIterator last, T init, 63e78f53d1SNikolas Klauser BinaryOperation binary_op, UnaryOperation unary_op); // C++17 64e78f53d1SNikolas Klauser 65e78f53d1SNikolas Klausertemplate <class InputIterator, class OutputIterator> 66e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 67e78f53d1SNikolas Klauser partial_sum(InputIterator first, InputIterator last, OutputIterator result); 68e78f53d1SNikolas Klauser 69e78f53d1SNikolas Klausertemplate <class InputIterator, class OutputIterator, class BinaryOperation> 70e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 71e78f53d1SNikolas Klauser partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); 72e78f53d1SNikolas Klauser 73e78f53d1SNikolas Klausertemplate<class InputIterator, class OutputIterator, class T> 74e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 75e78f53d1SNikolas Klauser exclusive_scan(InputIterator first, InputIterator last, 76e78f53d1SNikolas Klauser OutputIterator result, T init); // C++17 77e78f53d1SNikolas Klauser 78e78f53d1SNikolas Klausertemplate<class InputIterator, class OutputIterator, class T, class BinaryOperation> 79e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 80e78f53d1SNikolas Klauser exclusive_scan(InputIterator first, InputIterator last, 81e78f53d1SNikolas Klauser OutputIterator result, T init, BinaryOperation binary_op); // C++17 82e78f53d1SNikolas Klauser 83e78f53d1SNikolas Klausertemplate<class InputIterator, class OutputIterator> 84e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 85e78f53d1SNikolas Klauser inclusive_scan(InputIterator first, InputIterator last, OutputIterator result); // C++17 86e78f53d1SNikolas Klauser 87e78f53d1SNikolas Klausertemplate<class InputIterator, class OutputIterator, class BinaryOperation> 88e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 89e78f53d1SNikolas Klauser inclusive_scan(InputIterator first, InputIterator last, 90e78f53d1SNikolas Klauser OutputIterator result, BinaryOperation binary_op); // C++17 91e78f53d1SNikolas Klauser 92e78f53d1SNikolas Klausertemplate<class InputIterator, class OutputIterator, class BinaryOperation, class T> 93e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 94e78f53d1SNikolas Klauser inclusive_scan(InputIterator first, InputIterator last, 95e78f53d1SNikolas Klauser OutputIterator result, BinaryOperation binary_op, T init); // C++17 96e78f53d1SNikolas Klauser 97e78f53d1SNikolas Klausertemplate<class InputIterator, class OutputIterator, class T, 98e78f53d1SNikolas Klauser class BinaryOperation, class UnaryOperation> 99e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 100e78f53d1SNikolas Klauser transform_exclusive_scan(InputIterator first, InputIterator last, 101e78f53d1SNikolas Klauser OutputIterator result, T init, 102e78f53d1SNikolas Klauser BinaryOperation binary_op, UnaryOperation unary_op); // C++17 103e78f53d1SNikolas Klauser 104e78f53d1SNikolas Klausertemplate<class InputIterator, class OutputIterator, 105e78f53d1SNikolas Klauser class BinaryOperation, class UnaryOperation> 106e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 107e78f53d1SNikolas Klauser transform_inclusive_scan(InputIterator first, InputIterator last, 108e78f53d1SNikolas Klauser OutputIterator result, 109e78f53d1SNikolas Klauser BinaryOperation binary_op, UnaryOperation unary_op); // C++17 110e78f53d1SNikolas Klauser 111e78f53d1SNikolas Klausertemplate<class InputIterator, class OutputIterator, 112e78f53d1SNikolas Klauser class BinaryOperation, class UnaryOperation, class T> 113e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 114e78f53d1SNikolas Klauser transform_inclusive_scan(InputIterator first, InputIterator last, 115e78f53d1SNikolas Klauser OutputIterator result, 116e78f53d1SNikolas Klauser BinaryOperation binary_op, UnaryOperation unary_op, 117e78f53d1SNikolas Klauser T init); // C++17 118e78f53d1SNikolas Klauser 119e78f53d1SNikolas Klausertemplate <class InputIterator, class OutputIterator> 120e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 121e78f53d1SNikolas Klauser adjacent_difference(InputIterator first, InputIterator last, OutputIterator result); 122e78f53d1SNikolas Klauser 123e78f53d1SNikolas Klausertemplate <class InputIterator, class OutputIterator, class BinaryOperation> 124e78f53d1SNikolas Klauser constexpr OutputIterator // constexpr since C++20 125e78f53d1SNikolas Klauser adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); 126e78f53d1SNikolas Klauser 127e78f53d1SNikolas Klausertemplate <class ForwardIterator, class T> 128e78f53d1SNikolas Klauser constexpr void // constexpr since C++20 129e78f53d1SNikolas Klauser iota(ForwardIterator first, ForwardIterator last, T value); 130e78f53d1SNikolas Klauser 131e78f53d1SNikolas Klausertemplate <class M, class N> 132e78f53d1SNikolas Klauser constexpr common_type_t<M,N> gcd(M m, N n); // C++17 133e78f53d1SNikolas Klauser 134e78f53d1SNikolas Klausertemplate <class M, class N> 135e78f53d1SNikolas Klauser constexpr common_type_t<M,N> lcm(M m, N n); // C++17 136e78f53d1SNikolas Klauser 137e78f53d1SNikolas Klausertemplate<class T> 138e78f53d1SNikolas Klauser constexpr T midpoint(T a, T b) noexcept; // C++20 139e78f53d1SNikolas Klauser 140e78f53d1SNikolas Klausertemplate<class T> 141e78f53d1SNikolas Klauser constexpr T* midpoint(T* a, T* b); // C++20 142e78f53d1SNikolas Klauser 143e78f53d1SNikolas Klauser// [numeric.sat], saturation arithmetic 144e78f53d1SNikolas Klausertemplate<class T> 145e78f53d1SNikolas Klauserconstexpr T add_sat(T x, T y) noexcept; // freestanding, Since C++26 146e78f53d1SNikolas Klausertemplate<class T> 147e78f53d1SNikolas Klauserconstexpr T sub_sat(T x, T y) noexcept; // freestanding, Since C++26 148e78f53d1SNikolas Klausertemplate<class T> 149e78f53d1SNikolas Klauserconstexpr T mul_sat(T x, T y) noexcept; // freestanding, Since C++26 150e78f53d1SNikolas Klausertemplate<class T> 151e78f53d1SNikolas Klauserconstexpr T div_sat(T x, T y) noexcept; // freestanding, Since C++26 152e78f53d1SNikolas Klausertemplate<class T, class U> 153e78f53d1SNikolas Klauserconstexpr T saturate_cast(U x) noexcept; // freestanding, Since C++26 154e78f53d1SNikolas Klauser 155e78f53d1SNikolas Klauser} // std 156e78f53d1SNikolas Klauser 157e78f53d1SNikolas Klauser*/ 158e78f53d1SNikolas Klauser 15973fbae83SNikolas Klauser#include <__cxx03/__config> 160e78f53d1SNikolas Klauser 16173fbae83SNikolas Klauser#include <__cxx03/__numeric/accumulate.h> 16273fbae83SNikolas Klauser#include <__cxx03/__numeric/adjacent_difference.h> 16373fbae83SNikolas Klauser#include <__cxx03/__numeric/inner_product.h> 16473fbae83SNikolas Klauser#include <__cxx03/__numeric/iota.h> 16573fbae83SNikolas Klauser#include <__cxx03/__numeric/partial_sum.h> 166e78f53d1SNikolas Klauser 167e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 16873fbae83SNikolas Klauser# include <__cxx03/__numeric/exclusive_scan.h> 16973fbae83SNikolas Klauser# include <__cxx03/__numeric/gcd_lcm.h> 17073fbae83SNikolas Klauser# include <__cxx03/__numeric/inclusive_scan.h> 17173fbae83SNikolas Klauser# include <__cxx03/__numeric/pstl.h> 17273fbae83SNikolas Klauser# include <__cxx03/__numeric/reduce.h> 17373fbae83SNikolas Klauser# include <__cxx03/__numeric/transform_exclusive_scan.h> 17473fbae83SNikolas Klauser# include <__cxx03/__numeric/transform_inclusive_scan.h> 17573fbae83SNikolas Klauser# include <__cxx03/__numeric/transform_reduce.h> 176e78f53d1SNikolas Klauser#endif 177e78f53d1SNikolas Klauser 178e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 17973fbae83SNikolas Klauser# include <__cxx03/__numeric/midpoint.h> 18073fbae83SNikolas Klauser# include <__cxx03/__numeric/saturation_arithmetic.h> 181e78f53d1SNikolas Klauser#endif 182e78f53d1SNikolas Klauser 18373fbae83SNikolas Klauser#include <__cxx03/version> 184e78f53d1SNikolas Klauser 185e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 186e78f53d1SNikolas Klauser# pragma GCC system_header 187e78f53d1SNikolas Klauser#endif 188e78f53d1SNikolas Klauser 189e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 14 19073fbae83SNikolas Klauser# include <__cxx03/initializer_list> 19173fbae83SNikolas Klauser# include <__cxx03/limits> 192e78f53d1SNikolas Klauser#endif 193e78f53d1SNikolas Klauser 194e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 19573fbae83SNikolas Klauser# include <__cxx03/climits> 19673fbae83SNikolas Klauser# include <__cxx03/cmath> 19773fbae83SNikolas Klauser# include <__cxx03/concepts> 19873fbae83SNikolas Klauser# include <__cxx03/cstdint> 19973fbae83SNikolas Klauser# include <__cxx03/execution> 20073fbae83SNikolas Klauser# include <__cxx03/functional> 20173fbae83SNikolas Klauser# include <__cxx03/iterator> 20273fbae83SNikolas Klauser# include <__cxx03/new> 20373fbae83SNikolas Klauser# include <__cxx03/optional> 20473fbae83SNikolas Klauser# include <__cxx03/type_traits> 205e78f53d1SNikolas Klauser#endif 206e78f53d1SNikolas Klauser 207*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_NUMERIC 208