xref: /freebsd/contrib/llvm-project/libcxx/include/algorithm (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_ALGORITHM
110b57cec5SDimitry Andric#define _LIBCPP_ALGORITHM
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    algorithm synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andric#include <initializer_list>
170b57cec5SDimitry Andric
180b57cec5SDimitry Andricnamespace std
190b57cec5SDimitry Andric{
200b57cec5SDimitry Andric
21*04eeddc0SDimitry Andricnamespace ranges {
22*04eeddc0SDimitry Andric  template <class I1, class I2>
23*04eeddc0SDimitry Andric    struct in_in_result; // since C++20
24*04eeddc0SDimitry Andric}
25*04eeddc0SDimitry Andric
260b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
270b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
280b57cec5SDimitry Andric    all_of(InputIterator first, InputIterator last, Predicate pred);
290b57cec5SDimitry Andric
300b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
310b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
320b57cec5SDimitry Andric    any_of(InputIterator first, InputIterator last, Predicate pred);
330b57cec5SDimitry Andric
340b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
350b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
360b57cec5SDimitry Andric    none_of(InputIterator first, InputIterator last, Predicate pred);
370b57cec5SDimitry Andric
380b57cec5SDimitry Andrictemplate <class InputIterator, class Function>
390b57cec5SDimitry Andric    constexpr Function          // constexpr in C++20
400b57cec5SDimitry Andric    for_each(InputIterator first, InputIterator last, Function f);
410b57cec5SDimitry Andric
420b57cec5SDimitry Andrictemplate<class InputIterator, class Size, class Function>
430b57cec5SDimitry Andric    constexpr InputIterator     // constexpr in C++20
440b57cec5SDimitry Andric    for_each_n(InputIterator first, Size n, Function f); // C++17
450b57cec5SDimitry Andric
460b57cec5SDimitry Andrictemplate <class InputIterator, class T>
470b57cec5SDimitry Andric    constexpr InputIterator     // constexpr in C++20
480b57cec5SDimitry Andric    find(InputIterator first, InputIterator last, const T& value);
490b57cec5SDimitry Andric
500b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
510b57cec5SDimitry Andric    constexpr InputIterator     // constexpr in C++20
520b57cec5SDimitry Andric    find_if(InputIterator first, InputIterator last, Predicate pred);
530b57cec5SDimitry Andric
540b57cec5SDimitry Andrictemplate<class InputIterator, class Predicate>
55e8d8bef9SDimitry Andric    constexpr InputIterator     // constexpr in C++20
560b57cec5SDimitry Andric    find_if_not(InputIterator first, InputIterator last, Predicate pred);
570b57cec5SDimitry Andric
580b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
59e8d8bef9SDimitry Andric    constexpr ForwardIterator1  // constexpr in C++20
600b57cec5SDimitry Andric    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
610b57cec5SDimitry Andric             ForwardIterator2 first2, ForwardIterator2 last2);
620b57cec5SDimitry Andric
630b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
64e8d8bef9SDimitry Andric    constexpr ForwardIterator1  // constexpr in C++20
650b57cec5SDimitry Andric    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
660b57cec5SDimitry Andric             ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
670b57cec5SDimitry Andric
680b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
690b57cec5SDimitry Andric    constexpr ForwardIterator1  // constexpr in C++20
700b57cec5SDimitry Andric    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
710b57cec5SDimitry Andric                  ForwardIterator2 first2, ForwardIterator2 last2);
720b57cec5SDimitry Andric
730b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
740b57cec5SDimitry Andric    constexpr ForwardIterator1  // constexpr in C++20
750b57cec5SDimitry Andric    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
760b57cec5SDimitry Andric                  ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
770b57cec5SDimitry Andric
780b57cec5SDimitry Andrictemplate <class ForwardIterator>
790b57cec5SDimitry Andric    constexpr ForwardIterator   // constexpr in C++20
800b57cec5SDimitry Andric    adjacent_find(ForwardIterator first, ForwardIterator last);
810b57cec5SDimitry Andric
820b57cec5SDimitry Andrictemplate <class ForwardIterator, class BinaryPredicate>
830b57cec5SDimitry Andric    constexpr ForwardIterator   // constexpr in C++20
840b57cec5SDimitry Andric    adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
850b57cec5SDimitry Andric
860b57cec5SDimitry Andrictemplate <class InputIterator, class T>
870b57cec5SDimitry Andric    constexpr typename iterator_traits<InputIterator>::difference_type  // constexpr in C++20
880b57cec5SDimitry Andric    count(InputIterator first, InputIterator last, const T& value);
890b57cec5SDimitry Andric
900b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
910b57cec5SDimitry Andric    constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
920b57cec5SDimitry Andric    count_if(InputIterator first, InputIterator last, Predicate pred);
930b57cec5SDimitry Andric
940b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
950b57cec5SDimitry Andric    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
960b57cec5SDimitry Andric    mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
970b57cec5SDimitry Andric
980b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
990b57cec5SDimitry Andric    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
1000b57cec5SDimitry Andric    mismatch(InputIterator1 first1, InputIterator1 last1,
1010b57cec5SDimitry Andric             InputIterator2 first2, InputIterator2 last2); // **C++14**
1020b57cec5SDimitry Andric
1030b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
1040b57cec5SDimitry Andric    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
1050b57cec5SDimitry Andric    mismatch(InputIterator1 first1, InputIterator1 last1,
1060b57cec5SDimitry Andric             InputIterator2 first2, BinaryPredicate pred);
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
1090b57cec5SDimitry Andric    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
1100b57cec5SDimitry Andric    mismatch(InputIterator1 first1, InputIterator1 last1,
1110b57cec5SDimitry Andric             InputIterator2 first2, InputIterator2 last2,
1120b57cec5SDimitry Andric             BinaryPredicate pred); // **C++14**
1130b57cec5SDimitry Andric
1140b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
1150b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1160b57cec5SDimitry Andric    equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
1170b57cec5SDimitry Andric
1180b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
1190b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1200b57cec5SDimitry Andric    equal(InputIterator1 first1, InputIterator1 last1,
1210b57cec5SDimitry Andric          InputIterator2 first2, InputIterator2 last2); // **C++14**
1220b57cec5SDimitry Andric
1230b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
1240b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1250b57cec5SDimitry Andric    equal(InputIterator1 first1, InputIterator1 last1,
1260b57cec5SDimitry Andric          InputIterator2 first2, BinaryPredicate pred);
1270b57cec5SDimitry Andric
1280b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
1290b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1300b57cec5SDimitry Andric    equal(InputIterator1 first1, InputIterator1 last1,
1310b57cec5SDimitry Andric          InputIterator2 first2, InputIterator2 last2,
1320b57cec5SDimitry Andric          BinaryPredicate pred); // **C++14**
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2>
1350b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1360b57cec5SDimitry Andric    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1370b57cec5SDimitry Andric                   ForwardIterator2 first2);
1380b57cec5SDimitry Andric
1390b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2>
1400b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1410b57cec5SDimitry Andric    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1420b57cec5SDimitry Andric                   ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1450b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1460b57cec5SDimitry Andric    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1470b57cec5SDimitry Andric                   ForwardIterator2 first2, BinaryPredicate pred);
1480b57cec5SDimitry Andric
1490b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1500b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1510b57cec5SDimitry Andric    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1520b57cec5SDimitry Andric                   ForwardIterator2 first2, ForwardIterator2 last2,
1530b57cec5SDimitry Andric                   BinaryPredicate pred);  // **C++14**
1540b57cec5SDimitry Andric
1550b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
1560b57cec5SDimitry Andric    constexpr ForwardIterator1      // constexpr in C++20
1570b57cec5SDimitry Andric    search(ForwardIterator1 first1, ForwardIterator1 last1,
1580b57cec5SDimitry Andric           ForwardIterator2 first2, ForwardIterator2 last2);
1590b57cec5SDimitry Andric
1600b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1610b57cec5SDimitry Andric    constexpr ForwardIterator1      // constexpr in C++20
1620b57cec5SDimitry Andric    search(ForwardIterator1 first1, ForwardIterator1 last1,
1630b57cec5SDimitry Andric           ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
1640b57cec5SDimitry Andric
1650b57cec5SDimitry Andrictemplate <class ForwardIterator, class Size, class T>
1660b57cec5SDimitry Andric    constexpr ForwardIterator       // constexpr in C++20
1670b57cec5SDimitry Andric    search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
1680b57cec5SDimitry Andric
1690b57cec5SDimitry Andrictemplate <class ForwardIterator, class Size, class T, class BinaryPredicate>
1700b57cec5SDimitry Andric    constexpr ForwardIterator       // constexpr in C++20
1710b57cec5SDimitry Andric    search_n(ForwardIterator first, ForwardIterator last,
1720b57cec5SDimitry Andric             Size count, const T& value, BinaryPredicate pred);
1730b57cec5SDimitry Andric
1740b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator>
175480093f4SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
1760b57cec5SDimitry Andric    copy(InputIterator first, InputIterator last, OutputIterator result);
1770b57cec5SDimitry Andric
1780b57cec5SDimitry Andrictemplate<class InputIterator, class OutputIterator, class Predicate>
179480093f4SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
1800b57cec5SDimitry Andric    copy_if(InputIterator first, InputIterator last,
1810b57cec5SDimitry Andric            OutputIterator result, Predicate pred);
1820b57cec5SDimitry Andric
1830b57cec5SDimitry Andrictemplate<class InputIterator, class Size, class OutputIterator>
184480093f4SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
1850b57cec5SDimitry Andric    copy_n(InputIterator first, Size n, OutputIterator result);
1860b57cec5SDimitry Andric
1870b57cec5SDimitry Andrictemplate <class BidirectionalIterator1, class BidirectionalIterator2>
188480093f4SDimitry Andric    constexpr BidirectionalIterator2      // constexpr in C++20
1890b57cec5SDimitry Andric    copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
1900b57cec5SDimitry Andric                  BidirectionalIterator2 result);
1910b57cec5SDimitry Andric
1920b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
193e8d8bef9SDimitry Andric    constexpr ForwardIterator2    // constexpr in C++20
1940b57cec5SDimitry Andric    swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
1950b57cec5SDimitry Andric
1960b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
197e8d8bef9SDimitry Andric    constexpr void                // constexpr in C++20
1980b57cec5SDimitry Andric    iter_swap(ForwardIterator1 a, ForwardIterator2 b);
1990b57cec5SDimitry Andric
2000b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class UnaryOperation>
2010b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2020b57cec5SDimitry Andric    transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
2050b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2060b57cec5SDimitry Andric    transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
2070b57cec5SDimitry Andric              OutputIterator result, BinaryOperation binary_op);
2080b57cec5SDimitry Andric
2090b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
2100b57cec5SDimitry Andric    constexpr void      // constexpr in C++20
2110b57cec5SDimitry Andric    replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
2120b57cec5SDimitry Andric
2130b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate, class T>
2140b57cec5SDimitry Andric    constexpr void      // constexpr in C++20
2150b57cec5SDimitry Andric    replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
2160b57cec5SDimitry Andric
2170b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class T>
2180b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2190b57cec5SDimitry Andric    replace_copy(InputIterator first, InputIterator last, OutputIterator result,
2200b57cec5SDimitry Andric                 const T& old_value, const T& new_value);
2210b57cec5SDimitry Andric
2220b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class Predicate, class T>
2230b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2240b57cec5SDimitry Andric    replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
2250b57cec5SDimitry Andric
2260b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
2270b57cec5SDimitry Andric    constexpr void      // constexpr in C++20
2280b57cec5SDimitry Andric    fill(ForwardIterator first, ForwardIterator last, const T& value);
2290b57cec5SDimitry Andric
2300b57cec5SDimitry Andrictemplate <class OutputIterator, class Size, class T>
2310b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2320b57cec5SDimitry Andric    fill_n(OutputIterator first, Size n, const T& value);
2330b57cec5SDimitry Andric
2340b57cec5SDimitry Andrictemplate <class ForwardIterator, class Generator>
2350b57cec5SDimitry Andric    constexpr void      // constexpr in C++20
2360b57cec5SDimitry Andric    generate(ForwardIterator first, ForwardIterator last, Generator gen);
2370b57cec5SDimitry Andric
2380b57cec5SDimitry Andrictemplate <class OutputIterator, class Size, class Generator>
2390b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2400b57cec5SDimitry Andric    generate_n(OutputIterator first, Size n, Generator gen);
2410b57cec5SDimitry Andric
2420b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
2430b57cec5SDimitry Andric    constexpr ForwardIterator     // constexpr in C++20
2440b57cec5SDimitry Andric    remove(ForwardIterator first, ForwardIterator last, const T& value);
2450b57cec5SDimitry Andric
2460b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate>
2470b57cec5SDimitry Andric    constexpr ForwardIterator     // constexpr in C++20
2480b57cec5SDimitry Andric    remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
2490b57cec5SDimitry Andric
2500b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class T>
2510b57cec5SDimitry Andric    constexpr OutputIterator     // constexpr in C++20
2520b57cec5SDimitry Andric    remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
2530b57cec5SDimitry Andric
2540b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class Predicate>
2550b57cec5SDimitry Andric    constexpr OutputIterator     // constexpr in C++20
2560b57cec5SDimitry Andric    remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
2570b57cec5SDimitry Andric
2580b57cec5SDimitry Andrictemplate <class ForwardIterator>
259e8d8bef9SDimitry Andric    constexpr ForwardIterator    // constexpr in C++20
2600b57cec5SDimitry Andric    unique(ForwardIterator first, ForwardIterator last);
2610b57cec5SDimitry Andric
2620b57cec5SDimitry Andrictemplate <class ForwardIterator, class BinaryPredicate>
263e8d8bef9SDimitry Andric    constexpr ForwardIterator    // constexpr in C++20
2640b57cec5SDimitry Andric    unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
2650b57cec5SDimitry Andric
2660b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator>
267e8d8bef9SDimitry Andric    constexpr OutputIterator     // constexpr in C++20
2680b57cec5SDimitry Andric    unique_copy(InputIterator first, InputIterator last, OutputIterator result);
2690b57cec5SDimitry Andric
2700b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class BinaryPredicate>
271e8d8bef9SDimitry Andric    constexpr OutputIterator     // constexpr in C++20
2720b57cec5SDimitry Andric    unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
2730b57cec5SDimitry Andric
2740b57cec5SDimitry Andrictemplate <class BidirectionalIterator>
275e8d8bef9SDimitry Andric    constexpr void               // constexpr in C++20
2760b57cec5SDimitry Andric    reverse(BidirectionalIterator first, BidirectionalIterator last);
2770b57cec5SDimitry Andric
2780b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class OutputIterator>
2790b57cec5SDimitry Andric    constexpr OutputIterator       // constexpr in C++20
2800b57cec5SDimitry Andric    reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
2810b57cec5SDimitry Andric
2820b57cec5SDimitry Andrictemplate <class ForwardIterator>
283e8d8bef9SDimitry Andric    constexpr ForwardIterator      // constexpr in C++20
2840b57cec5SDimitry Andric    rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
2850b57cec5SDimitry Andric
2860b57cec5SDimitry Andrictemplate <class ForwardIterator, class OutputIterator>
287e8d8bef9SDimitry Andric    constexpr OutputIterator       // constexpr in C++20
2880b57cec5SDimitry Andric    rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
2890b57cec5SDimitry Andric
2900b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
2910b57cec5SDimitry Andric    void
2920b57cec5SDimitry Andric    random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
2930b57cec5SDimitry Andric
2940b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class RandomNumberGenerator>
2950b57cec5SDimitry Andric    void
2960b57cec5SDimitry Andric    random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
2970b57cec5SDimitry Andric                   RandomNumberGenerator& rand);  // deprecated in C++14, removed in C++17
2980b57cec5SDimitry Andric
2990b57cec5SDimitry Andrictemplate<class PopulationIterator, class SampleIterator,
3000b57cec5SDimitry Andric         class Distance, class UniformRandomBitGenerator>
3010b57cec5SDimitry Andric    SampleIterator sample(PopulationIterator first, PopulationIterator last,
3020b57cec5SDimitry Andric                          SampleIterator out, Distance n,
3030b57cec5SDimitry Andric                          UniformRandomBitGenerator&& g); // C++17
3040b57cec5SDimitry Andric
3050b57cec5SDimitry Andrictemplate<class RandomAccessIterator, class UniformRandomNumberGenerator>
3060b57cec5SDimitry Andric    void shuffle(RandomAccessIterator first, RandomAccessIterator last,
3070b57cec5SDimitry Andric                 UniformRandomNumberGenerator&& g);
3080b57cec5SDimitry Andric
309e8d8bef9SDimitry Andrictemplate<class ForwardIterator>
310e8d8bef9SDimitry Andric  constexpr ForwardIterator
311e8d8bef9SDimitry Andric    shift_left(ForwardIterator first, ForwardIterator last,
312e8d8bef9SDimitry Andric               typename iterator_traits<ForwardIterator>::difference_type n); // C++20
313e8d8bef9SDimitry Andric
314e8d8bef9SDimitry Andrictemplate<class ForwardIterator>
315e8d8bef9SDimitry Andric  constexpr ForwardIterator
316e8d8bef9SDimitry Andric    shift_right(ForwardIterator first, ForwardIterator last,
317e8d8bef9SDimitry Andric                typename iterator_traits<ForwardIterator>::difference_type n); // C++20
318e8d8bef9SDimitry Andric
3190b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
3200b57cec5SDimitry Andric    constexpr bool  // constexpr in C++20
3210b57cec5SDimitry Andric    is_partitioned(InputIterator first, InputIterator last, Predicate pred);
3220b57cec5SDimitry Andric
3230b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate>
324e8d8bef9SDimitry Andric    constexpr ForwardIterator  // constexpr in C++20
3250b57cec5SDimitry Andric    partition(ForwardIterator first, ForwardIterator last, Predicate pred);
3260b57cec5SDimitry Andric
3270b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator1,
3280b57cec5SDimitry Andric          class OutputIterator2, class Predicate>
3290b57cec5SDimitry Andric    constexpr pair<OutputIterator1, OutputIterator2>   // constexpr in C++20
3300b57cec5SDimitry Andric    partition_copy(InputIterator first, InputIterator last,
3310b57cec5SDimitry Andric                   OutputIterator1 out_true, OutputIterator2 out_false,
3320b57cec5SDimitry Andric                   Predicate pred);
3330b57cec5SDimitry Andric
3340b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate>
3350b57cec5SDimitry Andric    ForwardIterator
3360b57cec5SDimitry Andric    stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
3370b57cec5SDimitry Andric
3380b57cec5SDimitry Andrictemplate<class ForwardIterator, class Predicate>
3390b57cec5SDimitry Andric    constexpr ForwardIterator  // constexpr in C++20
3400b57cec5SDimitry Andric    partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
3410b57cec5SDimitry Andric
3420b57cec5SDimitry Andrictemplate <class ForwardIterator>
3430b57cec5SDimitry Andric    constexpr bool  // constexpr in C++20
3440b57cec5SDimitry Andric    is_sorted(ForwardIterator first, ForwardIterator last);
3450b57cec5SDimitry Andric
3460b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare>
347e8d8bef9SDimitry Andric    constexpr bool  // constexpr in C++20
3480b57cec5SDimitry Andric    is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andrictemplate<class ForwardIterator>
3510b57cec5SDimitry Andric    constexpr ForwardIterator    // constexpr in C++20
3520b57cec5SDimitry Andric    is_sorted_until(ForwardIterator first, ForwardIterator last);
3530b57cec5SDimitry Andric
3540b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare>
3550b57cec5SDimitry Andric    constexpr ForwardIterator    // constexpr in C++20
3560b57cec5SDimitry Andric    is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
3570b57cec5SDimitry Andric
3580b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
359fe6060f1SDimitry Andric    constexpr void               // constexpr in C++20
3600b57cec5SDimitry Andric    sort(RandomAccessIterator first, RandomAccessIterator last);
3610b57cec5SDimitry Andric
3620b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
363fe6060f1SDimitry Andric    constexpr void               // constexpr in C++20
3640b57cec5SDimitry Andric    sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
3650b57cec5SDimitry Andric
3660b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
3670b57cec5SDimitry Andric    void
3680b57cec5SDimitry Andric    stable_sort(RandomAccessIterator first, RandomAccessIterator last);
3690b57cec5SDimitry Andric
3700b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
3710b57cec5SDimitry Andric    void
3720b57cec5SDimitry Andric    stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
375fe6060f1SDimitry Andric    constexpr void                    // constexpr in C++20
3760b57cec5SDimitry Andric    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
3770b57cec5SDimitry Andric
3780b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
379fe6060f1SDimitry Andric    constexpr void                    // constexpr in C++20
3800b57cec5SDimitry Andric    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
3810b57cec5SDimitry Andric
3820b57cec5SDimitry Andrictemplate <class InputIterator, class RandomAccessIterator>
383fe6060f1SDimitry Andric    constexpr RandomAccessIterator    // constexpr in C++20
3840b57cec5SDimitry Andric    partial_sort_copy(InputIterator first, InputIterator last,
3850b57cec5SDimitry Andric                      RandomAccessIterator result_first, RandomAccessIterator result_last);
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andrictemplate <class InputIterator, class RandomAccessIterator, class Compare>
388fe6060f1SDimitry Andric    constexpr RandomAccessIterator    // constexpr in C++20
3890b57cec5SDimitry Andric    partial_sort_copy(InputIterator first, InputIterator last,
3900b57cec5SDimitry Andric                      RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
3910b57cec5SDimitry Andric
3920b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
393fe6060f1SDimitry Andric    constexpr void                    // constexpr in C++20
3940b57cec5SDimitry Andric    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
3950b57cec5SDimitry Andric
3960b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
397fe6060f1SDimitry Andric    constexpr void                    // constexpr in C++20
3980b57cec5SDimitry Andric    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
3990b57cec5SDimitry Andric
4000b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
4010b57cec5SDimitry Andric    constexpr ForwardIterator                         // constexpr in C++20
4020b57cec5SDimitry Andric    lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
4030b57cec5SDimitry Andric
4040b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare>
4050b57cec5SDimitry Andric    constexpr ForwardIterator                         // constexpr in C++20
4060b57cec5SDimitry Andric    lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
4070b57cec5SDimitry Andric
4080b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
4090b57cec5SDimitry Andric    constexpr ForwardIterator                         // constexpr in C++20
4100b57cec5SDimitry Andric    upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
4110b57cec5SDimitry Andric
4120b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare>
4130b57cec5SDimitry Andric    constexpr ForwardIterator                         // constexpr in C++20
4140b57cec5SDimitry Andric    upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
4150b57cec5SDimitry Andric
4160b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
4170b57cec5SDimitry Andric    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++20
4180b57cec5SDimitry Andric    equal_range(ForwardIterator first, ForwardIterator last, const T& value);
4190b57cec5SDimitry Andric
4200b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare>
4210b57cec5SDimitry Andric    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++20
4220b57cec5SDimitry Andric    equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
4230b57cec5SDimitry Andric
4240b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
4250b57cec5SDimitry Andric    constexpr bool                                    // constexpr in C++20
4260b57cec5SDimitry Andric    binary_search(ForwardIterator first, ForwardIterator last, const T& value);
4270b57cec5SDimitry Andric
4280b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare>
4290b57cec5SDimitry Andric    constexpr bool                                    // constexpr in C++20
4300b57cec5SDimitry Andric    binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
4310b57cec5SDimitry Andric
4320b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
433e8d8bef9SDimitry Andric    constexpr OutputIterator                          // constexpr in C++20
4340b57cec5SDimitry Andric    merge(InputIterator1 first1, InputIterator1 last1,
4350b57cec5SDimitry Andric          InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4360b57cec5SDimitry Andric
4370b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
438e8d8bef9SDimitry Andric    constexpr OutputIterator                          // constexpr in C++20
4390b57cec5SDimitry Andric    merge(InputIterator1 first1, InputIterator1 last1,
4400b57cec5SDimitry Andric          InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
4410b57cec5SDimitry Andric
4420b57cec5SDimitry Andrictemplate <class BidirectionalIterator>
4430b57cec5SDimitry Andric    void
4440b57cec5SDimitry Andric    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
4450b57cec5SDimitry Andric
4460b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class Compare>
4470b57cec5SDimitry Andric    void
4480b57cec5SDimitry Andric    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
4490b57cec5SDimitry Andric
4500b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
4510b57cec5SDimitry Andric    constexpr bool                                    // constexpr in C++20
4520b57cec5SDimitry Andric    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
4530b57cec5SDimitry Andric
4540b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class Compare>
4550b57cec5SDimitry Andric    constexpr bool                                    // constexpr in C++20
4560b57cec5SDimitry Andric    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
4570b57cec5SDimitry Andric
4580b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
459e8d8bef9SDimitry Andric    constexpr OutputIterator                          // constexpr in C++20
4600b57cec5SDimitry Andric    set_union(InputIterator1 first1, InputIterator1 last1,
4610b57cec5SDimitry Andric              InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4620b57cec5SDimitry Andric
4630b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
464e8d8bef9SDimitry Andric    constexpr OutputIterator                          // constexpr in C++20
4650b57cec5SDimitry Andric    set_union(InputIterator1 first1, InputIterator1 last1,
4660b57cec5SDimitry Andric              InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
4670b57cec5SDimitry Andric
4680b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
4690b57cec5SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4700b57cec5SDimitry Andric    set_intersection(InputIterator1 first1, InputIterator1 last1,
4710b57cec5SDimitry Andric                     InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4720b57cec5SDimitry Andric
4730b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
4740b57cec5SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4750b57cec5SDimitry Andric    set_intersection(InputIterator1 first1, InputIterator1 last1,
4760b57cec5SDimitry Andric                     InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
4770b57cec5SDimitry Andric
4780b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
479e8d8bef9SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4800b57cec5SDimitry Andric    set_difference(InputIterator1 first1, InputIterator1 last1,
4810b57cec5SDimitry Andric                   InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4820b57cec5SDimitry Andric
4830b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
484e8d8bef9SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4850b57cec5SDimitry Andric    set_difference(InputIterator1 first1, InputIterator1 last1,
4860b57cec5SDimitry Andric                   InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
4870b57cec5SDimitry Andric
4880b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
489e8d8bef9SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4900b57cec5SDimitry Andric    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
4910b57cec5SDimitry Andric                             InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4920b57cec5SDimitry Andric
4930b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
494e8d8bef9SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4950b57cec5SDimitry Andric    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
4960b57cec5SDimitry Andric                             InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
4970b57cec5SDimitry Andric
4980b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
499fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5000b57cec5SDimitry Andric    push_heap(RandomAccessIterator first, RandomAccessIterator last);
5010b57cec5SDimitry Andric
5020b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
503fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5040b57cec5SDimitry Andric    push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
5050b57cec5SDimitry Andric
5060b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
507fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5080b57cec5SDimitry Andric    pop_heap(RandomAccessIterator first, RandomAccessIterator last);
5090b57cec5SDimitry Andric
5100b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
511fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5120b57cec5SDimitry Andric    pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
5130b57cec5SDimitry Andric
5140b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
515fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5160b57cec5SDimitry Andric    make_heap(RandomAccessIterator first, RandomAccessIterator last);
5170b57cec5SDimitry Andric
5180b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
519fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5200b57cec5SDimitry Andric    make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
5210b57cec5SDimitry Andric
5220b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
523fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5240b57cec5SDimitry Andric    sort_heap(RandomAccessIterator first, RandomAccessIterator last);
5250b57cec5SDimitry Andric
5260b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
527fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5280b57cec5SDimitry Andric    sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
5290b57cec5SDimitry Andric
5300b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
5310b57cec5SDimitry Andric    constexpr bool   // constexpr in C++20
5320b57cec5SDimitry Andric    is_heap(RandomAccessIterator first, RandomAccessiterator last);
5330b57cec5SDimitry Andric
5340b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
5350b57cec5SDimitry Andric    constexpr bool   // constexpr in C++20
5360b57cec5SDimitry Andric    is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
5370b57cec5SDimitry Andric
5380b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
5390b57cec5SDimitry Andric    constexpr RandomAccessIterator   // constexpr in C++20
5400b57cec5SDimitry Andric    is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
5410b57cec5SDimitry Andric
5420b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
5430b57cec5SDimitry Andric    constexpr RandomAccessIterator   // constexpr in C++20
5440b57cec5SDimitry Andric    is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
5450b57cec5SDimitry Andric
5460b57cec5SDimitry Andrictemplate <class ForwardIterator>
547e8d8bef9SDimitry Andric    constexpr ForwardIterator        // constexpr in C++14
548e8d8bef9SDimitry Andric    min_element(ForwardIterator first, ForwardIterator last);
5490b57cec5SDimitry Andric
5500b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare>
551e8d8bef9SDimitry Andric    constexpr ForwardIterator        // constexpr in C++14
552e8d8bef9SDimitry Andric    min_element(ForwardIterator first, ForwardIterator last, Compare comp);
5530b57cec5SDimitry Andric
5540b57cec5SDimitry Andrictemplate <class T>
555e8d8bef9SDimitry Andric    constexpr const T&               // constexpr in C++14
556e8d8bef9SDimitry Andric    min(const T& a, const T& b);
5570b57cec5SDimitry Andric
5580b57cec5SDimitry Andrictemplate <class T, class Compare>
559e8d8bef9SDimitry Andric    constexpr const T&               // constexpr in C++14
560e8d8bef9SDimitry Andric    min(const T& a, const T& b, Compare comp);
5610b57cec5SDimitry Andric
5620b57cec5SDimitry Andrictemplate<class T>
563e8d8bef9SDimitry Andric    constexpr T                      // constexpr in C++14
564e8d8bef9SDimitry Andric    min(initializer_list<T> t);
5650b57cec5SDimitry Andric
5660b57cec5SDimitry Andrictemplate<class T, class Compare>
567e8d8bef9SDimitry Andric    constexpr T                      // constexpr in C++14
568e8d8bef9SDimitry Andric    min(initializer_list<T> t, Compare comp);
5690b57cec5SDimitry Andric
5700b57cec5SDimitry Andrictemplate<class T>
5710b57cec5SDimitry Andric    constexpr const T& clamp(const T& v, const T& lo, const T& hi);               // C++17
5720b57cec5SDimitry Andric
5730b57cec5SDimitry Andrictemplate<class T, class Compare>
5740b57cec5SDimitry Andric    constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17
5750b57cec5SDimitry Andric
5760b57cec5SDimitry Andrictemplate <class ForwardIterator>
577e8d8bef9SDimitry Andric    constexpr ForwardIterator        // constexpr in C++14
578e8d8bef9SDimitry Andric    max_element(ForwardIterator first, ForwardIterator last);
5790b57cec5SDimitry Andric
5800b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare>
581e8d8bef9SDimitry Andric    constexpr ForwardIterator        // constexpr in C++14
582e8d8bef9SDimitry Andric    max_element(ForwardIterator first, ForwardIterator last, Compare comp);
5830b57cec5SDimitry Andric
5840b57cec5SDimitry Andrictemplate <class T>
585e8d8bef9SDimitry Andric    constexpr const T&               // constexpr in C++14
586e8d8bef9SDimitry Andric    max(const T& a, const T& b);
5870b57cec5SDimitry Andric
5880b57cec5SDimitry Andrictemplate <class T, class Compare>
589e8d8bef9SDimitry Andric    constexpr const T&               // constexpr in C++14
590e8d8bef9SDimitry Andric    max(const T& a, const T& b, Compare comp);
5910b57cec5SDimitry Andric
5920b57cec5SDimitry Andrictemplate<class T>
593e8d8bef9SDimitry Andric    constexpr T                      // constexpr in C++14
594e8d8bef9SDimitry Andric    max(initializer_list<T> t);
5950b57cec5SDimitry Andric
5960b57cec5SDimitry Andrictemplate<class T, class Compare>
597e8d8bef9SDimitry Andric    constexpr T                      // constexpr in C++14
598e8d8bef9SDimitry Andric    max(initializer_list<T> t, Compare comp);
5990b57cec5SDimitry Andric
6000b57cec5SDimitry Andrictemplate<class ForwardIterator>
601e8d8bef9SDimitry Andric    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++14
602e8d8bef9SDimitry Andric    minmax_element(ForwardIterator first, ForwardIterator last);
6030b57cec5SDimitry Andric
6040b57cec5SDimitry Andrictemplate<class ForwardIterator, class Compare>
605e8d8bef9SDimitry Andric    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++14
606e8d8bef9SDimitry Andric    minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
6070b57cec5SDimitry Andric
6080b57cec5SDimitry Andrictemplate<class T>
609e8d8bef9SDimitry Andric    constexpr pair<const T&, const T&>  // constexpr in C++14
610e8d8bef9SDimitry Andric    minmax(const T& a, const T& b);
6110b57cec5SDimitry Andric
6120b57cec5SDimitry Andrictemplate<class T, class Compare>
613e8d8bef9SDimitry Andric    constexpr pair<const T&, const T&>  // constexpr in C++14
614e8d8bef9SDimitry Andric    minmax(const T& a, const T& b, Compare comp);
6150b57cec5SDimitry Andric
6160b57cec5SDimitry Andrictemplate<class T>
617e8d8bef9SDimitry Andric    constexpr pair<T, T>                // constexpr in C++14
618e8d8bef9SDimitry Andric    minmax(initializer_list<T> t);
6190b57cec5SDimitry Andric
6200b57cec5SDimitry Andrictemplate<class T, class Compare>
621e8d8bef9SDimitry Andric    constexpr pair<T, T>                // constexpr in C++14
622e8d8bef9SDimitry Andric    minmax(initializer_list<T> t, Compare comp);
6230b57cec5SDimitry Andric
6240b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
6250b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
6260b57cec5SDimitry Andric    lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
6270b57cec5SDimitry Andric
6280b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class Compare>
6290b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
6300b57cec5SDimitry Andric    lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
6310b57cec5SDimitry Andric                            InputIterator2 first2, InputIterator2 last2, Compare comp);
6320b57cec5SDimitry Andric
6330b57cec5SDimitry Andrictemplate <class BidirectionalIterator>
634e8d8bef9SDimitry Andric    constexpr bool     // constexpr in C++20
6350b57cec5SDimitry Andric    next_permutation(BidirectionalIterator first, BidirectionalIterator last);
6360b57cec5SDimitry Andric
6370b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class Compare>
638e8d8bef9SDimitry Andric    constexpr bool     // constexpr in C++20
6390b57cec5SDimitry Andric    next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
6400b57cec5SDimitry Andric
6410b57cec5SDimitry Andrictemplate <class BidirectionalIterator>
642e8d8bef9SDimitry Andric    constexpr bool     // constexpr in C++20
6430b57cec5SDimitry Andric    prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
6440b57cec5SDimitry Andric
6450b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class Compare>
646e8d8bef9SDimitry Andric    constexpr bool     // constexpr in C++20
6470b57cec5SDimitry Andric    prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
6480b57cec5SDimitry Andric
649*04eeddc0SDimitry Andricnamespace ranges {
650*04eeddc0SDimitry Andric// [algorithms.results], algorithm result types
651*04eeddc0SDimitry Andrictemplate<class InputIterator, class OutputIterator>
652*04eeddc0SDimitry Andric    struct in_out_result;
653*04eeddc0SDimitry Andric}
654*04eeddc0SDimitry Andric
6550b57cec5SDimitry Andric}  // std
6560b57cec5SDimitry Andric
6570b57cec5SDimitry Andric*/
6580b57cec5SDimitry Andric
659*04eeddc0SDimitry Andric#include <__bits> // __libcpp_clz
6600b57cec5SDimitry Andric#include <__config>
661fe6060f1SDimitry Andric#include <__debug>
662fe6060f1SDimitry Andric#include <cstddef>
6630b57cec5SDimitry Andric#include <cstring>
664fe6060f1SDimitry Andric#include <functional>
665fe6060f1SDimitry Andric#include <initializer_list>
6660b57cec5SDimitry Andric#include <iterator>
667fe6060f1SDimitry Andric#include <memory>
668fe6060f1SDimitry Andric#include <type_traits>
669fe6060f1SDimitry Andric#include <utility> // swap_ranges
6700b57cec5SDimitry Andric#include <version>
6710b57cec5SDimitry Andric
672fe6060f1SDimitry Andric#include <__algorithm/adjacent_find.h>
673fe6060f1SDimitry Andric#include <__algorithm/all_of.h>
674fe6060f1SDimitry Andric#include <__algorithm/any_of.h>
675fe6060f1SDimitry Andric#include <__algorithm/binary_search.h>
676fe6060f1SDimitry Andric#include <__algorithm/clamp.h>
677fe6060f1SDimitry Andric#include <__algorithm/comp.h>
678fe6060f1SDimitry Andric#include <__algorithm/comp_ref_type.h>
679fe6060f1SDimitry Andric#include <__algorithm/copy.h>
680fe6060f1SDimitry Andric#include <__algorithm/copy_backward.h>
681fe6060f1SDimitry Andric#include <__algorithm/copy_if.h>
682fe6060f1SDimitry Andric#include <__algorithm/copy_n.h>
683fe6060f1SDimitry Andric#include <__algorithm/count.h>
684fe6060f1SDimitry Andric#include <__algorithm/count_if.h>
685fe6060f1SDimitry Andric#include <__algorithm/equal.h>
686fe6060f1SDimitry Andric#include <__algorithm/equal_range.h>
687fe6060f1SDimitry Andric#include <__algorithm/fill.h>
688*04eeddc0SDimitry Andric#include <__algorithm/fill_n.h>
689fe6060f1SDimitry Andric#include <__algorithm/find.h>
690fe6060f1SDimitry Andric#include <__algorithm/find_end.h>
691fe6060f1SDimitry Andric#include <__algorithm/find_first_of.h>
692fe6060f1SDimitry Andric#include <__algorithm/find_if.h>
693fe6060f1SDimitry Andric#include <__algorithm/find_if_not.h>
694fe6060f1SDimitry Andric#include <__algorithm/for_each.h>
695fe6060f1SDimitry Andric#include <__algorithm/for_each_n.h>
696fe6060f1SDimitry Andric#include <__algorithm/generate.h>
697*04eeddc0SDimitry Andric#include <__algorithm/generate_n.h>
698fe6060f1SDimitry Andric#include <__algorithm/half_positive.h>
699*04eeddc0SDimitry Andric#include <__algorithm/in_in_result.h>
700*04eeddc0SDimitry Andric#include <__algorithm/in_out_result.h>
701fe6060f1SDimitry Andric#include <__algorithm/includes.h>
702fe6060f1SDimitry Andric#include <__algorithm/inplace_merge.h>
703fe6060f1SDimitry Andric#include <__algorithm/is_heap.h>
704fe6060f1SDimitry Andric#include <__algorithm/is_heap_until.h>
705fe6060f1SDimitry Andric#include <__algorithm/is_partitioned.h>
706fe6060f1SDimitry Andric#include <__algorithm/is_permutation.h>
707fe6060f1SDimitry Andric#include <__algorithm/is_sorted.h>
708fe6060f1SDimitry Andric#include <__algorithm/is_sorted_until.h>
709fe6060f1SDimitry Andric#include <__algorithm/iter_swap.h>
710fe6060f1SDimitry Andric#include <__algorithm/lexicographical_compare.h>
711fe6060f1SDimitry Andric#include <__algorithm/lower_bound.h>
712fe6060f1SDimitry Andric#include <__algorithm/make_heap.h>
713fe6060f1SDimitry Andric#include <__algorithm/max.h>
714fe6060f1SDimitry Andric#include <__algorithm/max_element.h>
715fe6060f1SDimitry Andric#include <__algorithm/merge.h>
716fe6060f1SDimitry Andric#include <__algorithm/min.h>
717fe6060f1SDimitry Andric#include <__algorithm/min_element.h>
718fe6060f1SDimitry Andric#include <__algorithm/minmax.h>
719fe6060f1SDimitry Andric#include <__algorithm/minmax_element.h>
720fe6060f1SDimitry Andric#include <__algorithm/mismatch.h>
721fe6060f1SDimitry Andric#include <__algorithm/move.h>
722fe6060f1SDimitry Andric#include <__algorithm/move_backward.h>
723fe6060f1SDimitry Andric#include <__algorithm/next_permutation.h>
724fe6060f1SDimitry Andric#include <__algorithm/none_of.h>
725fe6060f1SDimitry Andric#include <__algorithm/nth_element.h>
726fe6060f1SDimitry Andric#include <__algorithm/partial_sort.h>
727fe6060f1SDimitry Andric#include <__algorithm/partial_sort_copy.h>
728fe6060f1SDimitry Andric#include <__algorithm/partition.h>
729fe6060f1SDimitry Andric#include <__algorithm/partition_copy.h>
730fe6060f1SDimitry Andric#include <__algorithm/partition_point.h>
731fe6060f1SDimitry Andric#include <__algorithm/pop_heap.h>
732fe6060f1SDimitry Andric#include <__algorithm/prev_permutation.h>
733fe6060f1SDimitry Andric#include <__algorithm/push_heap.h>
734fe6060f1SDimitry Andric#include <__algorithm/remove.h>
735fe6060f1SDimitry Andric#include <__algorithm/remove_copy.h>
736fe6060f1SDimitry Andric#include <__algorithm/remove_copy_if.h>
737fe6060f1SDimitry Andric#include <__algorithm/remove_if.h>
738fe6060f1SDimitry Andric#include <__algorithm/replace.h>
739fe6060f1SDimitry Andric#include <__algorithm/replace_copy.h>
740fe6060f1SDimitry Andric#include <__algorithm/replace_copy_if.h>
741fe6060f1SDimitry Andric#include <__algorithm/replace_if.h>
742fe6060f1SDimitry Andric#include <__algorithm/reverse.h>
743fe6060f1SDimitry Andric#include <__algorithm/reverse_copy.h>
744fe6060f1SDimitry Andric#include <__algorithm/rotate.h>
745fe6060f1SDimitry Andric#include <__algorithm/rotate_copy.h>
746fe6060f1SDimitry Andric#include <__algorithm/sample.h>
747fe6060f1SDimitry Andric#include <__algorithm/search.h>
748fe6060f1SDimitry Andric#include <__algorithm/search_n.h>
749fe6060f1SDimitry Andric#include <__algorithm/set_difference.h>
750fe6060f1SDimitry Andric#include <__algorithm/set_intersection.h>
751fe6060f1SDimitry Andric#include <__algorithm/set_symmetric_difference.h>
752fe6060f1SDimitry Andric#include <__algorithm/set_union.h>
753fe6060f1SDimitry Andric#include <__algorithm/shift_left.h>
754fe6060f1SDimitry Andric#include <__algorithm/shift_right.h>
755fe6060f1SDimitry Andric#include <__algorithm/shuffle.h>
756fe6060f1SDimitry Andric#include <__algorithm/sift_down.h>
757fe6060f1SDimitry Andric#include <__algorithm/sort.h>
758fe6060f1SDimitry Andric#include <__algorithm/sort_heap.h>
759fe6060f1SDimitry Andric#include <__algorithm/stable_partition.h>
760fe6060f1SDimitry Andric#include <__algorithm/stable_sort.h>
761fe6060f1SDimitry Andric#include <__algorithm/swap_ranges.h>
762fe6060f1SDimitry Andric#include <__algorithm/transform.h>
763fe6060f1SDimitry Andric#include <__algorithm/unique.h>
764*04eeddc0SDimitry Andric#include <__algorithm/unique_copy.h>
765fe6060f1SDimitry Andric#include <__algorithm/unwrap_iter.h>
766fe6060f1SDimitry Andric#include <__algorithm/upper_bound.h>
7670b57cec5SDimitry Andric
7680b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
7690b57cec5SDimitry Andric#pragma GCC system_header
7700b57cec5SDimitry Andric#endif
7710b57cec5SDimitry Andric
772e40139ffSDimitry Andric#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
773e40139ffSDimitry Andric#   include <__pstl_algorithm>
774e40139ffSDimitry Andric#endif
775e40139ffSDimitry Andric
7760b57cec5SDimitry Andric#endif // _LIBCPP_ALGORITHM
777