| // -*- C++ -*- |
| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef _LIBCPP_NUMERIC |
| #define _LIBCPP_NUMERIC |
| |
| /* |
| numeric synopsis |
| |
| namespace std |
| { |
| |
| template <class InputIterator, class T> |
| constexpr T // constexpr since C++20 |
| accumulate(InputIterator first, InputIterator last, T init); |
| |
| template <class InputIterator, class T, class BinaryOperation> |
| constexpr T // constexpr since C++20 |
| accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); |
| |
| template<class InputIterator> |
| constexpr typename iterator_traits<InputIterator>::value_type // constexpr since C++20 |
| reduce(InputIterator first, InputIterator last); // C++17 |
| |
| template<class InputIterator, class T> |
| constexpr T // constexpr since C++20 |
| reduce(InputIterator first, InputIterator last, T init); // C++17 |
| |
| template<class InputIterator, class T, class BinaryOperation> |
| constexpr T // constexpr since C++20 |
| reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); // C++17 |
| |
| template <class InputIterator1, class InputIterator2, class T> |
| constexpr T // constexpr since C++20 |
| inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); |
| |
| template <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> |
| constexpr T // constexpr since C++20 |
| inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, |
| T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); |
| |
| |
| template<class InputIterator1, class InputIterator2, class T> |
| constexpr T // constexpr since C++20 |
| transform_reduce(InputIterator1 first1, InputIterator1 last1, |
| InputIterator2 first2, T init); // C++17 |
| |
| template<class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> |
| constexpr T // constexpr since C++20 |
| transform_reduce(InputIterator1 first1, InputIterator1 last1, |
| InputIterator2 first2, T init, |
| BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); // C++17 |
| |
| template<class InputIterator, class T, class BinaryOperation, class UnaryOperation> |
| constexpr T // constexpr since C++20 |
| transform_reduce(InputIterator first, InputIterator last, T init, |
| BinaryOperation binary_op, UnaryOperation unary_op); // C++17 |
| |
| template <class InputIterator, class OutputIterator> |
| constexpr OutputIterator // constexpr since C++20 |
| partial_sum(InputIterator first, InputIterator last, OutputIterator result); |
| |
| template <class InputIterator, class OutputIterator, class BinaryOperation> |
| constexpr OutputIterator // constexpr since C++20 |
| partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); |
| |
| template<class InputIterator, class OutputIterator, class T> |
| constexpr OutputIterator // constexpr since C++20 |
| exclusive_scan(InputIterator first, InputIterator last, |
| OutputIterator result, T init); // C++17 |
| |
| template<class InputIterator, class OutputIterator, class T, class BinaryOperation> |
| constexpr OutputIterator // constexpr since C++20 |
| exclusive_scan(InputIterator first, InputIterator last, |
| OutputIterator result, T init, BinaryOperation binary_op); // C++17 |
| |
| template<class InputIterator, class OutputIterator> |
| constexpr OutputIterator // constexpr since C++20 |
| inclusive_scan(InputIterator first, InputIterator last, OutputIterator result); // C++17 |
| |
| template<class InputIterator, class OutputIterator, class BinaryOperation> |
| constexpr OutputIterator // constexpr since C++20 |
| inclusive_scan(InputIterator first, InputIterator last, |
| OutputIterator result, BinaryOperation binary_op); // C++17 |
| |
| template<class InputIterator, class OutputIterator, class BinaryOperation, class T> |
| constexpr OutputIterator // constexpr since C++20 |
| inclusive_scan(InputIterator first, InputIterator last, |
| OutputIterator result, BinaryOperation binary_op, T init); // C++17 |
| |
| template<class InputIterator, class OutputIterator, class T, |
| class BinaryOperation, class UnaryOperation> |
| constexpr OutputIterator // constexpr since C++20 |
| transform_exclusive_scan(InputIterator first, InputIterator last, |
| OutputIterator result, T init, |
| BinaryOperation binary_op, UnaryOperation unary_op); // C++17 |
| |
| template<class InputIterator, class OutputIterator, |
| class BinaryOperation, class UnaryOperation> |
| constexpr OutputIterator // constexpr since C++20 |
| transform_inclusive_scan(InputIterator first, InputIterator last, |
| OutputIterator result, |
| BinaryOperation binary_op, UnaryOperation unary_op); // C++17 |
| |
| template<class InputIterator, class OutputIterator, |
| class BinaryOperation, class UnaryOperation, class T> |
| constexpr OutputIterator // constexpr since C++20 |
| transform_inclusive_scan(InputIterator first, InputIterator last, |
| OutputIterator result, |
| BinaryOperation binary_op, UnaryOperation unary_op, |
| T init); // C++17 |
| |
| template <class InputIterator, class OutputIterator> |
| constexpr OutputIterator // constexpr since C++20 |
| adjacent_difference(InputIterator first, InputIterator last, OutputIterator result); |
| |
| template <class InputIterator, class OutputIterator, class BinaryOperation> |
| constexpr OutputIterator // constexpr since C++20 |
| adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); |
| |
| template <class ForwardIterator, class T> |
| constexpr void // constexpr since C++20 |
| iota(ForwardIterator first, ForwardIterator last, T value); |
| |
| template <class M, class N> |
| constexpr common_type_t<M,N> gcd(M m, N n); // C++17 |
| |
| template <class M, class N> |
| constexpr common_type_t<M,N> lcm(M m, N n); // C++17 |
| |
| template<class T> |
| constexpr T midpoint(T a, T b) noexcept; // C++20 |
| |
| template<class T> |
| constexpr T* midpoint(T* a, T* b); // C++20 |
| |
| } // std |
| |
| */ |
| |
| #include <__assert> // all public C++ headers provide the assertion handler |
| #include <__config> |
| #include <cmath> // for isnormal |
| #include <version> |
| |
| #include <__numeric/accumulate.h> |
| #include <__numeric/adjacent_difference.h> |
| #include <__numeric/exclusive_scan.h> |
| #include <__numeric/gcd_lcm.h> |
| #include <__numeric/inclusive_scan.h> |
| #include <__numeric/inner_product.h> |
| #include <__numeric/iota.h> |
| #include <__numeric/midpoint.h> |
| #include <__numeric/partial_sum.h> |
| #include <__numeric/reduce.h> |
| #include <__numeric/transform_exclusive_scan.h> |
| #include <__numeric/transform_inclusive_scan.h> |
| #include <__numeric/transform_reduce.h> |
| |
| #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
| # pragma GCC system_header |
| #endif |
| |
| #if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 |
| # include <__pstl_numeric> |
| #endif |
| |
| #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 |
| # include <concepts> |
| # include <functional> |
| # include <iterator> |
| #endif |
| |
| #endif // _LIBCPP_NUMERIC |