xref: /netbsd-src/external/apache2/llvm/dist/libcxx/include/numeric (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg// -*- C++ -*-
2*4d6fc14bSjoerg//===---------------------------- numeric ---------------------------------===//
3*4d6fc14bSjoerg//
4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information.
6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4d6fc14bSjoerg//
8*4d6fc14bSjoerg//===----------------------------------------------------------------------===//
9*4d6fc14bSjoerg
10*4d6fc14bSjoerg#ifndef _LIBCPP_NUMERIC
11*4d6fc14bSjoerg#define _LIBCPP_NUMERIC
12*4d6fc14bSjoerg
13*4d6fc14bSjoerg/*
14*4d6fc14bSjoerg    numeric synopsis
15*4d6fc14bSjoerg
16*4d6fc14bSjoergnamespace std
17*4d6fc14bSjoerg{
18*4d6fc14bSjoerg
19*4d6fc14bSjoergtemplate <class InputIterator, class T>
20*4d6fc14bSjoerg    constexpr T  // constexpr since C++20
21*4d6fc14bSjoerg    accumulate(InputIterator first, InputIterator last, T init);
22*4d6fc14bSjoerg
23*4d6fc14bSjoergtemplate <class InputIterator, class T, class BinaryOperation>
24*4d6fc14bSjoerg    constexpr T  // constexpr since C++20
25*4d6fc14bSjoerg    accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);
26*4d6fc14bSjoerg
27*4d6fc14bSjoergtemplate<class InputIterator>
28*4d6fc14bSjoerg    constexpr typename iterator_traits<InputIterator>::value_type  // constexpr since C++20
29*4d6fc14bSjoerg    reduce(InputIterator first, InputIterator last);  // C++17
30*4d6fc14bSjoerg
31*4d6fc14bSjoergtemplate<class InputIterator, class T>
32*4d6fc14bSjoerg    constexpr T  // constexpr since C++20
33*4d6fc14bSjoerg    reduce(InputIterator first, InputIterator last, T init);  // C++17
34*4d6fc14bSjoerg
35*4d6fc14bSjoergtemplate<class InputIterator, class T, class BinaryOperation>
36*4d6fc14bSjoerg    constexpr T  // constexpr since C++20
37*4d6fc14bSjoerg    reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);  // C++17
38*4d6fc14bSjoerg
39*4d6fc14bSjoergtemplate <class InputIterator1, class InputIterator2, class T>
40*4d6fc14bSjoerg    constexpr T  // constexpr since C++20
41*4d6fc14bSjoerg    inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init);
42*4d6fc14bSjoerg
43*4d6fc14bSjoergtemplate <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2>
44*4d6fc14bSjoerg    constexpr T  // constexpr since C++20
45*4d6fc14bSjoerg    inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
46*4d6fc14bSjoerg                  T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);
47*4d6fc14bSjoerg
48*4d6fc14bSjoerg
49*4d6fc14bSjoergtemplate<class InputIterator1, class InputIterator2, class T>
50*4d6fc14bSjoerg    constexpr T  // constexpr since C++20
51*4d6fc14bSjoerg    transform_reduce(InputIterator1 first1, InputIterator1 last1,
52*4d6fc14bSjoerg                     InputIterator2 first2, T init);  // C++17
53*4d6fc14bSjoerg
54*4d6fc14bSjoergtemplate<class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2>
55*4d6fc14bSjoerg    constexpr T  // constexpr since C++20
56*4d6fc14bSjoerg    transform_reduce(InputIterator1 first1, InputIterator1 last1,
57*4d6fc14bSjoerg                     InputIterator2 first2, T init,
58*4d6fc14bSjoerg                     BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);  // C++17
59*4d6fc14bSjoerg
60*4d6fc14bSjoergtemplate<class InputIterator, class T, class BinaryOperation, class UnaryOperation>
61*4d6fc14bSjoerg    constexpr T  // constexpr since C++20
62*4d6fc14bSjoerg    transform_reduce(InputIterator first, InputIterator last, T init,
63*4d6fc14bSjoerg                     BinaryOperation binary_op, UnaryOperation unary_op);  // C++17
64*4d6fc14bSjoerg
65*4d6fc14bSjoergtemplate <class InputIterator, class OutputIterator>
66*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
67*4d6fc14bSjoerg    partial_sum(InputIterator first, InputIterator last, OutputIterator result);
68*4d6fc14bSjoerg
69*4d6fc14bSjoergtemplate <class InputIterator, class OutputIterator, class BinaryOperation>
70*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
71*4d6fc14bSjoerg    partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);
72*4d6fc14bSjoerg
73*4d6fc14bSjoergtemplate<class InputIterator, class OutputIterator, class T>
74*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
75*4d6fc14bSjoerg    exclusive_scan(InputIterator first, InputIterator last,
76*4d6fc14bSjoerg                   OutputIterator result, T init); // C++17
77*4d6fc14bSjoerg
78*4d6fc14bSjoergtemplate<class InputIterator, class OutputIterator, class T, class BinaryOperation>
79*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
80*4d6fc14bSjoerg    exclusive_scan(InputIterator first, InputIterator last,
81*4d6fc14bSjoerg                   OutputIterator result, T init, BinaryOperation binary_op); // C++17
82*4d6fc14bSjoerg
83*4d6fc14bSjoergtemplate<class InputIterator, class OutputIterator>
84*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
85*4d6fc14bSjoerg    inclusive_scan(InputIterator first, InputIterator last, OutputIterator result);  // C++17
86*4d6fc14bSjoerg
87*4d6fc14bSjoergtemplate<class InputIterator, class OutputIterator, class BinaryOperation>
88*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
89*4d6fc14bSjoerg    inclusive_scan(InputIterator first, InputIterator last,
90*4d6fc14bSjoerg                   OutputIterator result, BinaryOperation binary_op);  // C++17
91*4d6fc14bSjoerg
92*4d6fc14bSjoergtemplate<class InputIterator, class OutputIterator, class BinaryOperation, class T>
93*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
94*4d6fc14bSjoerg    inclusive_scan(InputIterator first, InputIterator last,
95*4d6fc14bSjoerg                   OutputIterator result, BinaryOperation binary_op, T init);  // C++17
96*4d6fc14bSjoerg
97*4d6fc14bSjoergtemplate<class InputIterator, class OutputIterator, class T,
98*4d6fc14bSjoerg         class BinaryOperation, class UnaryOperation>
99*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
100*4d6fc14bSjoerg    transform_exclusive_scan(InputIterator first, InputIterator last,
101*4d6fc14bSjoerg                             OutputIterator result, T init,
102*4d6fc14bSjoerg                             BinaryOperation binary_op, UnaryOperation unary_op);  // C++17
103*4d6fc14bSjoerg
104*4d6fc14bSjoergtemplate<class InputIterator, class OutputIterator,
105*4d6fc14bSjoerg         class BinaryOperation, class UnaryOperation>
106*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
107*4d6fc14bSjoerg    transform_inclusive_scan(InputIterator first, InputIterator last,
108*4d6fc14bSjoerg                             OutputIterator result,
109*4d6fc14bSjoerg                             BinaryOperation binary_op, UnaryOperation unary_op);  // C++17
110*4d6fc14bSjoerg
111*4d6fc14bSjoergtemplate<class InputIterator, class OutputIterator,
112*4d6fc14bSjoerg         class BinaryOperation, class UnaryOperation, class T>
113*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
114*4d6fc14bSjoerg    transform_inclusive_scan(InputIterator first, InputIterator last,
115*4d6fc14bSjoerg                             OutputIterator result,
116*4d6fc14bSjoerg                             BinaryOperation binary_op, UnaryOperation unary_op,
117*4d6fc14bSjoerg                             T init);  // C++17
118*4d6fc14bSjoerg
119*4d6fc14bSjoergtemplate <class InputIterator, class OutputIterator>
120*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
121*4d6fc14bSjoerg    adjacent_difference(InputIterator first, InputIterator last, OutputIterator result);
122*4d6fc14bSjoerg
123*4d6fc14bSjoergtemplate <class InputIterator, class OutputIterator, class BinaryOperation>
124*4d6fc14bSjoerg    constexpr OutputIterator  // constexpr since C++20
125*4d6fc14bSjoerg    adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);
126*4d6fc14bSjoerg
127*4d6fc14bSjoergtemplate <class ForwardIterator, class T>
128*4d6fc14bSjoerg    constexpr void  // constexpr since C++20
129*4d6fc14bSjoerg    iota(ForwardIterator first, ForwardIterator last, T value);
130*4d6fc14bSjoerg
131*4d6fc14bSjoergtemplate <class M, class N>
132*4d6fc14bSjoerg    constexpr common_type_t<M,N> gcd(M m, N n);    // C++17
133*4d6fc14bSjoerg
134*4d6fc14bSjoergtemplate <class M, class N>
135*4d6fc14bSjoerg    constexpr common_type_t<M,N> lcm(M m, N n);    // C++17
136*4d6fc14bSjoerg
137*4d6fc14bSjoergtemplate<class T>
138*4d6fc14bSjoerg    constexpr T midpoint(T a, T b) noexcept;  // C++20
139*4d6fc14bSjoerg
140*4d6fc14bSjoergtemplate<class T>
141*4d6fc14bSjoerg    constexpr T* midpoint(T* a, T* b);        // C++20
142*4d6fc14bSjoerg
143*4d6fc14bSjoerg}  // std
144*4d6fc14bSjoerg
145*4d6fc14bSjoerg*/
146*4d6fc14bSjoerg
147*4d6fc14bSjoerg#include <__config>
148*4d6fc14bSjoerg#include <__debug>
149*4d6fc14bSjoerg#include <cmath> // for isnormal
150*4d6fc14bSjoerg#include <functional>
151*4d6fc14bSjoerg#include <iterator>
152*4d6fc14bSjoerg#include <limits> // for numeric_limits
153*4d6fc14bSjoerg#include <version>
154*4d6fc14bSjoerg
155*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
156*4d6fc14bSjoerg#pragma GCC system_header
157*4d6fc14bSjoerg#endif
158*4d6fc14bSjoerg
159*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS
160*4d6fc14bSjoerg#include <__undef_macros>
161*4d6fc14bSjoerg
162*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD
163*4d6fc14bSjoerg
164*4d6fc14bSjoergtemplate <class _InputIterator, class _Tp>
165*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
166*4d6fc14bSjoerg_Tp
167*4d6fc14bSjoergaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
168*4d6fc14bSjoerg{
169*4d6fc14bSjoerg    for (; __first != __last; ++__first)
170*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
171*4d6fc14bSjoerg        __init = _VSTD::move(__init) + *__first;
172*4d6fc14bSjoerg#else
173*4d6fc14bSjoerg        __init = __init + *__first;
174*4d6fc14bSjoerg#endif
175*4d6fc14bSjoerg    return __init;
176*4d6fc14bSjoerg}
177*4d6fc14bSjoerg
178*4d6fc14bSjoergtemplate <class _InputIterator, class _Tp, class _BinaryOperation>
179*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
180*4d6fc14bSjoerg_Tp
181*4d6fc14bSjoergaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op)
182*4d6fc14bSjoerg{
183*4d6fc14bSjoerg    for (; __first != __last; ++__first)
184*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
185*4d6fc14bSjoerg        __init = __binary_op(_VSTD::move(__init), *__first);
186*4d6fc14bSjoerg#else
187*4d6fc14bSjoerg        __init = __binary_op(__init, *__first);
188*4d6fc14bSjoerg#endif
189*4d6fc14bSjoerg    return __init;
190*4d6fc14bSjoerg}
191*4d6fc14bSjoerg
192*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14
193*4d6fc14bSjoergtemplate <class _InputIterator, class _Tp, class _BinaryOp>
194*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
195*4d6fc14bSjoerg_Tp
196*4d6fc14bSjoergreduce(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOp __b)
197*4d6fc14bSjoerg{
198*4d6fc14bSjoerg    for (; __first != __last; ++__first)
199*4d6fc14bSjoerg        __init = __b(__init, *__first);
200*4d6fc14bSjoerg    return __init;
201*4d6fc14bSjoerg}
202*4d6fc14bSjoerg
203*4d6fc14bSjoergtemplate <class _InputIterator, class _Tp>
204*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
205*4d6fc14bSjoerg_Tp
206*4d6fc14bSjoergreduce(_InputIterator __first, _InputIterator __last, _Tp __init)
207*4d6fc14bSjoerg{
208*4d6fc14bSjoerg    return _VSTD::reduce(__first, __last, __init, _VSTD::plus<>());
209*4d6fc14bSjoerg}
210*4d6fc14bSjoerg
211*4d6fc14bSjoergtemplate <class _InputIterator>
212*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
213*4d6fc14bSjoergtypename iterator_traits<_InputIterator>::value_type
214*4d6fc14bSjoergreduce(_InputIterator __first, _InputIterator __last)
215*4d6fc14bSjoerg{
216*4d6fc14bSjoerg    return _VSTD::reduce(__first, __last,
217*4d6fc14bSjoerg       typename iterator_traits<_InputIterator>::value_type{});
218*4d6fc14bSjoerg}
219*4d6fc14bSjoerg#endif
220*4d6fc14bSjoerg
221*4d6fc14bSjoergtemplate <class _InputIterator1, class _InputIterator2, class _Tp>
222*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
223*4d6fc14bSjoerg_Tp
224*4d6fc14bSjoerginner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init)
225*4d6fc14bSjoerg{
226*4d6fc14bSjoerg    for (; __first1 != __last1; ++__first1, (void) ++__first2)
227*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
228*4d6fc14bSjoerg        __init = _VSTD::move(__init) + *__first1 * *__first2;
229*4d6fc14bSjoerg#else
230*4d6fc14bSjoerg        __init = __init + *__first1 * *__first2;
231*4d6fc14bSjoerg#endif
232*4d6fc14bSjoerg    return __init;
233*4d6fc14bSjoerg}
234*4d6fc14bSjoerg
235*4d6fc14bSjoergtemplate <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
236*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
237*4d6fc14bSjoerg_Tp
238*4d6fc14bSjoerginner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
239*4d6fc14bSjoerg              _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2)
240*4d6fc14bSjoerg{
241*4d6fc14bSjoerg    for (; __first1 != __last1; ++__first1, (void) ++__first2)
242*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
243*4d6fc14bSjoerg        __init = __binary_op1(_VSTD::move(__init), __binary_op2(*__first1, *__first2));
244*4d6fc14bSjoerg#else
245*4d6fc14bSjoerg        __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
246*4d6fc14bSjoerg#endif
247*4d6fc14bSjoerg    return __init;
248*4d6fc14bSjoerg}
249*4d6fc14bSjoerg
250*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14
251*4d6fc14bSjoergtemplate <class _InputIterator, class _Tp, class _BinaryOp, class _UnaryOp>
252*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
253*4d6fc14bSjoerg_Tp
254*4d6fc14bSjoergtransform_reduce(_InputIterator __first, _InputIterator __last,
255*4d6fc14bSjoerg           _Tp __init,  _BinaryOp __b, _UnaryOp __u)
256*4d6fc14bSjoerg{
257*4d6fc14bSjoerg    for (; __first != __last; ++__first)
258*4d6fc14bSjoerg        __init = __b(__init, __u(*__first));
259*4d6fc14bSjoerg    return __init;
260*4d6fc14bSjoerg}
261*4d6fc14bSjoerg
262*4d6fc14bSjoergtemplate <class _InputIterator1, class _InputIterator2,
263*4d6fc14bSjoerg          class _Tp, class _BinaryOp1, class _BinaryOp2>
264*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
265*4d6fc14bSjoerg_Tp
266*4d6fc14bSjoergtransform_reduce(_InputIterator1 __first1, _InputIterator1 __last1,
267*4d6fc14bSjoerg                 _InputIterator2 __first2, _Tp __init,  _BinaryOp1 __b1, _BinaryOp2 __b2)
268*4d6fc14bSjoerg{
269*4d6fc14bSjoerg    for (; __first1 != __last1; ++__first1, (void) ++__first2)
270*4d6fc14bSjoerg        __init = __b1(__init, __b2(*__first1, *__first2));
271*4d6fc14bSjoerg    return __init;
272*4d6fc14bSjoerg}
273*4d6fc14bSjoerg
274*4d6fc14bSjoergtemplate <class _InputIterator1, class _InputIterator2, class _Tp>
275*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
276*4d6fc14bSjoerg_Tp
277*4d6fc14bSjoergtransform_reduce(_InputIterator1 __first1, _InputIterator1 __last1,
278*4d6fc14bSjoerg                 _InputIterator2 __first2, _Tp __init)
279*4d6fc14bSjoerg{
280*4d6fc14bSjoerg    return _VSTD::transform_reduce(__first1, __last1, __first2, _VSTD::move(__init),
281*4d6fc14bSjoerg                                   _VSTD::plus<>(), _VSTD::multiplies<>());
282*4d6fc14bSjoerg}
283*4d6fc14bSjoerg#endif
284*4d6fc14bSjoerg
285*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator>
286*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
287*4d6fc14bSjoerg_OutputIterator
288*4d6fc14bSjoergpartial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
289*4d6fc14bSjoerg{
290*4d6fc14bSjoerg    if (__first != __last)
291*4d6fc14bSjoerg    {
292*4d6fc14bSjoerg        typename iterator_traits<_InputIterator>::value_type __t(*__first);
293*4d6fc14bSjoerg        *__result = __t;
294*4d6fc14bSjoerg        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
295*4d6fc14bSjoerg        {
296*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
297*4d6fc14bSjoerg            __t = _VSTD::move(__t) + *__first;
298*4d6fc14bSjoerg#else
299*4d6fc14bSjoerg            __t = __t + *__first;
300*4d6fc14bSjoerg#endif
301*4d6fc14bSjoerg            *__result = __t;
302*4d6fc14bSjoerg        }
303*4d6fc14bSjoerg    }
304*4d6fc14bSjoerg    return __result;
305*4d6fc14bSjoerg}
306*4d6fc14bSjoerg
307*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation>
308*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
309*4d6fc14bSjoerg_OutputIterator
310*4d6fc14bSjoergpartial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
311*4d6fc14bSjoerg              _BinaryOperation __binary_op)
312*4d6fc14bSjoerg{
313*4d6fc14bSjoerg    if (__first != __last)
314*4d6fc14bSjoerg    {
315*4d6fc14bSjoerg        typename iterator_traits<_InputIterator>::value_type __t(*__first);
316*4d6fc14bSjoerg        *__result = __t;
317*4d6fc14bSjoerg        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
318*4d6fc14bSjoerg        {
319*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
320*4d6fc14bSjoerg            __t = __binary_op(_VSTD::move(__t), *__first);
321*4d6fc14bSjoerg#else
322*4d6fc14bSjoerg            __t = __binary_op(__t, *__first);
323*4d6fc14bSjoerg#endif
324*4d6fc14bSjoerg            *__result = __t;
325*4d6fc14bSjoerg        }
326*4d6fc14bSjoerg    }
327*4d6fc14bSjoerg    return __result;
328*4d6fc14bSjoerg}
329*4d6fc14bSjoerg
330*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14
331*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp>
332*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
333*4d6fc14bSjoerg_OutputIterator
334*4d6fc14bSjoergexclusive_scan(_InputIterator __first, _InputIterator __last,
335*4d6fc14bSjoerg               _OutputIterator __result, _Tp __init, _BinaryOp __b)
336*4d6fc14bSjoerg{
337*4d6fc14bSjoerg    if (__first != __last)
338*4d6fc14bSjoerg    {
339*4d6fc14bSjoerg        _Tp __tmp(__b(__init, *__first));
340*4d6fc14bSjoerg        while (true)
341*4d6fc14bSjoerg        {
342*4d6fc14bSjoerg            *__result = _VSTD::move(__init);
343*4d6fc14bSjoerg            ++__result;
344*4d6fc14bSjoerg            ++__first;
345*4d6fc14bSjoerg            if (__first == __last)
346*4d6fc14bSjoerg                break;
347*4d6fc14bSjoerg            __init = _VSTD::move(__tmp);
348*4d6fc14bSjoerg            __tmp = __b(__init, *__first);
349*4d6fc14bSjoerg        }
350*4d6fc14bSjoerg    }
351*4d6fc14bSjoerg    return __result;
352*4d6fc14bSjoerg}
353*4d6fc14bSjoerg
354*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator, class _Tp>
355*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
356*4d6fc14bSjoerg_OutputIterator
357*4d6fc14bSjoergexclusive_scan(_InputIterator __first, _InputIterator __last,
358*4d6fc14bSjoerg               _OutputIterator __result, _Tp __init)
359*4d6fc14bSjoerg{
360*4d6fc14bSjoerg    return _VSTD::exclusive_scan(__first, __last, __result, __init, _VSTD::plus<>());
361*4d6fc14bSjoerg}
362*4d6fc14bSjoerg
363*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp>
364*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
365*4d6fc14bSjoerg_OutputIterator inclusive_scan(_InputIterator __first, _InputIterator __last,
366*4d6fc14bSjoerg                               _OutputIterator __result, _BinaryOp __b,  _Tp __init)
367*4d6fc14bSjoerg{
368*4d6fc14bSjoerg    for (; __first != __last; ++__first, (void) ++__result) {
369*4d6fc14bSjoerg        __init = __b(__init, *__first);
370*4d6fc14bSjoerg        *__result = __init;
371*4d6fc14bSjoerg    }
372*4d6fc14bSjoerg    return __result;
373*4d6fc14bSjoerg}
374*4d6fc14bSjoerg
375*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator, class _BinaryOp>
376*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
377*4d6fc14bSjoerg_OutputIterator inclusive_scan(_InputIterator __first, _InputIterator __last,
378*4d6fc14bSjoerg                               _OutputIterator __result, _BinaryOp __b)
379*4d6fc14bSjoerg{
380*4d6fc14bSjoerg    if (__first != __last) {
381*4d6fc14bSjoerg        typename iterator_traits<_InputIterator>::value_type __init = *__first;
382*4d6fc14bSjoerg        *__result++ = __init;
383*4d6fc14bSjoerg        if (++__first != __last)
384*4d6fc14bSjoerg            return _VSTD::inclusive_scan(__first, __last, __result, __b, __init);
385*4d6fc14bSjoerg    }
386*4d6fc14bSjoerg
387*4d6fc14bSjoerg    return __result;
388*4d6fc14bSjoerg}
389*4d6fc14bSjoerg
390*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator>
391*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
392*4d6fc14bSjoerg_OutputIterator inclusive_scan(_InputIterator __first, _InputIterator __last,
393*4d6fc14bSjoerg                               _OutputIterator __result)
394*4d6fc14bSjoerg{
395*4d6fc14bSjoerg    return _VSTD::inclusive_scan(__first, __last, __result, _VSTD::plus<>());
396*4d6fc14bSjoerg}
397*4d6fc14bSjoerg
398*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator, class _Tp,
399*4d6fc14bSjoerg          class _BinaryOp, class _UnaryOp>
400*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
401*4d6fc14bSjoerg_OutputIterator
402*4d6fc14bSjoergtransform_exclusive_scan(_InputIterator __first, _InputIterator __last,
403*4d6fc14bSjoerg                           _OutputIterator __result, _Tp __init,
404*4d6fc14bSjoerg                           _BinaryOp __b, _UnaryOp __u)
405*4d6fc14bSjoerg{
406*4d6fc14bSjoerg    if (__first != __last)
407*4d6fc14bSjoerg    {
408*4d6fc14bSjoerg        _Tp __saved = __init;
409*4d6fc14bSjoerg        do
410*4d6fc14bSjoerg        {
411*4d6fc14bSjoerg            __init = __b(__init, __u(*__first));
412*4d6fc14bSjoerg            *__result = __saved;
413*4d6fc14bSjoerg            __saved = __init;
414*4d6fc14bSjoerg            ++__result;
415*4d6fc14bSjoerg        } while (++__first != __last);
416*4d6fc14bSjoerg    }
417*4d6fc14bSjoerg    return __result;
418*4d6fc14bSjoerg}
419*4d6fc14bSjoerg
420*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp, class _UnaryOp>
421*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
422*4d6fc14bSjoerg_OutputIterator
423*4d6fc14bSjoergtransform_inclusive_scan(_InputIterator __first, _InputIterator __last,
424*4d6fc14bSjoerg                           _OutputIterator __result, _BinaryOp __b, _UnaryOp __u, _Tp __init)
425*4d6fc14bSjoerg{
426*4d6fc14bSjoerg    for (; __first != __last; ++__first, (void) ++__result) {
427*4d6fc14bSjoerg        __init = __b(__init, __u(*__first));
428*4d6fc14bSjoerg        *__result = __init;
429*4d6fc14bSjoerg        }
430*4d6fc14bSjoerg
431*4d6fc14bSjoerg    return __result;
432*4d6fc14bSjoerg}
433*4d6fc14bSjoerg
434*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator, class _BinaryOp, class _UnaryOp>
435*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
436*4d6fc14bSjoerg_OutputIterator
437*4d6fc14bSjoergtransform_inclusive_scan(_InputIterator __first, _InputIterator __last,
438*4d6fc14bSjoerg                               _OutputIterator __result, _BinaryOp __b, _UnaryOp __u)
439*4d6fc14bSjoerg{
440*4d6fc14bSjoerg    if (__first != __last) {
441*4d6fc14bSjoerg        typename iterator_traits<_InputIterator>::value_type __init = __u(*__first);
442*4d6fc14bSjoerg        *__result++ = __init;
443*4d6fc14bSjoerg        if (++__first != __last)
444*4d6fc14bSjoerg            return _VSTD::transform_inclusive_scan(__first, __last, __result, __b, __u, __init);
445*4d6fc14bSjoerg    }
446*4d6fc14bSjoerg
447*4d6fc14bSjoerg    return __result;
448*4d6fc14bSjoerg}
449*4d6fc14bSjoerg#endif
450*4d6fc14bSjoerg
451*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator>
452*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
453*4d6fc14bSjoerg_OutputIterator
454*4d6fc14bSjoergadjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
455*4d6fc14bSjoerg{
456*4d6fc14bSjoerg    if (__first != __last)
457*4d6fc14bSjoerg    {
458*4d6fc14bSjoerg        typename iterator_traits<_InputIterator>::value_type __acc(*__first);
459*4d6fc14bSjoerg        *__result = __acc;
460*4d6fc14bSjoerg        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
461*4d6fc14bSjoerg        {
462*4d6fc14bSjoerg            typename iterator_traits<_InputIterator>::value_type __val(*__first);
463*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
464*4d6fc14bSjoerg            *__result = __val - _VSTD::move(__acc);
465*4d6fc14bSjoerg#else
466*4d6fc14bSjoerg            *__result = __val - __acc;
467*4d6fc14bSjoerg#endif
468*4d6fc14bSjoerg            __acc = _VSTD::move(__val);
469*4d6fc14bSjoerg        }
470*4d6fc14bSjoerg    }
471*4d6fc14bSjoerg    return __result;
472*4d6fc14bSjoerg}
473*4d6fc14bSjoerg
474*4d6fc14bSjoergtemplate <class _InputIterator, class _OutputIterator, class _BinaryOperation>
475*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
476*4d6fc14bSjoerg_OutputIterator
477*4d6fc14bSjoergadjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
478*4d6fc14bSjoerg                      _BinaryOperation __binary_op)
479*4d6fc14bSjoerg{
480*4d6fc14bSjoerg    if (__first != __last)
481*4d6fc14bSjoerg    {
482*4d6fc14bSjoerg        typename iterator_traits<_InputIterator>::value_type __acc(*__first);
483*4d6fc14bSjoerg        *__result = __acc;
484*4d6fc14bSjoerg        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result)
485*4d6fc14bSjoerg        {
486*4d6fc14bSjoerg            typename iterator_traits<_InputIterator>::value_type __val(*__first);
487*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
488*4d6fc14bSjoerg            *__result = __binary_op(__val, _VSTD::move(__acc));
489*4d6fc14bSjoerg#else
490*4d6fc14bSjoerg            *__result = __binary_op(__val, __acc);
491*4d6fc14bSjoerg#endif
492*4d6fc14bSjoerg            __acc = _VSTD::move(__val);
493*4d6fc14bSjoerg        }
494*4d6fc14bSjoerg    }
495*4d6fc14bSjoerg    return __result;
496*4d6fc14bSjoerg}
497*4d6fc14bSjoerg
498*4d6fc14bSjoergtemplate <class _ForwardIterator, class _Tp>
499*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
500*4d6fc14bSjoergvoid
501*4d6fc14bSjoergiota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_)
502*4d6fc14bSjoerg{
503*4d6fc14bSjoerg    for (; __first != __last; ++__first, (void) ++__value_)
504*4d6fc14bSjoerg        *__first = __value_;
505*4d6fc14bSjoerg}
506*4d6fc14bSjoerg
507*4d6fc14bSjoerg
508*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14
509*4d6fc14bSjoergtemplate <typename _Result, typename _Source, bool _IsSigned = is_signed<_Source>::value> struct __ct_abs;
510*4d6fc14bSjoerg
511*4d6fc14bSjoergtemplate <typename _Result, typename _Source>
512*4d6fc14bSjoergstruct __ct_abs<_Result, _Source, true> {
513*4d6fc14bSjoerg    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
514*4d6fc14bSjoerg    _Result operator()(_Source __t) const noexcept
515*4d6fc14bSjoerg    {
516*4d6fc14bSjoerg        if (__t >= 0) return __t;
517*4d6fc14bSjoerg        if (__t == numeric_limits<_Source>::min()) return -static_cast<_Result>(__t);
518*4d6fc14bSjoerg        return -__t;
519*4d6fc14bSjoerg    }
520*4d6fc14bSjoerg};
521*4d6fc14bSjoerg
522*4d6fc14bSjoergtemplate <typename _Result, typename _Source>
523*4d6fc14bSjoergstruct __ct_abs<_Result, _Source, false> {
524*4d6fc14bSjoerg    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
525*4d6fc14bSjoerg    _Result operator()(_Source __t) const noexcept { return __t; }
526*4d6fc14bSjoerg};
527*4d6fc14bSjoerg
528*4d6fc14bSjoerg
529*4d6fc14bSjoergtemplate<class _Tp>
530*4d6fc14bSjoerg_LIBCPP_CONSTEXPR _LIBCPP_HIDDEN
531*4d6fc14bSjoerg_Tp __gcd(_Tp __m, _Tp __n)
532*4d6fc14bSjoerg{
533*4d6fc14bSjoerg    static_assert((!is_signed<_Tp>::value), "");
534*4d6fc14bSjoerg    return __n == 0 ? __m : _VSTD::__gcd<_Tp>(__n, __m % __n);
535*4d6fc14bSjoerg}
536*4d6fc14bSjoerg
537*4d6fc14bSjoerg
538*4d6fc14bSjoergtemplate<class _Tp, class _Up>
539*4d6fc14bSjoerg_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
540*4d6fc14bSjoergcommon_type_t<_Tp,_Up>
541*4d6fc14bSjoerggcd(_Tp __m, _Up __n)
542*4d6fc14bSjoerg{
543*4d6fc14bSjoerg    static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to gcd must be integer types");
544*4d6fc14bSjoerg    static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to gcd cannot be bool" );
545*4d6fc14bSjoerg    static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to gcd cannot be bool" );
546*4d6fc14bSjoerg    using _Rp = common_type_t<_Tp,_Up>;
547*4d6fc14bSjoerg    using _Wp = make_unsigned_t<_Rp>;
548*4d6fc14bSjoerg    return static_cast<_Rp>(_VSTD::__gcd(
549*4d6fc14bSjoerg        static_cast<_Wp>(__ct_abs<_Rp, _Tp>()(__m)),
550*4d6fc14bSjoerg        static_cast<_Wp>(__ct_abs<_Rp, _Up>()(__n))));
551*4d6fc14bSjoerg}
552*4d6fc14bSjoerg
553*4d6fc14bSjoergtemplate<class _Tp, class _Up>
554*4d6fc14bSjoerg_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
555*4d6fc14bSjoergcommon_type_t<_Tp,_Up>
556*4d6fc14bSjoerglcm(_Tp __m, _Up __n)
557*4d6fc14bSjoerg{
558*4d6fc14bSjoerg    static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to lcm must be integer types");
559*4d6fc14bSjoerg    static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to lcm cannot be bool" );
560*4d6fc14bSjoerg    static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to lcm cannot be bool" );
561*4d6fc14bSjoerg    if (__m == 0 || __n == 0)
562*4d6fc14bSjoerg        return 0;
563*4d6fc14bSjoerg
564*4d6fc14bSjoerg    using _Rp = common_type_t<_Tp,_Up>;
565*4d6fc14bSjoerg    _Rp __val1 = __ct_abs<_Rp, _Tp>()(__m) / _VSTD::gcd(__m, __n);
566*4d6fc14bSjoerg    _Rp __val2 = __ct_abs<_Rp, _Up>()(__n);
567*4d6fc14bSjoerg    _LIBCPP_ASSERT((numeric_limits<_Rp>::max() / __val1 > __val2), "Overflow in lcm");
568*4d6fc14bSjoerg    return __val1 * __val2;
569*4d6fc14bSjoerg}
570*4d6fc14bSjoerg
571*4d6fc14bSjoerg#endif /* _LIBCPP_STD_VER > 14 */
572*4d6fc14bSjoerg
573*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17
574*4d6fc14bSjoergtemplate <class _Tp>
575*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr
576*4d6fc14bSjoergenable_if_t<is_integral_v<_Tp> && !is_same_v<bool, _Tp> && !is_null_pointer_v<_Tp>, _Tp>
577*4d6fc14bSjoergmidpoint(_Tp __a, _Tp __b) noexcept
578*4d6fc14bSjoerg_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
579*4d6fc14bSjoerg{
580*4d6fc14bSjoerg    using _Up = make_unsigned_t<_Tp>;
581*4d6fc14bSjoerg    constexpr _Up __bitshift = numeric_limits<_Up>::digits - 1;
582*4d6fc14bSjoerg
583*4d6fc14bSjoerg    _Up __diff = _Up(__b) - _Up(__a);
584*4d6fc14bSjoerg    _Up __sign_bit = __b < __a;
585*4d6fc14bSjoerg
586*4d6fc14bSjoerg    _Up __half_diff = (__diff / 2) + (__sign_bit << __bitshift) + (__sign_bit & __diff);
587*4d6fc14bSjoerg
588*4d6fc14bSjoerg    return __a + __half_diff;
589*4d6fc14bSjoerg}
590*4d6fc14bSjoerg
591*4d6fc14bSjoerg
592*4d6fc14bSjoergtemplate <class _TPtr>
593*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr
594*4d6fc14bSjoergenable_if_t<is_pointer_v<_TPtr>
595*4d6fc14bSjoerg             && is_object_v<remove_pointer_t<_TPtr>>
596*4d6fc14bSjoerg             && ! is_void_v<remove_pointer_t<_TPtr>>
597*4d6fc14bSjoerg             && (sizeof(remove_pointer_t<_TPtr>) > 0), _TPtr>
598*4d6fc14bSjoergmidpoint(_TPtr __a, _TPtr __b) noexcept
599*4d6fc14bSjoerg{
600*4d6fc14bSjoerg    return __a + _VSTD::midpoint(ptrdiff_t(0), __b - __a);
601*4d6fc14bSjoerg}
602*4d6fc14bSjoerg
603*4d6fc14bSjoerg
604*4d6fc14bSjoergtemplate <typename _Tp>
605*4d6fc14bSjoergconstexpr int __sign(_Tp __val) {
606*4d6fc14bSjoerg    return (_Tp(0) < __val) - (__val < _Tp(0));
607*4d6fc14bSjoerg}
608*4d6fc14bSjoerg
609*4d6fc14bSjoergtemplate <typename _Fp>
610*4d6fc14bSjoergconstexpr _Fp __fp_abs(_Fp __f) { return __f >= 0 ? __f : -__f; }
611*4d6fc14bSjoerg
612*4d6fc14bSjoergtemplate <class _Fp>
613*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr
614*4d6fc14bSjoergenable_if_t<is_floating_point_v<_Fp>, _Fp>
615*4d6fc14bSjoergmidpoint(_Fp __a, _Fp __b) noexcept
616*4d6fc14bSjoerg{
617*4d6fc14bSjoerg    constexpr _Fp __lo = numeric_limits<_Fp>::min()*2;
618*4d6fc14bSjoerg    constexpr _Fp __hi = numeric_limits<_Fp>::max()/2;
619*4d6fc14bSjoerg    return __fp_abs(__a) <= __hi && __fp_abs(__b) <= __hi ?  // typical case: overflow is impossible
620*4d6fc14bSjoerg      (__a + __b)/2 :                                        // always correctly rounded
621*4d6fc14bSjoerg      __fp_abs(__a) < __lo ? __a + __b/2 :                   // not safe to halve a
622*4d6fc14bSjoerg      __fp_abs(__b) < __lo ? __a/2 + __b :                   // not safe to halve b
623*4d6fc14bSjoerg      __a/2 + __b/2;                                         // otherwise correctly rounded
624*4d6fc14bSjoerg}
625*4d6fc14bSjoerg
626*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER > 17
627*4d6fc14bSjoerg
628*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD
629*4d6fc14bSjoerg
630*4d6fc14bSjoerg_LIBCPP_POP_MACROS
631*4d6fc14bSjoerg
632*4d6fc14bSjoerg#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
633*4d6fc14bSjoerg#   include <__pstl_numeric>
634*4d6fc14bSjoerg#endif
635*4d6fc14bSjoerg
636*4d6fc14bSjoerg#endif // _LIBCPP_NUMERIC
637