xref: /openbsd-src/gnu/llvm/libcxx/include/numeric (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_NUMERIC
1146035553Spatrick#define _LIBCPP_NUMERIC
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    numeric synopsis
1546035553Spatrick
1646035553Spatricknamespace std
1746035553Spatrick{
1846035553Spatrick
1946035553Spatricktemplate <class InputIterator, class T>
2076d0caaeSpatrick    constexpr T  // constexpr since C++20
2146035553Spatrick    accumulate(InputIterator first, InputIterator last, T init);
2246035553Spatrick
2346035553Spatricktemplate <class InputIterator, class T, class BinaryOperation>
2476d0caaeSpatrick    constexpr T  // constexpr since C++20
2546035553Spatrick    accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);
2646035553Spatrick
2746035553Spatricktemplate<class InputIterator>
2876d0caaeSpatrick    constexpr typename iterator_traits<InputIterator>::value_type  // constexpr since C++20
2946035553Spatrick    reduce(InputIterator first, InputIterator last);  // C++17
3046035553Spatrick
3146035553Spatricktemplate<class InputIterator, class T>
3276d0caaeSpatrick    constexpr T  // constexpr since C++20
3346035553Spatrick    reduce(InputIterator first, InputIterator last, T init);  // C++17
3446035553Spatrick
3546035553Spatricktemplate<class InputIterator, class T, class BinaryOperation>
3676d0caaeSpatrick    constexpr T  // constexpr since C++20
3746035553Spatrick    reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);  // C++17
3846035553Spatrick
3946035553Spatricktemplate <class InputIterator1, class InputIterator2, class T>
4076d0caaeSpatrick    constexpr T  // constexpr since C++20
4146035553Spatrick    inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init);
4246035553Spatrick
4346035553Spatricktemplate <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2>
4476d0caaeSpatrick    constexpr T  // constexpr since C++20
4546035553Spatrick    inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
4646035553Spatrick                  T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);
4746035553Spatrick
4846035553Spatrick
4946035553Spatricktemplate<class InputIterator1, class InputIterator2, class T>
5076d0caaeSpatrick    constexpr T  // constexpr since C++20
5146035553Spatrick    transform_reduce(InputIterator1 first1, InputIterator1 last1,
5246035553Spatrick                     InputIterator2 first2, T init);  // C++17
5346035553Spatrick
5446035553Spatricktemplate<class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2>
5576d0caaeSpatrick    constexpr T  // constexpr since C++20
5646035553Spatrick    transform_reduce(InputIterator1 first1, InputIterator1 last1,
5746035553Spatrick                     InputIterator2 first2, T init,
5846035553Spatrick                     BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);  // C++17
5946035553Spatrick
6046035553Spatricktemplate<class InputIterator, class T, class BinaryOperation, class UnaryOperation>
6176d0caaeSpatrick    constexpr T  // constexpr since C++20
6246035553Spatrick    transform_reduce(InputIterator first, InputIterator last, T init,
6346035553Spatrick                     BinaryOperation binary_op, UnaryOperation unary_op);  // C++17
6446035553Spatrick
6546035553Spatricktemplate <class InputIterator, class OutputIterator>
6676d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
6746035553Spatrick    partial_sum(InputIterator first, InputIterator last, OutputIterator result);
6846035553Spatrick
6946035553Spatricktemplate <class InputIterator, class OutputIterator, class BinaryOperation>
7076d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
7146035553Spatrick    partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);
7246035553Spatrick
7346035553Spatricktemplate<class InputIterator, class OutputIterator, class T>
7476d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
7546035553Spatrick    exclusive_scan(InputIterator first, InputIterator last,
7646035553Spatrick                   OutputIterator result, T init); // C++17
7746035553Spatrick
7846035553Spatricktemplate<class InputIterator, class OutputIterator, class T, class BinaryOperation>
7976d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
8046035553Spatrick    exclusive_scan(InputIterator first, InputIterator last,
8146035553Spatrick                   OutputIterator result, T init, BinaryOperation binary_op); // C++17
8246035553Spatrick
8346035553Spatricktemplate<class InputIterator, class OutputIterator>
8476d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
8546035553Spatrick    inclusive_scan(InputIterator first, InputIterator last, OutputIterator result);  // C++17
8646035553Spatrick
8746035553Spatricktemplate<class InputIterator, class OutputIterator, class BinaryOperation>
8876d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
8946035553Spatrick    inclusive_scan(InputIterator first, InputIterator last,
9046035553Spatrick                   OutputIterator result, BinaryOperation binary_op);  // C++17
9146035553Spatrick
9246035553Spatricktemplate<class InputIterator, class OutputIterator, class BinaryOperation, class T>
9376d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
9446035553Spatrick    inclusive_scan(InputIterator first, InputIterator last,
9546035553Spatrick                   OutputIterator result, BinaryOperation binary_op, T init);  // C++17
9646035553Spatrick
9746035553Spatricktemplate<class InputIterator, class OutputIterator, class T,
9846035553Spatrick         class BinaryOperation, class UnaryOperation>
9976d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
10046035553Spatrick    transform_exclusive_scan(InputIterator first, InputIterator last,
10146035553Spatrick                             OutputIterator result, T init,
10246035553Spatrick                             BinaryOperation binary_op, UnaryOperation unary_op);  // C++17
10346035553Spatrick
10446035553Spatricktemplate<class InputIterator, class OutputIterator,
10546035553Spatrick         class BinaryOperation, class UnaryOperation>
10676d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
10746035553Spatrick    transform_inclusive_scan(InputIterator first, InputIterator last,
10846035553Spatrick                             OutputIterator result,
10946035553Spatrick                             BinaryOperation binary_op, UnaryOperation unary_op);  // C++17
11046035553Spatrick
11146035553Spatricktemplate<class InputIterator, class OutputIterator,
11246035553Spatrick         class BinaryOperation, class UnaryOperation, class T>
11376d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
11446035553Spatrick    transform_inclusive_scan(InputIterator first, InputIterator last,
11546035553Spatrick                             OutputIterator result,
11646035553Spatrick                             BinaryOperation binary_op, UnaryOperation unary_op,
11746035553Spatrick                             T init);  // C++17
11846035553Spatrick
11946035553Spatricktemplate <class InputIterator, class OutputIterator>
12076d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
12146035553Spatrick    adjacent_difference(InputIterator first, InputIterator last, OutputIterator result);
12246035553Spatrick
12346035553Spatricktemplate <class InputIterator, class OutputIterator, class BinaryOperation>
12476d0caaeSpatrick    constexpr OutputIterator  // constexpr since C++20
12546035553Spatrick    adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);
12646035553Spatrick
12746035553Spatricktemplate <class ForwardIterator, class T>
12876d0caaeSpatrick    constexpr void  // constexpr since C++20
12976d0caaeSpatrick    iota(ForwardIterator first, ForwardIterator last, T value);
13046035553Spatrick
13146035553Spatricktemplate <class M, class N>
13246035553Spatrick    constexpr common_type_t<M,N> gcd(M m, N n);    // C++17
13346035553Spatrick
13446035553Spatricktemplate <class M, class N>
13546035553Spatrick    constexpr common_type_t<M,N> lcm(M m, N n);    // C++17
13646035553Spatrick
13776d0caaeSpatricktemplate<class T>
13876d0caaeSpatrick    constexpr T midpoint(T a, T b) noexcept;  // C++20
13976d0caaeSpatrick
14076d0caaeSpatricktemplate<class T>
14176d0caaeSpatrick    constexpr T* midpoint(T* a, T* b);        // C++20
14246035553Spatrick
14346035553Spatrick}  // std
14446035553Spatrick
14546035553Spatrick*/
14646035553Spatrick
147*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
14846035553Spatrick#include <__config>
14976d0caaeSpatrick#include <cmath> // for isnormal
15046035553Spatrick#include <version>
15146035553Spatrick
152*4bdff4beSrobert#include <__numeric/accumulate.h>
153*4bdff4beSrobert#include <__numeric/adjacent_difference.h>
154*4bdff4beSrobert#include <__numeric/exclusive_scan.h>
155*4bdff4beSrobert#include <__numeric/gcd_lcm.h>
156*4bdff4beSrobert#include <__numeric/inclusive_scan.h>
157*4bdff4beSrobert#include <__numeric/inner_product.h>
158*4bdff4beSrobert#include <__numeric/iota.h>
159*4bdff4beSrobert#include <__numeric/midpoint.h>
160*4bdff4beSrobert#include <__numeric/partial_sum.h>
161*4bdff4beSrobert#include <__numeric/reduce.h>
162*4bdff4beSrobert#include <__numeric/transform_exclusive_scan.h>
163*4bdff4beSrobert#include <__numeric/transform_inclusive_scan.h>
164*4bdff4beSrobert#include <__numeric/transform_reduce.h>
165*4bdff4beSrobert
16646035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
16746035553Spatrick#  pragma GCC system_header
16846035553Spatrick#endif
16946035553Spatrick
17046035553Spatrick#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
17146035553Spatrick#   include <__pstl_numeric>
17246035553Spatrick#endif
17346035553Spatrick
174*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
175*4bdff4beSrobert#  include <concepts>
176*4bdff4beSrobert#  include <functional>
177*4bdff4beSrobert#  include <iterator>
178*4bdff4beSrobert#  include <type_traits>
179*4bdff4beSrobert#endif
180*4bdff4beSrobert
18146035553Spatrick#endif // _LIBCPP_NUMERIC
182