213 lines · plain
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCPP_NUMERIC11#define _LIBCPP_NUMERIC12 13/*14 numeric synopsis15 16namespace std17{18 19template <class InputIterator, class T>20 constexpr T // constexpr since C++2021 accumulate(InputIterator first, InputIterator last, T init);22 23template <class InputIterator, class T, class BinaryOperation>24 constexpr T // constexpr since C++2025 accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);26 27template<class InputIterator>28 constexpr typename iterator_traits<InputIterator>::value_type // constexpr since C++2029 reduce(InputIterator first, InputIterator last); // C++1730 31template<class InputIterator, class T>32 constexpr T // constexpr since C++2033 reduce(InputIterator first, InputIterator last, T init); // C++1734 35template<class InputIterator, class T, class BinaryOperation>36 constexpr T // constexpr since C++2037 reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); // C++1738 39template <class InputIterator1, class InputIterator2, class T>40 constexpr T // constexpr since C++2041 inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init);42 43template <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2>44 constexpr T // constexpr since C++2045 inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,46 T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);47 48 49template<class InputIterator1, class InputIterator2, class T>50 constexpr T // constexpr since C++2051 transform_reduce(InputIterator1 first1, InputIterator1 last1,52 InputIterator2 first2, T init); // C++1753 54template<class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2>55 constexpr T // constexpr since C++2056 transform_reduce(InputIterator1 first1, InputIterator1 last1,57 InputIterator2 first2, T init,58 BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); // C++1759 60template<class InputIterator, class T, class BinaryOperation, class UnaryOperation>61 constexpr T // constexpr since C++2062 transform_reduce(InputIterator first, InputIterator last, T init,63 BinaryOperation binary_op, UnaryOperation unary_op); // C++1764 65template <class InputIterator, class OutputIterator>66 constexpr OutputIterator // constexpr since C++2067 partial_sum(InputIterator first, InputIterator last, OutputIterator result);68 69template <class InputIterator, class OutputIterator, class BinaryOperation>70 constexpr OutputIterator // constexpr since C++2071 partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);72 73template<class InputIterator, class OutputIterator, class T>74 constexpr OutputIterator // constexpr since C++2075 exclusive_scan(InputIterator first, InputIterator last,76 OutputIterator result, T init); // C++1777 78template<class InputIterator, class OutputIterator, class T, class BinaryOperation>79 constexpr OutputIterator // constexpr since C++2080 exclusive_scan(InputIterator first, InputIterator last,81 OutputIterator result, T init, BinaryOperation binary_op); // C++1782 83template<class InputIterator, class OutputIterator>84 constexpr OutputIterator // constexpr since C++2085 inclusive_scan(InputIterator first, InputIterator last, OutputIterator result); // C++1786 87template<class InputIterator, class OutputIterator, class BinaryOperation>88 constexpr OutputIterator // constexpr since C++2089 inclusive_scan(InputIterator first, InputIterator last,90 OutputIterator result, BinaryOperation binary_op); // C++1791 92template<class InputIterator, class OutputIterator, class BinaryOperation, class T>93 constexpr OutputIterator // constexpr since C++2094 inclusive_scan(InputIterator first, InputIterator last,95 OutputIterator result, BinaryOperation binary_op, T init); // C++1796 97template<class InputIterator, class OutputIterator, class T,98 class BinaryOperation, class UnaryOperation>99 constexpr OutputIterator // constexpr since C++20100 transform_exclusive_scan(InputIterator first, InputIterator last,101 OutputIterator result, T init,102 BinaryOperation binary_op, UnaryOperation unary_op); // C++17103 104template<class InputIterator, class OutputIterator,105 class BinaryOperation, class UnaryOperation>106 constexpr OutputIterator // constexpr since C++20107 transform_inclusive_scan(InputIterator first, InputIterator last,108 OutputIterator result,109 BinaryOperation binary_op, UnaryOperation unary_op); // C++17110 111template<class InputIterator, class OutputIterator,112 class BinaryOperation, class UnaryOperation, class T>113 constexpr OutputIterator // constexpr since C++20114 transform_inclusive_scan(InputIterator first, InputIterator last,115 OutputIterator result,116 BinaryOperation binary_op, UnaryOperation unary_op,117 T init); // C++17118 119template <class InputIterator, class OutputIterator>120 constexpr OutputIterator // constexpr since C++20121 adjacent_difference(InputIterator first, InputIterator last, OutputIterator result);122 123template <class InputIterator, class OutputIterator, class BinaryOperation>124 constexpr OutputIterator // constexpr since C++20125 adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);126 127template <class ForwardIterator, class T>128 constexpr void // constexpr since C++20129 iota(ForwardIterator first, ForwardIterator last, T value);130 131template <class M, class N>132 constexpr common_type_t<M,N> gcd(M m, N n); // C++17133 134template <class M, class N>135 constexpr common_type_t<M,N> lcm(M m, N n); // C++17136 137template<class T>138 constexpr T midpoint(T a, T b) noexcept; // C++20139 140template<class T>141 constexpr T* midpoint(T* a, T* b); // C++20142 143// [numeric.sat], saturation arithmetic144template<class T>145constexpr T add_sat(T x, T y) noexcept; // freestanding, Since C++26146template<class T>147constexpr T sub_sat(T x, T y) noexcept; // freestanding, Since C++26148template<class T>149constexpr T mul_sat(T x, T y) noexcept; // freestanding, Since C++26150template<class T>151constexpr T div_sat(T x, T y) noexcept; // freestanding, Since C++26152template<class T, class U>153constexpr T saturate_cast(U x) noexcept; // freestanding, Since C++26154 155} // std156 157*/158 159#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)160# include <__cxx03/numeric>161#else162# include <__config>163 164# include <__numeric/accumulate.h>165# include <__numeric/adjacent_difference.h>166# include <__numeric/inner_product.h>167# include <__numeric/iota.h>168# include <__numeric/partial_sum.h>169 170# if _LIBCPP_STD_VER >= 17171# include <__numeric/exclusive_scan.h>172# include <__numeric/gcd_lcm.h>173# include <__numeric/inclusive_scan.h>174# include <__numeric/pstl.h>175# include <__numeric/ranges_iota.h>176# include <__numeric/reduce.h>177# include <__numeric/transform_exclusive_scan.h>178# include <__numeric/transform_inclusive_scan.h>179# include <__numeric/transform_reduce.h>180# endif181 182# if _LIBCPP_STD_VER >= 20183# include <__numeric/midpoint.h>184# include <__numeric/saturation_arithmetic.h>185# endif186 187# include <version>188 189# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)190# pragma GCC system_header191# endif192 193# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 14194# include <initializer_list>195# include <limits>196# endif197 198# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20199# include <climits>200# include <cmath>201# include <concepts>202# include <cstdint>203# include <execution>204# include <functional>205# include <iterator>206# include <new>207# include <optional>208# include <type_traits>209# endif210#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)211 212#endif // _LIBCPP_NUMERIC213