13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_ALGORITHM
113e519524SHoward Hinnant#define _LIBCPP_ALGORITHM
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    algorithm synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnant#include <initializer_list>
173e519524SHoward Hinnant
183e519524SHoward Hinnantnamespace std
193e519524SHoward Hinnant{
203e519524SHoward Hinnant
21d3729bb3SNikolas Klausernamespace ranges {
221e77b396SNikolas Klauser  template <class I, class F>
231e77b396SNikolas Klauser    struct in_fun_result;     // since C++20
241e77b396SNikolas Klauser
25d3729bb3SNikolas Klauser  template <class I1, class I2>
26d3729bb3SNikolas Klauser    struct in_in_result;      // since C++20
27f3514af4SNikolas Klauser
28f3514af4SNikolas Klauser  template <class I1, class I2, class O>
29f3514af4SNikolas Klauser    struct in_in_out_result;  // since C++20
30610979b3SNikolas Klauser
31610979b3SNikolas Klauser  template <class I, class O1, class O2>
32610979b3SNikolas Klauser    struct in_out_out_result; // since C++20
331e77b396SNikolas Klauser
34807766beSNikolas Klauser  template <class I1, class I2>
35807766beSNikolas Klauser    struct min_max_result;    // since C++20
36807766beSNikolas Klauser
3768f4131cSNikolas Klauser  template <class I>
3868f4131cSNikolas Klauser    struct in_found_result;   // since C++20
3968f4131cSNikolas Klauser
403b470d1cSNikolas Klauser  template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
413b470d1cSNikolas Klauser    indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>             // since C++20
423b470d1cSNikolas Klauser  constexpr I min_element(I first, S last, Comp comp = {}, Proj proj = {});
433b470d1cSNikolas Klauser
443b470d1cSNikolas Klauser  template<forward_range R, class Proj = identity,
453b470d1cSNikolas Klauser    indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> // since C++20
463b470d1cSNikolas Klauser  constexpr borrowed_iterator_t<R> min_element(R&& r, Comp comp = {}, Proj proj = {});
47c2cd15a6SNikolas Klauser
48c2cd15a6SNikolas Klauser  template <input_iterator I1, sentinel_for<_I1> S1, input_iterator I2, sentinel_for<_I2> S2,
49c2cd15a6SNikolas Klauser          class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
50c2cd15a6SNikolas Klauser    requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
51c2cd15a6SNikolas Klauser  constexpr mismatch_result<_I1, _I2>
52c2cd15a6SNikolas Klauser  mismatch()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20
53c2cd15a6SNikolas Klauser
54c2cd15a6SNikolas Klauser  template <input_range R1, input_range R2,
55c2cd15a6SNikolas Klauser          class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
56c2cd15a6SNikolas Klauser    requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
57c2cd15a6SNikolas Klauser  constexpr mismatch_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
58c2cd15a6SNikolas Klauser  mismatch(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {})                           // since C++20
59ee0f8c40SNikolas Klauser
60ee0f8c40SNikolas Klauser    requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
61ee0f8c40SNikolas Klauser    constexpr I find(I first, S last, const T& value, Proj proj = {});              // since C++20
62ee0f8c40SNikolas Klauser
63ee0f8c40SNikolas Klauser  template<input_range R, class T, class Proj = identity>
64ee0f8c40SNikolas Klauser    requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
65ee0f8c40SNikolas Klauser    constexpr borrowed_iterator_t<R>
66ee0f8c40SNikolas Klauser      find(R&& r, const T& value, Proj proj = {});                                  // since C++20
67ee0f8c40SNikolas Klauser
68ee0f8c40SNikolas Klauser  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
69ee0f8c40SNikolas Klauser           indirect_unary_predicate<projected<I, Proj>> Pred>
70ee0f8c40SNikolas Klauser    constexpr I find_if(I first, S last, Pred pred, Proj proj = {});                // since C++20
71ee0f8c40SNikolas Klauser
72ee0f8c40SNikolas Klauser  template<input_range R, class Proj = identity,
73ee0f8c40SNikolas Klauser           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
74ee0f8c40SNikolas Klauser    constexpr borrowed_iterator_t<R>
75ee0f8c40SNikolas Klauser      find_if(R&& r, Pred pred, Proj proj = {});                                    // since C++20
76ee0f8c40SNikolas Klauser
77ee0f8c40SNikolas Klauser  template<input_iterator I, sentinel_for<I> S, class Proj = identity,
78ee0f8c40SNikolas Klauser           indirect_unary_predicate<projected<I, Proj>> Pred>
79ee0f8c40SNikolas Klauser    constexpr I find_if_not(I first, S last, Pred pred, Proj proj = {});            // since C++20
80ee0f8c40SNikolas Klauser
81ee0f8c40SNikolas Klauser  template<input_range R, class Proj = identity,
82ee0f8c40SNikolas Klauser           indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
83ee0f8c40SNikolas Klauser    constexpr borrowed_iterator_t<R>
84ee0f8c40SNikolas Klauser      find_if_not(R&& r, Pred pred, Proj proj = {});                                // since C++20
85f83d833eSNikolas Klauser
86f83d833eSNikolas Klauser  template<class T, class Proj = identity,
87f83d833eSNikolas Klauser           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
88f83d833eSNikolas Klauser    constexpr const T& min(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20
89f83d833eSNikolas Klauser
90f83d833eSNikolas Klauser  template<copyable T, class Proj = identity,
91f83d833eSNikolas Klauser           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
92f83d833eSNikolas Klauser    constexpr T min(initializer_list<T> r, Comp comp = {}, Proj proj = {});         // since C++20
93f83d833eSNikolas Klauser
94f83d833eSNikolas Klauser template<input_range R, class Proj = identity,
95f83d833eSNikolas Klauser          indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
96f83d833eSNikolas Klauser   requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
97f83d833eSNikolas Klauser   constexpr range_value_t<R>
98f83d833eSNikolas Klauser     min(R&& r, Comp comp = {}, Proj proj = {});                                    // since C++20
99*e476df56SNikolas Klauser
100*e476df56SNikolas Klauser  template<class T, class Proj = identity,
101*e476df56SNikolas Klauser           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
102*e476df56SNikolas Klauser    constexpr const T& max(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20
103*e476df56SNikolas Klauser
104*e476df56SNikolas Klauser  template<copyable T, class Proj = identity,
105*e476df56SNikolas Klauser           indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
106*e476df56SNikolas Klauser    constexpr T max(initializer_list<T> r, Comp comp = {}, Proj proj = {});         // since C++20
107*e476df56SNikolas Klauser
108*e476df56SNikolas Klauser  template<input_range R, class Proj = identity,
109*e476df56SNikolas Klauser           indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
110*e476df56SNikolas Klauser    requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
111*e476df56SNikolas Klauser    constexpr range_value_t<R>
112*e476df56SNikolas Klauser      max(R&& r, Comp comp = {}, Proj proj = {});                                   // since C++20
113d3729bb3SNikolas Klauser}
114d3729bb3SNikolas Klauser
115706ffef7SMarshall Clow    constexpr bool     // constexpr in C++20
1163e519524SHoward Hinnant    all_of(InputIterator first, InputIterator last, Predicate pred);
1173e519524SHoward Hinnant
1183e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
119706ffef7SMarshall Clow    constexpr bool     // constexpr in C++20
1203e519524SHoward Hinnant    any_of(InputIterator first, InputIterator last, Predicate pred);
1213e519524SHoward Hinnant
1223e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
123706ffef7SMarshall Clow    constexpr bool     // constexpr in C++20
1243e519524SHoward Hinnant    none_of(InputIterator first, InputIterator last, Predicate pred);
1253e519524SHoward Hinnant
1263e519524SHoward Hinnanttemplate <class InputIterator, class Function>
1271b9a4ffdSMarshall Clow    constexpr Function          // constexpr in C++20
1283e519524SHoward Hinnant    for_each(InputIterator first, InputIterator last, Function f);
1293e519524SHoward Hinnant
130d5c65ffaSMarshall Clowtemplate<class InputIterator, class Size, class Function>
1311b9a4ffdSMarshall Clow    constexpr InputIterator     // constexpr in C++20
1321b9a4ffdSMarshall Clow    for_each_n(InputIterator first, Size n, Function f); // C++17
133d5c65ffaSMarshall Clow
1343e519524SHoward Hinnanttemplate <class InputIterator, class T>
13549c7643cSMarshall Clow    constexpr InputIterator     // constexpr in C++20
1363e519524SHoward Hinnant    find(InputIterator first, InputIterator last, const T& value);
1373e519524SHoward Hinnant
1383e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
13949c7643cSMarshall Clow    constexpr InputIterator     // constexpr in C++20
1403e519524SHoward Hinnant    find_if(InputIterator first, InputIterator last, Predicate pred);
1413e519524SHoward Hinnant
1423e519524SHoward Hinnanttemplate<class InputIterator, class Predicate>
143b8bc4e15SArthur O'Dwyer    constexpr InputIterator     // constexpr in C++20
1443e519524SHoward Hinnant    find_if_not(InputIterator first, InputIterator last, Predicate pred);
1453e519524SHoward Hinnant
1463e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
147b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator1  // constexpr in C++20
1483e519524SHoward Hinnant    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
1493e519524SHoward Hinnant             ForwardIterator2 first2, ForwardIterator2 last2);
1503e519524SHoward Hinnant
1513e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
152b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator1  // constexpr in C++20
1533e519524SHoward Hinnant    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
1543e519524SHoward Hinnant             ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
1553e519524SHoward Hinnant
1563e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
1578694428eSMarshall Clow    constexpr ForwardIterator1  // constexpr in C++20
1583e519524SHoward Hinnant    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
1593e519524SHoward Hinnant                  ForwardIterator2 first2, ForwardIterator2 last2);
1603e519524SHoward Hinnant
1613e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1628694428eSMarshall Clow    constexpr ForwardIterator1  // constexpr in C++20
1633e519524SHoward Hinnant    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
1643e519524SHoward Hinnant                  ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
1653e519524SHoward Hinnant
1663e519524SHoward Hinnanttemplate <class ForwardIterator>
1678694428eSMarshall Clow    constexpr ForwardIterator   // constexpr in C++20
1683e519524SHoward Hinnant    adjacent_find(ForwardIterator first, ForwardIterator last);
1693e519524SHoward Hinnant
1703e519524SHoward Hinnanttemplate <class ForwardIterator, class BinaryPredicate>
1718694428eSMarshall Clow    constexpr ForwardIterator   // constexpr in C++20
1723e519524SHoward Hinnant    adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
1733e519524SHoward Hinnant
1743e519524SHoward Hinnanttemplate <class InputIterator, class T>
175056f15e3SMarshall Clow    constexpr typename iterator_traits<InputIterator>::difference_type  // constexpr in C++20
1763e519524SHoward Hinnant    count(InputIterator first, InputIterator last, const T& value);
1773e519524SHoward Hinnant
1783e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
179056f15e3SMarshall Clow    constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
1803e519524SHoward Hinnant    count_if(InputIterator first, InputIterator last, Predicate pred);
1813e519524SHoward Hinnant
1823e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2>
1836538e28dSMarshall Clow    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
1843e519524SHoward Hinnant    mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
1853e519524SHoward Hinnant
1860b0bbd2fSMarshall Clowtemplate <class InputIterator1, class InputIterator2>
1876538e28dSMarshall Clow    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
1880b0bbd2fSMarshall Clow    mismatch(InputIterator1 first1, InputIterator1 last1,
1890b0bbd2fSMarshall Clow             InputIterator2 first2, InputIterator2 last2); // **C++14**
1900b0bbd2fSMarshall Clow
1913e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
1926538e28dSMarshall Clow    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
1933e519524SHoward Hinnant    mismatch(InputIterator1 first1, InputIterator1 last1,
1943e519524SHoward Hinnant             InputIterator2 first2, BinaryPredicate pred);
1953e519524SHoward Hinnant
1960b0bbd2fSMarshall Clowtemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
1976538e28dSMarshall Clow    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
1980b0bbd2fSMarshall Clow    mismatch(InputIterator1 first1, InputIterator1 last1,
1990b0bbd2fSMarshall Clow             InputIterator2 first2, InputIterator2 last2,
2000b0bbd2fSMarshall Clow             BinaryPredicate pred); // **C++14**
2010b0bbd2fSMarshall Clow
2023e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2>
2036538e28dSMarshall Clow    constexpr bool      // constexpr in C++20
2043e519524SHoward Hinnant    equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
2053e519524SHoward Hinnant
2060b0bbd2fSMarshall Clowtemplate <class InputIterator1, class InputIterator2>
2076538e28dSMarshall Clow    constexpr bool      // constexpr in C++20
2080b0bbd2fSMarshall Clow    equal(InputIterator1 first1, InputIterator1 last1,
2090b0bbd2fSMarshall Clow          InputIterator2 first2, InputIterator2 last2); // **C++14**
2100b0bbd2fSMarshall Clow
2113e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
2126538e28dSMarshall Clow    constexpr bool      // constexpr in C++20
2133e519524SHoward Hinnant    equal(InputIterator1 first1, InputIterator1 last1,
2143e519524SHoward Hinnant          InputIterator2 first2, BinaryPredicate pred);
2153e519524SHoward Hinnant
2160b0bbd2fSMarshall Clowtemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
2176538e28dSMarshall Clow    constexpr bool      // constexpr in C++20
2180b0bbd2fSMarshall Clow    equal(InputIterator1 first1, InputIterator1 last1,
2190b0bbd2fSMarshall Clow          InputIterator2 first2, InputIterator2 last2,
2200b0bbd2fSMarshall Clow          BinaryPredicate pred); // **C++14**
2210b0bbd2fSMarshall Clow
2223e519524SHoward Hinnanttemplate<class ForwardIterator1, class ForwardIterator2>
22349c7643cSMarshall Clow    constexpr bool      // constexpr in C++20
2243e519524SHoward Hinnant    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
2253e519524SHoward Hinnant                   ForwardIterator2 first2);
2263e519524SHoward Hinnant
2270b0bbd2fSMarshall Clowtemplate<class ForwardIterator1, class ForwardIterator2>
22849c7643cSMarshall Clow    constexpr bool      // constexpr in C++20
2290b0bbd2fSMarshall Clow    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
2300b0bbd2fSMarshall Clow                   ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
2310b0bbd2fSMarshall Clow
2323e519524SHoward Hinnanttemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
23349c7643cSMarshall Clow    constexpr bool      // constexpr in C++20
2343e519524SHoward Hinnant    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
2353e519524SHoward Hinnant                   ForwardIterator2 first2, BinaryPredicate pred);
2363e519524SHoward Hinnant
2370b0bbd2fSMarshall Clowtemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
23849c7643cSMarshall Clow    constexpr bool      // constexpr in C++20
2390b0bbd2fSMarshall Clow    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
2400b0bbd2fSMarshall Clow                   ForwardIterator2 first2, ForwardIterator2 last2,
2410b0bbd2fSMarshall Clow                   BinaryPredicate pred);  // **C++14**
2420b0bbd2fSMarshall Clow
2433e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
24412f0a779SMarshall Clow    constexpr ForwardIterator1      // constexpr in C++20
2453e519524SHoward Hinnant    search(ForwardIterator1 first1, ForwardIterator1 last1,
2463e519524SHoward Hinnant           ForwardIterator2 first2, ForwardIterator2 last2);
2473e519524SHoward Hinnant
2483e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
24912f0a779SMarshall Clow    constexpr ForwardIterator1      // constexpr in C++20
2503e519524SHoward Hinnant    search(ForwardIterator1 first1, ForwardIterator1 last1,
2513e519524SHoward Hinnant           ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
2523e519524SHoward Hinnant
2533e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T>
25412f0a779SMarshall Clow    constexpr ForwardIterator       // constexpr in C++20
2553e519524SHoward Hinnant    search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
2563e519524SHoward Hinnant
2573e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T, class BinaryPredicate>
25812f0a779SMarshall Clow    constexpr ForwardIterator       // constexpr in C++20
2593e519524SHoward Hinnant    search_n(ForwardIterator first, ForwardIterator last,
2603e519524SHoward Hinnant             Size count, const T& value, BinaryPredicate pred);
2613e519524SHoward Hinnant
2623e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator>
26313c90a57SLouis Dionne    constexpr OutputIterator      // constexpr in C++20
2643e519524SHoward Hinnant    copy(InputIterator first, InputIterator last, OutputIterator result);
2653e519524SHoward Hinnant
2663e519524SHoward Hinnanttemplate<class InputIterator, class OutputIterator, class Predicate>
26713c90a57SLouis Dionne    constexpr OutputIterator      // constexpr in C++20
2683e519524SHoward Hinnant    copy_if(InputIterator first, InputIterator last,
2693e519524SHoward Hinnant            OutputIterator result, Predicate pred);
2703e519524SHoward Hinnant
2713e519524SHoward Hinnanttemplate<class InputIterator, class Size, class OutputIterator>
27213c90a57SLouis Dionne    constexpr OutputIterator      // constexpr in C++20
2733e519524SHoward Hinnant    copy_n(InputIterator first, Size n, OutputIterator result);
2743e519524SHoward Hinnant
2753e519524SHoward Hinnanttemplate <class BidirectionalIterator1, class BidirectionalIterator2>
27613c90a57SLouis Dionne    constexpr BidirectionalIterator2      // constexpr in C++20
2773e519524SHoward Hinnant    copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
2783e519524SHoward Hinnant                  BidirectionalIterator2 result);
2793e519524SHoward Hinnant
2803e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
281b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator2    // constexpr in C++20
2823e519524SHoward Hinnant    swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
2833e519524SHoward Hinnant
2849d905319SNikolas Klausertemplate<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2>
2859d905319SNikolas Klauser        requires indirectly_swappable<I1, I2>
2869d905319SNikolas Klauser    constexpr ranges::swap_ranges_result<I1, I2>
2879d905319SNikolas Klauser        ranges::swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2);
2889d905319SNikolas Klauser
2899d905319SNikolas Klausertemplate<input_range R1, input_range R2>
2909d905319SNikolas Klauser        requires indirectly_swappable<iterator_t<R1>, iterator_t<R2>>
2919d905319SNikolas Klauser    constexpr ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
2929d905319SNikolas Klauser        ranges::swap_ranges(R1&& r1, R2&& r2);
2939d905319SNikolas Klauser
2943e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
295b8bc4e15SArthur O'Dwyer    constexpr void                // constexpr in C++20
2963e519524SHoward Hinnant    iter_swap(ForwardIterator1 a, ForwardIterator2 b);
2973e519524SHoward Hinnant
2983e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class UnaryOperation>
29999894b61SMarshall Clow    constexpr OutputIterator      // constexpr in C++20
3003e519524SHoward Hinnant    transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
3013e519524SHoward Hinnant
3023e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
30399894b61SMarshall Clow    constexpr OutputIterator      // constexpr in C++20
3043e519524SHoward Hinnant    transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
3053e519524SHoward Hinnant              OutputIterator result, BinaryOperation binary_op);
3063e519524SHoward Hinnant
3073e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
30812c7423fSMarshall Clow    constexpr void      // constexpr in C++20
3093e519524SHoward Hinnant    replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
3103e519524SHoward Hinnant
3113e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate, class T>
31212c7423fSMarshall Clow    constexpr void      // constexpr in C++20
3133e519524SHoward Hinnant    replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
3143e519524SHoward Hinnant
3153e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class T>
31612c7423fSMarshall Clow    constexpr OutputIterator      // constexpr in C++20
3173e519524SHoward Hinnant    replace_copy(InputIterator first, InputIterator last, OutputIterator result,
3183e519524SHoward Hinnant                 const T& old_value, const T& new_value);
3193e519524SHoward Hinnant
3203e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class Predicate, class T>
32112c7423fSMarshall Clow    constexpr OutputIterator      // constexpr in C++20
3223e519524SHoward Hinnant    replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
3233e519524SHoward Hinnant
3243e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
3254bfb9313SMarshall Clow    constexpr void      // constexpr in C++20
3263e519524SHoward Hinnant    fill(ForwardIterator first, ForwardIterator last, const T& value);
3273e519524SHoward Hinnant
3283e519524SHoward Hinnanttemplate <class OutputIterator, class Size, class T>
3294bfb9313SMarshall Clow    constexpr OutputIterator      // constexpr in C++20
3303e519524SHoward Hinnant    fill_n(OutputIterator first, Size n, const T& value);
3313e519524SHoward Hinnant
3323e519524SHoward Hinnanttemplate <class ForwardIterator, class Generator>
3334bfb9313SMarshall Clow    constexpr void      // constexpr in C++20
3343e519524SHoward Hinnant    generate(ForwardIterator first, ForwardIterator last, Generator gen);
3353e519524SHoward Hinnant
3363e519524SHoward Hinnanttemplate <class OutputIterator, class Size, class Generator>
3374bfb9313SMarshall Clow    constexpr OutputIterator      // constexpr in C++20
3383e519524SHoward Hinnant    generate_n(OutputIterator first, Size n, Generator gen);
3393e519524SHoward Hinnant
3403e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
341e8ea8296SMarshall Clow    constexpr ForwardIterator     // constexpr in C++20
3423e519524SHoward Hinnant    remove(ForwardIterator first, ForwardIterator last, const T& value);
3433e519524SHoward Hinnant
3443e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate>
345e8ea8296SMarshall Clow    constexpr ForwardIterator     // constexpr in C++20
3463e519524SHoward Hinnant    remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
3473e519524SHoward Hinnant
3483e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class T>
349e8ea8296SMarshall Clow    constexpr OutputIterator     // constexpr in C++20
3503e519524SHoward Hinnant    remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
3513e519524SHoward Hinnant
3523e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class Predicate>
353e8ea8296SMarshall Clow    constexpr OutputIterator     // constexpr in C++20
3543e519524SHoward Hinnant    remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
3553e519524SHoward Hinnant
3563e519524SHoward Hinnanttemplate <class ForwardIterator>
357b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator    // constexpr in C++20
3583e519524SHoward Hinnant    unique(ForwardIterator first, ForwardIterator last);
3593e519524SHoward Hinnant
3603e519524SHoward Hinnanttemplate <class ForwardIterator, class BinaryPredicate>
361b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator    // constexpr in C++20
3623e519524SHoward Hinnant    unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
3633e519524SHoward Hinnant
3643e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator>
365b8bc4e15SArthur O'Dwyer    constexpr OutputIterator     // constexpr in C++20
3663e519524SHoward Hinnant    unique_copy(InputIterator first, InputIterator last, OutputIterator result);
3673e519524SHoward Hinnant
3683e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class BinaryPredicate>
369b8bc4e15SArthur O'Dwyer    constexpr OutputIterator     // constexpr in C++20
3703e519524SHoward Hinnant    unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
3713e519524SHoward Hinnant
3723e519524SHoward Hinnanttemplate <class BidirectionalIterator>
373f851db3dSArthur O'Dwyer    constexpr void               // constexpr in C++20
3743e519524SHoward Hinnant    reverse(BidirectionalIterator first, BidirectionalIterator last);
3753e519524SHoward Hinnant
3763e519524SHoward Hinnanttemplate <class BidirectionalIterator, class OutputIterator>
377e8ea8296SMarshall Clow    constexpr OutputIterator       // constexpr in C++20
3783e519524SHoward Hinnant    reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
3793e519524SHoward Hinnant
3803e519524SHoward Hinnanttemplate <class ForwardIterator>
381b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator      // constexpr in C++20
3823e519524SHoward Hinnant    rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
3833e519524SHoward Hinnant
3843e519524SHoward Hinnanttemplate <class ForwardIterator, class OutputIterator>
385b8bc4e15SArthur O'Dwyer    constexpr OutputIterator       // constexpr in C++20
3863e519524SHoward Hinnant    rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
3873e519524SHoward Hinnant
3883e519524SHoward Hinnanttemplate <class RandomAccessIterator>
3893e519524SHoward Hinnant    void
3900f37a410SMarshall Clow    random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
3913e519524SHoward Hinnant
3923e519524SHoward Hinnanttemplate <class RandomAccessIterator, class RandomNumberGenerator>
3933e519524SHoward Hinnant    void
39406965c1fSMarshall Clow    random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
3950f37a410SMarshall Clow                   RandomNumberGenerator& rand);  // deprecated in C++14, removed in C++17
3963e519524SHoward Hinnant
397e7154709SEric Fiseliertemplate<class PopulationIterator, class SampleIterator,
398e7154709SEric Fiselier         class Distance, class UniformRandomBitGenerator>
399e7154709SEric Fiselier    SampleIterator sample(PopulationIterator first, PopulationIterator last,
400e7154709SEric Fiselier                          SampleIterator out, Distance n,
401e7154709SEric Fiselier                          UniformRandomBitGenerator&& g); // C++17
402e7154709SEric Fiselier
403f9d540b0SHoward Hinnanttemplate<class RandomAccessIterator, class UniformRandomNumberGenerator>
404f9d540b0SHoward Hinnant    void shuffle(RandomAccessIterator first, RandomAccessIterator last,
405fb340102SHoward Hinnant                 UniformRandomNumberGenerator&& g);
406f9d540b0SHoward Hinnant
4073fbd3eafSArthur O'Dwyertemplate<class ForwardIterator>
4083fbd3eafSArthur O'Dwyer  constexpr ForwardIterator
4093fbd3eafSArthur O'Dwyer    shift_left(ForwardIterator first, ForwardIterator last,
4103fbd3eafSArthur O'Dwyer               typename iterator_traits<ForwardIterator>::difference_type n); // C++20
4113fbd3eafSArthur O'Dwyer
4123fbd3eafSArthur O'Dwyertemplate<class ForwardIterator>
4133fbd3eafSArthur O'Dwyer  constexpr ForwardIterator
4143fbd3eafSArthur O'Dwyer    shift_right(ForwardIterator first, ForwardIterator last,
4153fbd3eafSArthur O'Dwyer                typename iterator_traits<ForwardIterator>::difference_type n); // C++20
4163fbd3eafSArthur O'Dwyer
4173e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
41849c7643cSMarshall Clow    constexpr bool  // constexpr in C++20
4193e519524SHoward Hinnant    is_partitioned(InputIterator first, InputIterator last, Predicate pred);
4203e519524SHoward Hinnant
4213e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate>
422f851db3dSArthur O'Dwyer    constexpr ForwardIterator  // constexpr in C++20
4233e519524SHoward Hinnant    partition(ForwardIterator first, ForwardIterator last, Predicate pred);
4243e519524SHoward Hinnant
4253e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator1,
4263e519524SHoward Hinnant          class OutputIterator2, class Predicate>
4271b9a4ffdSMarshall Clow    constexpr pair<OutputIterator1, OutputIterator2>   // constexpr in C++20
4283e519524SHoward Hinnant    partition_copy(InputIterator first, InputIterator last,
4293e519524SHoward Hinnant                   OutputIterator1 out_true, OutputIterator2 out_false,
4303e519524SHoward Hinnant                   Predicate pred);
4313e519524SHoward Hinnant
4323e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate>
4333e519524SHoward Hinnant    ForwardIterator
4343e519524SHoward Hinnant    stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
4353e519524SHoward Hinnant
4363e519524SHoward Hinnanttemplate<class ForwardIterator, class Predicate>
437d57c03ddSMarshall Clow    constexpr ForwardIterator  // constexpr in C++20
4383e519524SHoward Hinnant    partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
4393e519524SHoward Hinnant
4403e519524SHoward Hinnanttemplate <class ForwardIterator>
44149c7643cSMarshall Clow    constexpr bool  // constexpr in C++20
4423e519524SHoward Hinnant    is_sorted(ForwardIterator first, ForwardIterator last);
4433e519524SHoward Hinnant
4443e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare>
445b8bc4e15SArthur O'Dwyer    constexpr bool  // constexpr in C++20
4463e519524SHoward Hinnant    is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
4473e519524SHoward Hinnant
4483e519524SHoward Hinnanttemplate<class ForwardIterator>
449056f15e3SMarshall Clow    constexpr ForwardIterator    // constexpr in C++20
4503e519524SHoward Hinnant    is_sorted_until(ForwardIterator first, ForwardIterator last);
4513e519524SHoward Hinnant
4523e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare>
453056f15e3SMarshall Clow    constexpr ForwardIterator    // constexpr in C++20
4543e519524SHoward Hinnant    is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
4553e519524SHoward Hinnant
4563e519524SHoward Hinnanttemplate <class RandomAccessIterator>
457493f1407SArthur O'Dwyer    constexpr void               // constexpr in C++20
4583e519524SHoward Hinnant    sort(RandomAccessIterator first, RandomAccessIterator last);
4593e519524SHoward Hinnant
4603e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
461493f1407SArthur O'Dwyer    constexpr void               // constexpr in C++20
4623e519524SHoward Hinnant    sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
4633e519524SHoward Hinnant
4643e519524SHoward Hinnanttemplate <class RandomAccessIterator>
4653e519524SHoward Hinnant    void
4663e519524SHoward Hinnant    stable_sort(RandomAccessIterator first, RandomAccessIterator last);
4673e519524SHoward Hinnant
4683e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
4693e519524SHoward Hinnant    void
4703e519524SHoward Hinnant    stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
4713e519524SHoward Hinnant
4723e519524SHoward Hinnanttemplate <class RandomAccessIterator>
4735386aa26SArthur O'Dwyer    constexpr void                    // constexpr in C++20
4743e519524SHoward Hinnant    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
4753e519524SHoward Hinnant
4763e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
4775386aa26SArthur O'Dwyer    constexpr void                    // constexpr in C++20
4783e519524SHoward Hinnant    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
4793e519524SHoward Hinnant
4803e519524SHoward Hinnanttemplate <class InputIterator, class RandomAccessIterator>
4815386aa26SArthur O'Dwyer    constexpr RandomAccessIterator    // constexpr in C++20
4823e519524SHoward Hinnant    partial_sort_copy(InputIterator first, InputIterator last,
4833e519524SHoward Hinnant                      RandomAccessIterator result_first, RandomAccessIterator result_last);
4843e519524SHoward Hinnant
4853e519524SHoward Hinnanttemplate <class InputIterator, class RandomAccessIterator, class Compare>
4865386aa26SArthur O'Dwyer    constexpr RandomAccessIterator    // constexpr in C++20
4873e519524SHoward Hinnant    partial_sort_copy(InputIterator first, InputIterator last,
4883e519524SHoward Hinnant                      RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
4893e519524SHoward Hinnant
4903e519524SHoward Hinnanttemplate <class RandomAccessIterator>
4915d956563SArthur O'Dwyer    constexpr void                    // constexpr in C++20
4923e519524SHoward Hinnant    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
4933e519524SHoward Hinnant
4943e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
4955d956563SArthur O'Dwyer    constexpr void                    // constexpr in C++20
4963e519524SHoward Hinnant    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
4973e519524SHoward Hinnant
4983e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
499d57c03ddSMarshall Clow    constexpr ForwardIterator                         // constexpr in C++20
5003e519524SHoward Hinnant    lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
5013e519524SHoward Hinnant
5023e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare>
503d57c03ddSMarshall Clow    constexpr ForwardIterator                         // constexpr in C++20
5043e519524SHoward Hinnant    lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
5053e519524SHoward Hinnant
5063e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
507d57c03ddSMarshall Clow    constexpr ForwardIterator                         // constexpr in C++20
5083e519524SHoward Hinnant    upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
5093e519524SHoward Hinnant
5103e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare>
511d57c03ddSMarshall Clow    constexpr ForwardIterator                         // constexpr in C++20
5123e519524SHoward Hinnant    upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
5133e519524SHoward Hinnant
5143e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
515d57c03ddSMarshall Clow    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++20
5163e519524SHoward Hinnant    equal_range(ForwardIterator first, ForwardIterator last, const T& value);
5173e519524SHoward Hinnant
5183e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare>
519d57c03ddSMarshall Clow    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++20
5203e519524SHoward Hinnant    equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
5213e519524SHoward Hinnant
5223e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
523d57c03ddSMarshall Clow    constexpr bool                                    // constexpr in C++20
5243e519524SHoward Hinnant    binary_search(ForwardIterator first, ForwardIterator last, const T& value);
5253e519524SHoward Hinnant
5263e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare>
5278da1a487SMarshall Clow    constexpr bool                                    // constexpr in C++20
5283e519524SHoward Hinnant    binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
5293e519524SHoward Hinnant
5303e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
53114098cf6SArthur O'Dwyer    constexpr OutputIterator                          // constexpr in C++20
5323e519524SHoward Hinnant    merge(InputIterator1 first1, InputIterator1 last1,
5333e519524SHoward Hinnant          InputIterator2 first2, InputIterator2 last2, OutputIterator result);
5343e519524SHoward Hinnant
5353e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
53614098cf6SArthur O'Dwyer    constexpr OutputIterator                          // constexpr in C++20
5373e519524SHoward Hinnant    merge(InputIterator1 first1, InputIterator1 last1,
5383e519524SHoward Hinnant          InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
5393e519524SHoward Hinnant
5403e519524SHoward Hinnanttemplate <class BidirectionalIterator>
5413e519524SHoward Hinnant    void
5423e519524SHoward Hinnant    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
5433e519524SHoward Hinnant
5443e519524SHoward Hinnanttemplate <class BidirectionalIterator, class Compare>
5453e519524SHoward Hinnant    void
5463e519524SHoward Hinnant    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
5473e519524SHoward Hinnant
5483e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2>
5498da1a487SMarshall Clow    constexpr bool                                    // constexpr in C++20
5503e519524SHoward Hinnant    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
5513e519524SHoward Hinnant
5523e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class Compare>
5538da1a487SMarshall Clow    constexpr bool                                    // constexpr in C++20
5543e519524SHoward Hinnant    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
5553e519524SHoward Hinnant
5563e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
55714098cf6SArthur O'Dwyer    constexpr OutputIterator                          // constexpr in C++20
5583e519524SHoward Hinnant    set_union(InputIterator1 first1, InputIterator1 last1,
5593e519524SHoward Hinnant              InputIterator2 first2, InputIterator2 last2, OutputIterator result);
5603e519524SHoward Hinnant
5613e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
56214098cf6SArthur O'Dwyer    constexpr OutputIterator                          // constexpr in C++20
5633e519524SHoward Hinnant    set_union(InputIterator1 first1, InputIterator1 last1,
5643e519524SHoward Hinnant              InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
5653e519524SHoward Hinnant
5663e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
5678da1a487SMarshall Clow    constexpr OutputIterator                         // constexpr in C++20
5683e519524SHoward Hinnant    set_intersection(InputIterator1 first1, InputIterator1 last1,
5693e519524SHoward Hinnant                     InputIterator2 first2, InputIterator2 last2, OutputIterator result);
5703e519524SHoward Hinnant
5713e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
5728da1a487SMarshall Clow    constexpr OutputIterator                         // constexpr in C++20
5733e519524SHoward Hinnant    set_intersection(InputIterator1 first1, InputIterator1 last1,
5743e519524SHoward Hinnant                     InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
5753e519524SHoward Hinnant
5763e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
57714098cf6SArthur O'Dwyer    constexpr OutputIterator                         // constexpr in C++20
5783e519524SHoward Hinnant    set_difference(InputIterator1 first1, InputIterator1 last1,
5793e519524SHoward Hinnant                   InputIterator2 first2, InputIterator2 last2, OutputIterator result);
5803e519524SHoward Hinnant
5813e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
58214098cf6SArthur O'Dwyer    constexpr OutputIterator                         // constexpr in C++20
5833e519524SHoward Hinnant    set_difference(InputIterator1 first1, InputIterator1 last1,
5843e519524SHoward Hinnant                   InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
5853e519524SHoward Hinnant
5863e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
58714098cf6SArthur O'Dwyer    constexpr OutputIterator                         // constexpr in C++20
5883e519524SHoward Hinnant    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
5893e519524SHoward Hinnant                             InputIterator2 first2, InputIterator2 last2, OutputIterator result);
5903e519524SHoward Hinnant
5913e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
59214098cf6SArthur O'Dwyer    constexpr OutputIterator                         // constexpr in C++20
5933e519524SHoward Hinnant    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
5943e519524SHoward Hinnant                             InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
5953e519524SHoward Hinnant
5963e519524SHoward Hinnanttemplate <class RandomAccessIterator>
5975386aa26SArthur O'Dwyer    constexpr void                                   // constexpr in C++20
5983e519524SHoward Hinnant    push_heap(RandomAccessIterator first, RandomAccessIterator last);
5993e519524SHoward Hinnant
6003e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
6015386aa26SArthur O'Dwyer    constexpr void                                   // constexpr in C++20
6023e519524SHoward Hinnant    push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
6033e519524SHoward Hinnant
6043e519524SHoward Hinnanttemplate <class RandomAccessIterator>
6055386aa26SArthur O'Dwyer    constexpr void                                   // constexpr in C++20
6063e519524SHoward Hinnant    pop_heap(RandomAccessIterator first, RandomAccessIterator last);
6073e519524SHoward Hinnant
6083e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
6095386aa26SArthur O'Dwyer    constexpr void                                   // constexpr in C++20
6103e519524SHoward Hinnant    pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
6113e519524SHoward Hinnant
6123e519524SHoward Hinnanttemplate <class RandomAccessIterator>
6135386aa26SArthur O'Dwyer    constexpr void                                   // constexpr in C++20
6143e519524SHoward Hinnant    make_heap(RandomAccessIterator first, RandomAccessIterator last);
6153e519524SHoward Hinnant
6163e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
6175386aa26SArthur O'Dwyer    constexpr void                                   // constexpr in C++20
6183e519524SHoward Hinnant    make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
6193e519524SHoward Hinnant
6203e519524SHoward Hinnanttemplate <class RandomAccessIterator>
6215386aa26SArthur O'Dwyer    constexpr void                                   // constexpr in C++20
6223e519524SHoward Hinnant    sort_heap(RandomAccessIterator first, RandomAccessIterator last);
6233e519524SHoward Hinnant
6243e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
6255386aa26SArthur O'Dwyer    constexpr void                                   // constexpr in C++20
6263e519524SHoward Hinnant    sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
6273e519524SHoward Hinnant
6283e519524SHoward Hinnanttemplate <class RandomAccessIterator>
62949c7643cSMarshall Clow    constexpr bool   // constexpr in C++20
6303e519524SHoward Hinnant    is_heap(RandomAccessIterator first, RandomAccessiterator last);
6313e519524SHoward Hinnant
6323e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
63349c7643cSMarshall Clow    constexpr bool   // constexpr in C++20
6343e519524SHoward Hinnant    is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
6353e519524SHoward Hinnant
6363e519524SHoward Hinnanttemplate <class RandomAccessIterator>
63749c7643cSMarshall Clow    constexpr RandomAccessIterator   // constexpr in C++20
6383e519524SHoward Hinnant    is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
6393e519524SHoward Hinnant
6403e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
64149c7643cSMarshall Clow    constexpr RandomAccessIterator   // constexpr in C++20
6423e519524SHoward Hinnant    is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
6433e519524SHoward Hinnant
6444eb27b79SHoward Hinnanttemplate <class ForwardIterator>
645b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator        // constexpr in C++14
646b8bc4e15SArthur O'Dwyer    min_element(ForwardIterator first, ForwardIterator last);
6474eb27b79SHoward Hinnant
6484eb27b79SHoward Hinnanttemplate <class ForwardIterator, class Compare>
649b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator        // constexpr in C++14
650b8bc4e15SArthur O'Dwyer    min_element(ForwardIterator first, ForwardIterator last, Compare comp);
6514eb27b79SHoward Hinnant
6523e519524SHoward Hinnanttemplate <class T>
653b8bc4e15SArthur O'Dwyer    constexpr const T&               // constexpr in C++14
654b8bc4e15SArthur O'Dwyer    min(const T& a, const T& b);
6553e519524SHoward Hinnant
6563e519524SHoward Hinnanttemplate <class T, class Compare>
657b8bc4e15SArthur O'Dwyer    constexpr const T&               // constexpr in C++14
658b8bc4e15SArthur O'Dwyer    min(const T& a, const T& b, Compare comp);
6593e519524SHoward Hinnant
6603e519524SHoward Hinnanttemplate<class T>
661b8bc4e15SArthur O'Dwyer    constexpr T                      // constexpr in C++14
662b8bc4e15SArthur O'Dwyer    min(initializer_list<T> t);
6633e519524SHoward Hinnant
6643e519524SHoward Hinnanttemplate<class T, class Compare>
665b8bc4e15SArthur O'Dwyer    constexpr T                      // constexpr in C++14
666b8bc4e15SArthur O'Dwyer    min(initializer_list<T> t, Compare comp);
6673e519524SHoward Hinnant
668146c14acSMarshall Clowtemplate<class T>
669146c14acSMarshall Clow    constexpr const T& clamp(const T& v, const T& lo, const T& hi);               // C++17
670146c14acSMarshall Clow
671146c14acSMarshall Clowtemplate<class T, class Compare>
672146c14acSMarshall Clow    constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17
673146c14acSMarshall Clow
6743e519524SHoward Hinnanttemplate <class ForwardIterator>
675b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator        // constexpr in C++14
676b8bc4e15SArthur O'Dwyer    max_element(ForwardIterator first, ForwardIterator last);
6773e519524SHoward Hinnant
6783e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare>
679b8bc4e15SArthur O'Dwyer    constexpr ForwardIterator        // constexpr in C++14
680b8bc4e15SArthur O'Dwyer    max_element(ForwardIterator first, ForwardIterator last, Compare comp);
6813e519524SHoward Hinnant
6824eb27b79SHoward Hinnanttemplate <class T>
683b8bc4e15SArthur O'Dwyer    constexpr const T&               // constexpr in C++14
684b8bc4e15SArthur O'Dwyer    max(const T& a, const T& b);
6854eb27b79SHoward Hinnant
6864eb27b79SHoward Hinnanttemplate <class T, class Compare>
687b8bc4e15SArthur O'Dwyer    constexpr const T&               // constexpr in C++14
688b8bc4e15SArthur O'Dwyer    max(const T& a, const T& b, Compare comp);
6894eb27b79SHoward Hinnant
6904eb27b79SHoward Hinnanttemplate<class T>
691b8bc4e15SArthur O'Dwyer    constexpr T                      // constexpr in C++14
692b8bc4e15SArthur O'Dwyer    max(initializer_list<T> t);
6934eb27b79SHoward Hinnant
6944eb27b79SHoward Hinnanttemplate<class T, class Compare>
695b8bc4e15SArthur O'Dwyer    constexpr T                      // constexpr in C++14
696b8bc4e15SArthur O'Dwyer    max(initializer_list<T> t, Compare comp);
6974eb27b79SHoward Hinnant
6984eb27b79SHoward Hinnanttemplate<class ForwardIterator>
699b8bc4e15SArthur O'Dwyer    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++14
700b8bc4e15SArthur O'Dwyer    minmax_element(ForwardIterator first, ForwardIterator last);
7014eb27b79SHoward Hinnant
7024eb27b79SHoward Hinnanttemplate<class ForwardIterator, class Compare>
703b8bc4e15SArthur O'Dwyer    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++14
704b8bc4e15SArthur O'Dwyer    minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
7054eb27b79SHoward Hinnant
7064eb27b79SHoward Hinnanttemplate<class T>
707b8bc4e15SArthur O'Dwyer    constexpr pair<const T&, const T&>  // constexpr in C++14
708b8bc4e15SArthur O'Dwyer    minmax(const T& a, const T& b);
7094eb27b79SHoward Hinnant
7104eb27b79SHoward Hinnanttemplate<class T, class Compare>
711b8bc4e15SArthur O'Dwyer    constexpr pair<const T&, const T&>  // constexpr in C++14
712b8bc4e15SArthur O'Dwyer    minmax(const T& a, const T& b, Compare comp);
7134eb27b79SHoward Hinnant
7144eb27b79SHoward Hinnanttemplate<class T>
715b8bc4e15SArthur O'Dwyer    constexpr pair<T, T>                // constexpr in C++14
716b8bc4e15SArthur O'Dwyer    minmax(initializer_list<T> t);
7174eb27b79SHoward Hinnant
7184eb27b79SHoward Hinnanttemplate<class T, class Compare>
719b8bc4e15SArthur O'Dwyer    constexpr pair<T, T>                // constexpr in C++14
720b8bc4e15SArthur O'Dwyer    minmax(initializer_list<T> t, Compare comp);
7214eb27b79SHoward Hinnant
7223e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2>
7231b9a4ffdSMarshall Clow    constexpr bool     // constexpr in C++20
7243e519524SHoward Hinnant    lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
7253e519524SHoward Hinnant
7263e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class Compare>
7271b9a4ffdSMarshall Clow    constexpr bool     // constexpr in C++20
7283e519524SHoward Hinnant    lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
7293e519524SHoward Hinnant                            InputIterator2 first2, InputIterator2 last2, Compare comp);
7303e519524SHoward Hinnant
7313e519524SHoward Hinnanttemplate <class BidirectionalIterator>
732f851db3dSArthur O'Dwyer    constexpr bool     // constexpr in C++20
7333e519524SHoward Hinnant    next_permutation(BidirectionalIterator first, BidirectionalIterator last);
7343e519524SHoward Hinnant
7353e519524SHoward Hinnanttemplate <class BidirectionalIterator, class Compare>
736f851db3dSArthur O'Dwyer    constexpr bool     // constexpr in C++20
7373e519524SHoward Hinnant    next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
7383e519524SHoward Hinnant
7393e519524SHoward Hinnanttemplate <class BidirectionalIterator>
740f851db3dSArthur O'Dwyer    constexpr bool     // constexpr in C++20
7413e519524SHoward Hinnant    prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
7423e519524SHoward Hinnant
7433e519524SHoward Hinnanttemplate <class BidirectionalIterator, class Compare>
744f851db3dSArthur O'Dwyer    constexpr bool     // constexpr in C++20
7453e519524SHoward Hinnant    prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
7463e519524SHoward Hinnant}  // std
7473e519524SHoward Hinnant
7483e519524SHoward Hinnant*/
7493e519524SHoward Hinnant
750385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
751ea2206d7SArthur O'Dwyer#include <__bits>
7523e519524SHoward Hinnant#include <__config>
753134723edSLouis Dionne#include <__debug>
754a1d07d57SHoward Hinnant#include <cstddef>
755bfbd73f8SArthur O'Dwyer#include <cstring>
756bfbd73f8SArthur O'Dwyer#include <functional>
757bfbd73f8SArthur O'Dwyer#include <initializer_list>
758bfbd73f8SArthur O'Dwyer#include <iterator>
759bfbd73f8SArthur O'Dwyer#include <memory>
760bfbd73f8SArthur O'Dwyer#include <type_traits>
761f56972e2SMarshall Clow#include <version>
7625d1a701dSHoward Hinnant
763134723edSLouis Dionne#include <__algorithm/adjacent_find.h>
764134723edSLouis Dionne#include <__algorithm/all_of.h>
765134723edSLouis Dionne#include <__algorithm/any_of.h>
766134723edSLouis Dionne#include <__algorithm/binary_search.h>
767134723edSLouis Dionne#include <__algorithm/clamp.h>
768134723edSLouis Dionne#include <__algorithm/comp.h>
769134723edSLouis Dionne#include <__algorithm/comp_ref_type.h>
770134723edSLouis Dionne#include <__algorithm/copy.h>
771134723edSLouis Dionne#include <__algorithm/copy_backward.h>
772134723edSLouis Dionne#include <__algorithm/copy_if.h>
773134723edSLouis Dionne#include <__algorithm/copy_n.h>
774134723edSLouis Dionne#include <__algorithm/count.h>
775134723edSLouis Dionne#include <__algorithm/count_if.h>
776134723edSLouis Dionne#include <__algorithm/equal.h>
777134723edSLouis Dionne#include <__algorithm/equal_range.h>
778134723edSLouis Dionne#include <__algorithm/fill.h>
7794d81a46fSArthur O'Dwyer#include <__algorithm/fill_n.h>
780134723edSLouis Dionne#include <__algorithm/find.h>
781134723edSLouis Dionne#include <__algorithm/find_end.h>
782134723edSLouis Dionne#include <__algorithm/find_first_of.h>
783134723edSLouis Dionne#include <__algorithm/find_if.h>
784134723edSLouis Dionne#include <__algorithm/find_if_not.h>
785134723edSLouis Dionne#include <__algorithm/for_each.h>
786134723edSLouis Dionne#include <__algorithm/for_each_n.h>
787134723edSLouis Dionne#include <__algorithm/generate.h>
7884d81a46fSArthur O'Dwyer#include <__algorithm/generate_n.h>
789134723edSLouis Dionne#include <__algorithm/half_positive.h>
79068f4131cSNikolas Klauser#include <__algorithm/in_found_result.h>
7911e77b396SNikolas Klauser#include <__algorithm/in_fun_result.h>
792f3514af4SNikolas Klauser#include <__algorithm/in_in_out_result.h>
793d3729bb3SNikolas Klauser#include <__algorithm/in_in_result.h>
794610979b3SNikolas Klauser#include <__algorithm/in_out_out_result.h>
7958d23b742SKonstantin Varlamov#include <__algorithm/in_out_result.h>
796134723edSLouis Dionne#include <__algorithm/includes.h>
797134723edSLouis Dionne#include <__algorithm/inplace_merge.h>
798134723edSLouis Dionne#include <__algorithm/is_heap.h>
799134723edSLouis Dionne#include <__algorithm/is_heap_until.h>
800134723edSLouis Dionne#include <__algorithm/is_partitioned.h>
801134723edSLouis Dionne#include <__algorithm/is_permutation.h>
802134723edSLouis Dionne#include <__algorithm/is_sorted.h>
803134723edSLouis Dionne#include <__algorithm/is_sorted_until.h>
8046adbc83eSChristopher Di Bella#include <__algorithm/iter_swap.h>
805134723edSLouis Dionne#include <__algorithm/lexicographical_compare.h>
806134723edSLouis Dionne#include <__algorithm/lower_bound.h>
807134723edSLouis Dionne#include <__algorithm/make_heap.h>
808134723edSLouis Dionne#include <__algorithm/max.h>
809134723edSLouis Dionne#include <__algorithm/max_element.h>
810134723edSLouis Dionne#include <__algorithm/merge.h>
811134723edSLouis Dionne#include <__algorithm/min.h>
812134723edSLouis Dionne#include <__algorithm/min_element.h>
813807766beSNikolas Klauser#include <__algorithm/min_max_result.h>
814134723edSLouis Dionne#include <__algorithm/minmax.h>
815134723edSLouis Dionne#include <__algorithm/minmax_element.h>
816134723edSLouis Dionne#include <__algorithm/mismatch.h>
817134723edSLouis Dionne#include <__algorithm/move.h>
818134723edSLouis Dionne#include <__algorithm/move_backward.h>
819134723edSLouis Dionne#include <__algorithm/next_permutation.h>
820134723edSLouis Dionne#include <__algorithm/none_of.h>
821134723edSLouis Dionne#include <__algorithm/nth_element.h>
822134723edSLouis Dionne#include <__algorithm/partial_sort.h>
823134723edSLouis Dionne#include <__algorithm/partial_sort_copy.h>
824134723edSLouis Dionne#include <__algorithm/partition.h>
825134723edSLouis Dionne#include <__algorithm/partition_copy.h>
826134723edSLouis Dionne#include <__algorithm/partition_point.h>
827134723edSLouis Dionne#include <__algorithm/pop_heap.h>
828134723edSLouis Dionne#include <__algorithm/prev_permutation.h>
829134723edSLouis Dionne#include <__algorithm/push_heap.h>
830ee0f8c40SNikolas Klauser#include <__algorithm/ranges_find.h>
831ee0f8c40SNikolas Klauser#include <__algorithm/ranges_find_if.h>
832ee0f8c40SNikolas Klauser#include <__algorithm/ranges_find_if_not.h>
833*e476df56SNikolas Klauser#include <__algorithm/ranges_max.h>
834205557c9SNikolas Klauser#include <__algorithm/ranges_max_element.h>
835f83d833eSNikolas Klauser#include <__algorithm/ranges_min.h>
8363b470d1cSNikolas Klauser#include <__algorithm/ranges_min_element.h>
837c2cd15a6SNikolas Klauser#include <__algorithm/ranges_mismatch.h>
8389d905319SNikolas Klauser#include <__algorithm/ranges_swap_ranges.h>
839134723edSLouis Dionne#include <__algorithm/remove.h>
840134723edSLouis Dionne#include <__algorithm/remove_copy.h>
841134723edSLouis Dionne#include <__algorithm/remove_copy_if.h>
842134723edSLouis Dionne#include <__algorithm/remove_if.h>
843134723edSLouis Dionne#include <__algorithm/replace.h>
844134723edSLouis Dionne#include <__algorithm/replace_copy.h>
845134723edSLouis Dionne#include <__algorithm/replace_copy_if.h>
846134723edSLouis Dionne#include <__algorithm/replace_if.h>
847134723edSLouis Dionne#include <__algorithm/reverse.h>
848134723edSLouis Dionne#include <__algorithm/reverse_copy.h>
849134723edSLouis Dionne#include <__algorithm/rotate.h>
850134723edSLouis Dionne#include <__algorithm/rotate_copy.h>
851134723edSLouis Dionne#include <__algorithm/sample.h>
852134723edSLouis Dionne#include <__algorithm/search.h>
853134723edSLouis Dionne#include <__algorithm/search_n.h>
854134723edSLouis Dionne#include <__algorithm/set_difference.h>
855134723edSLouis Dionne#include <__algorithm/set_intersection.h>
856134723edSLouis Dionne#include <__algorithm/set_symmetric_difference.h>
857134723edSLouis Dionne#include <__algorithm/set_union.h>
858134723edSLouis Dionne#include <__algorithm/shift_left.h>
859134723edSLouis Dionne#include <__algorithm/shift_right.h>
860134723edSLouis Dionne#include <__algorithm/shuffle.h>
861134723edSLouis Dionne#include <__algorithm/sift_down.h>
862134723edSLouis Dionne#include <__algorithm/sort.h>
863134723edSLouis Dionne#include <__algorithm/sort_heap.h>
864134723edSLouis Dionne#include <__algorithm/stable_partition.h>
865134723edSLouis Dionne#include <__algorithm/stable_sort.h>
8666adbc83eSChristopher Di Bella#include <__algorithm/swap_ranges.h>
867134723edSLouis Dionne#include <__algorithm/transform.h>
868134723edSLouis Dionne#include <__algorithm/unique.h>
8694d81a46fSArthur O'Dwyer#include <__algorithm/unique_copy.h>
870134723edSLouis Dionne#include <__algorithm/unwrap_iter.h>
871134723edSLouis Dionne#include <__algorithm/upper_bound.h>
872c1bd9197SEric Fiselier
873073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
8743e519524SHoward Hinnant#  pragma GCC system_header
875073458b1SHoward Hinnant#endif
8763e519524SHoward Hinnant
8770a06eb91SLouis Dionne#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
87895689243SLouis Dionne#   include <__pstl_algorithm>
8790a06eb91SLouis Dionne#endif
8800a06eb91SLouis Dionne
8813e519524SHoward Hinnant#endif // _LIBCPP_ALGORITHM
882