xref: /freebsd/contrib/llvm-project/libcxx/include/algorithm (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
10b57cec5SDimitry Andric// -*- C++ -*-
2*349cc55cSDimitry 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
210b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
220b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
230b57cec5SDimitry Andric    all_of(InputIterator first, InputIterator last, Predicate pred);
240b57cec5SDimitry Andric
250b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
260b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
270b57cec5SDimitry Andric    any_of(InputIterator first, InputIterator last, Predicate pred);
280b57cec5SDimitry Andric
290b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
300b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
310b57cec5SDimitry Andric    none_of(InputIterator first, InputIterator last, Predicate pred);
320b57cec5SDimitry Andric
330b57cec5SDimitry Andrictemplate <class InputIterator, class Function>
340b57cec5SDimitry Andric    constexpr Function          // constexpr in C++20
350b57cec5SDimitry Andric    for_each(InputIterator first, InputIterator last, Function f);
360b57cec5SDimitry Andric
370b57cec5SDimitry Andrictemplate<class InputIterator, class Size, class Function>
380b57cec5SDimitry Andric    constexpr InputIterator     // constexpr in C++20
390b57cec5SDimitry Andric    for_each_n(InputIterator first, Size n, Function f); // C++17
400b57cec5SDimitry Andric
410b57cec5SDimitry Andrictemplate <class InputIterator, class T>
420b57cec5SDimitry Andric    constexpr InputIterator     // constexpr in C++20
430b57cec5SDimitry Andric    find(InputIterator first, InputIterator last, const T& value);
440b57cec5SDimitry Andric
450b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
460b57cec5SDimitry Andric    constexpr InputIterator     // constexpr in C++20
470b57cec5SDimitry Andric    find_if(InputIterator first, InputIterator last, Predicate pred);
480b57cec5SDimitry Andric
490b57cec5SDimitry Andrictemplate<class InputIterator, class Predicate>
50e8d8bef9SDimitry Andric    constexpr InputIterator     // constexpr in C++20
510b57cec5SDimitry Andric    find_if_not(InputIterator first, InputIterator last, Predicate pred);
520b57cec5SDimitry Andric
530b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
54e8d8bef9SDimitry Andric    constexpr ForwardIterator1  // constexpr in C++20
550b57cec5SDimitry Andric    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
560b57cec5SDimitry Andric             ForwardIterator2 first2, ForwardIterator2 last2);
570b57cec5SDimitry Andric
580b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
59e8d8bef9SDimitry Andric    constexpr ForwardIterator1  // constexpr in C++20
600b57cec5SDimitry Andric    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
610b57cec5SDimitry Andric             ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
620b57cec5SDimitry Andric
630b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
640b57cec5SDimitry Andric    constexpr ForwardIterator1  // constexpr in C++20
650b57cec5SDimitry Andric    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
660b57cec5SDimitry Andric                  ForwardIterator2 first2, ForwardIterator2 last2);
670b57cec5SDimitry Andric
680b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
690b57cec5SDimitry Andric    constexpr ForwardIterator1  // constexpr in C++20
700b57cec5SDimitry Andric    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
710b57cec5SDimitry Andric                  ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
720b57cec5SDimitry Andric
730b57cec5SDimitry Andrictemplate <class ForwardIterator>
740b57cec5SDimitry Andric    constexpr ForwardIterator   // constexpr in C++20
750b57cec5SDimitry Andric    adjacent_find(ForwardIterator first, ForwardIterator last);
760b57cec5SDimitry Andric
770b57cec5SDimitry Andrictemplate <class ForwardIterator, class BinaryPredicate>
780b57cec5SDimitry Andric    constexpr ForwardIterator   // constexpr in C++20
790b57cec5SDimitry Andric    adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
800b57cec5SDimitry Andric
810b57cec5SDimitry Andrictemplate <class InputIterator, class T>
820b57cec5SDimitry Andric    constexpr typename iterator_traits<InputIterator>::difference_type  // constexpr in C++20
830b57cec5SDimitry Andric    count(InputIterator first, InputIterator last, const T& value);
840b57cec5SDimitry Andric
850b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
860b57cec5SDimitry Andric    constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
870b57cec5SDimitry Andric    count_if(InputIterator first, InputIterator last, Predicate pred);
880b57cec5SDimitry Andric
890b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
900b57cec5SDimitry Andric    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
910b57cec5SDimitry Andric    mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
920b57cec5SDimitry Andric
930b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
940b57cec5SDimitry Andric    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
950b57cec5SDimitry Andric    mismatch(InputIterator1 first1, InputIterator1 last1,
960b57cec5SDimitry Andric             InputIterator2 first2, InputIterator2 last2); // **C++14**
970b57cec5SDimitry Andric
980b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
990b57cec5SDimitry Andric    constexpr pair<InputIterator1, InputIterator2>   // constexpr in C++20
1000b57cec5SDimitry Andric    mismatch(InputIterator1 first1, InputIterator1 last1,
1010b57cec5SDimitry Andric             InputIterator2 first2, BinaryPredicate pred);
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, InputIterator2 last2,
1070b57cec5SDimitry Andric             BinaryPredicate pred); // **C++14**
1080b57cec5SDimitry Andric
1090b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
1100b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1110b57cec5SDimitry Andric    equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
1140b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1150b57cec5SDimitry Andric    equal(InputIterator1 first1, InputIterator1 last1,
1160b57cec5SDimitry Andric          InputIterator2 first2, InputIterator2 last2); // **C++14**
1170b57cec5SDimitry Andric
1180b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
1190b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1200b57cec5SDimitry Andric    equal(InputIterator1 first1, InputIterator1 last1,
1210b57cec5SDimitry Andric          InputIterator2 first2, BinaryPredicate pred);
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, InputIterator2 last2,
1270b57cec5SDimitry Andric          BinaryPredicate pred); // **C++14**
1280b57cec5SDimitry Andric
1290b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2>
1300b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1310b57cec5SDimitry Andric    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1320b57cec5SDimitry Andric                   ForwardIterator2 first2);
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, ForwardIterator2 last2); // **C++14**
1380b57cec5SDimitry Andric
1390b57cec5SDimitry Andrictemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1400b57cec5SDimitry Andric    constexpr bool      // constexpr in C++20
1410b57cec5SDimitry Andric    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1420b57cec5SDimitry Andric                   ForwardIterator2 first2, BinaryPredicate pred);
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, ForwardIterator2 last2,
1480b57cec5SDimitry Andric                   BinaryPredicate pred);  // **C++14**
1490b57cec5SDimitry Andric
1500b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
1510b57cec5SDimitry Andric    constexpr ForwardIterator1      // constexpr in C++20
1520b57cec5SDimitry Andric    search(ForwardIterator1 first1, ForwardIterator1 last1,
1530b57cec5SDimitry Andric           ForwardIterator2 first2, ForwardIterator2 last2);
1540b57cec5SDimitry Andric
1550b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1560b57cec5SDimitry Andric    constexpr ForwardIterator1      // constexpr in C++20
1570b57cec5SDimitry Andric    search(ForwardIterator1 first1, ForwardIterator1 last1,
1580b57cec5SDimitry Andric           ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
1590b57cec5SDimitry Andric
1600b57cec5SDimitry Andrictemplate <class ForwardIterator, class Size, class T>
1610b57cec5SDimitry Andric    constexpr ForwardIterator       // constexpr in C++20
1620b57cec5SDimitry Andric    search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
1630b57cec5SDimitry Andric
1640b57cec5SDimitry Andrictemplate <class ForwardIterator, class Size, class T, class BinaryPredicate>
1650b57cec5SDimitry Andric    constexpr ForwardIterator       // constexpr in C++20
1660b57cec5SDimitry Andric    search_n(ForwardIterator first, ForwardIterator last,
1670b57cec5SDimitry Andric             Size count, const T& value, BinaryPredicate pred);
1680b57cec5SDimitry Andric
1690b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator>
170480093f4SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
1710b57cec5SDimitry Andric    copy(InputIterator first, InputIterator last, OutputIterator result);
1720b57cec5SDimitry Andric
1730b57cec5SDimitry Andrictemplate<class InputIterator, class OutputIterator, class Predicate>
174480093f4SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
1750b57cec5SDimitry Andric    copy_if(InputIterator first, InputIterator last,
1760b57cec5SDimitry Andric            OutputIterator result, Predicate pred);
1770b57cec5SDimitry Andric
1780b57cec5SDimitry Andrictemplate<class InputIterator, class Size, class OutputIterator>
179480093f4SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
1800b57cec5SDimitry Andric    copy_n(InputIterator first, Size n, OutputIterator result);
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andrictemplate <class BidirectionalIterator1, class BidirectionalIterator2>
183480093f4SDimitry Andric    constexpr BidirectionalIterator2      // constexpr in C++20
1840b57cec5SDimitry Andric    copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
1850b57cec5SDimitry Andric                  BidirectionalIterator2 result);
1860b57cec5SDimitry Andric
1870b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
188e8d8bef9SDimitry Andric    constexpr ForwardIterator2    // constexpr in C++20
1890b57cec5SDimitry Andric    swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
1900b57cec5SDimitry Andric
1910b57cec5SDimitry Andrictemplate <class ForwardIterator1, class ForwardIterator2>
192e8d8bef9SDimitry Andric    constexpr void                // constexpr in C++20
1930b57cec5SDimitry Andric    iter_swap(ForwardIterator1 a, ForwardIterator2 b);
1940b57cec5SDimitry Andric
1950b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class UnaryOperation>
1960b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
1970b57cec5SDimitry Andric    transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
1980b57cec5SDimitry Andric
1990b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
2000b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2010b57cec5SDimitry Andric    transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
2020b57cec5SDimitry Andric              OutputIterator result, BinaryOperation binary_op);
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
2050b57cec5SDimitry Andric    constexpr void      // constexpr in C++20
2060b57cec5SDimitry Andric    replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
2070b57cec5SDimitry Andric
2080b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate, class T>
2090b57cec5SDimitry Andric    constexpr void      // constexpr in C++20
2100b57cec5SDimitry Andric    replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
2110b57cec5SDimitry Andric
2120b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class T>
2130b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2140b57cec5SDimitry Andric    replace_copy(InputIterator first, InputIterator last, OutputIterator result,
2150b57cec5SDimitry Andric                 const T& old_value, const T& new_value);
2160b57cec5SDimitry Andric
2170b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class Predicate, class T>
2180b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2190b57cec5SDimitry Andric    replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
2200b57cec5SDimitry Andric
2210b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
2220b57cec5SDimitry Andric    constexpr void      // constexpr in C++20
2230b57cec5SDimitry Andric    fill(ForwardIterator first, ForwardIterator last, const T& value);
2240b57cec5SDimitry Andric
2250b57cec5SDimitry Andrictemplate <class OutputIterator, class Size, class T>
2260b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2270b57cec5SDimitry Andric    fill_n(OutputIterator first, Size n, const T& value);
2280b57cec5SDimitry Andric
2290b57cec5SDimitry Andrictemplate <class ForwardIterator, class Generator>
2300b57cec5SDimitry Andric    constexpr void      // constexpr in C++20
2310b57cec5SDimitry Andric    generate(ForwardIterator first, ForwardIterator last, Generator gen);
2320b57cec5SDimitry Andric
2330b57cec5SDimitry Andrictemplate <class OutputIterator, class Size, class Generator>
2340b57cec5SDimitry Andric    constexpr OutputIterator      // constexpr in C++20
2350b57cec5SDimitry Andric    generate_n(OutputIterator first, Size n, Generator gen);
2360b57cec5SDimitry Andric
2370b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
2380b57cec5SDimitry Andric    constexpr ForwardIterator     // constexpr in C++20
2390b57cec5SDimitry Andric    remove(ForwardIterator first, ForwardIterator last, const T& value);
2400b57cec5SDimitry Andric
2410b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate>
2420b57cec5SDimitry Andric    constexpr ForwardIterator     // constexpr in C++20
2430b57cec5SDimitry Andric    remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
2440b57cec5SDimitry Andric
2450b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class T>
2460b57cec5SDimitry Andric    constexpr OutputIterator     // constexpr in C++20
2470b57cec5SDimitry Andric    remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
2480b57cec5SDimitry Andric
2490b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class Predicate>
2500b57cec5SDimitry Andric    constexpr OutputIterator     // constexpr in C++20
2510b57cec5SDimitry Andric    remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
2520b57cec5SDimitry Andric
2530b57cec5SDimitry Andrictemplate <class ForwardIterator>
254e8d8bef9SDimitry Andric    constexpr ForwardIterator    // constexpr in C++20
2550b57cec5SDimitry Andric    unique(ForwardIterator first, ForwardIterator last);
2560b57cec5SDimitry Andric
2570b57cec5SDimitry Andrictemplate <class ForwardIterator, class BinaryPredicate>
258e8d8bef9SDimitry Andric    constexpr ForwardIterator    // constexpr in C++20
2590b57cec5SDimitry Andric    unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
2600b57cec5SDimitry Andric
2610b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator>
262e8d8bef9SDimitry Andric    constexpr OutputIterator     // constexpr in C++20
2630b57cec5SDimitry Andric    unique_copy(InputIterator first, InputIterator last, OutputIterator result);
2640b57cec5SDimitry Andric
2650b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator, class BinaryPredicate>
266e8d8bef9SDimitry Andric    constexpr OutputIterator     // constexpr in C++20
2670b57cec5SDimitry Andric    unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
2680b57cec5SDimitry Andric
2690b57cec5SDimitry Andrictemplate <class BidirectionalIterator>
270e8d8bef9SDimitry Andric    constexpr void               // constexpr in C++20
2710b57cec5SDimitry Andric    reverse(BidirectionalIterator first, BidirectionalIterator last);
2720b57cec5SDimitry Andric
2730b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class OutputIterator>
2740b57cec5SDimitry Andric    constexpr OutputIterator       // constexpr in C++20
2750b57cec5SDimitry Andric    reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
2760b57cec5SDimitry Andric
2770b57cec5SDimitry Andrictemplate <class ForwardIterator>
278e8d8bef9SDimitry Andric    constexpr ForwardIterator      // constexpr in C++20
2790b57cec5SDimitry Andric    rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
2800b57cec5SDimitry Andric
2810b57cec5SDimitry Andrictemplate <class ForwardIterator, class OutputIterator>
282e8d8bef9SDimitry Andric    constexpr OutputIterator       // constexpr in C++20
2830b57cec5SDimitry Andric    rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
2840b57cec5SDimitry Andric
2850b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
2860b57cec5SDimitry Andric    void
2870b57cec5SDimitry Andric    random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
2880b57cec5SDimitry Andric
2890b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class RandomNumberGenerator>
2900b57cec5SDimitry Andric    void
2910b57cec5SDimitry Andric    random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
2920b57cec5SDimitry Andric                   RandomNumberGenerator& rand);  // deprecated in C++14, removed in C++17
2930b57cec5SDimitry Andric
2940b57cec5SDimitry Andrictemplate<class PopulationIterator, class SampleIterator,
2950b57cec5SDimitry Andric         class Distance, class UniformRandomBitGenerator>
2960b57cec5SDimitry Andric    SampleIterator sample(PopulationIterator first, PopulationIterator last,
2970b57cec5SDimitry Andric                          SampleIterator out, Distance n,
2980b57cec5SDimitry Andric                          UniformRandomBitGenerator&& g); // C++17
2990b57cec5SDimitry Andric
3000b57cec5SDimitry Andrictemplate<class RandomAccessIterator, class UniformRandomNumberGenerator>
3010b57cec5SDimitry Andric    void shuffle(RandomAccessIterator first, RandomAccessIterator last,
3020b57cec5SDimitry Andric                 UniformRandomNumberGenerator&& g);
3030b57cec5SDimitry Andric
304e8d8bef9SDimitry Andrictemplate<class ForwardIterator>
305e8d8bef9SDimitry Andric  constexpr ForwardIterator
306e8d8bef9SDimitry Andric    shift_left(ForwardIterator first, ForwardIterator last,
307e8d8bef9SDimitry Andric               typename iterator_traits<ForwardIterator>::difference_type n); // C++20
308e8d8bef9SDimitry Andric
309e8d8bef9SDimitry Andrictemplate<class ForwardIterator>
310e8d8bef9SDimitry Andric  constexpr ForwardIterator
311e8d8bef9SDimitry Andric    shift_right(ForwardIterator first, ForwardIterator last,
312e8d8bef9SDimitry Andric                typename iterator_traits<ForwardIterator>::difference_type n); // C++20
313e8d8bef9SDimitry Andric
3140b57cec5SDimitry Andrictemplate <class InputIterator, class Predicate>
3150b57cec5SDimitry Andric    constexpr bool  // constexpr in C++20
3160b57cec5SDimitry Andric    is_partitioned(InputIterator first, InputIterator last, Predicate pred);
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate>
319e8d8bef9SDimitry Andric    constexpr ForwardIterator  // constexpr in C++20
3200b57cec5SDimitry Andric    partition(ForwardIterator first, ForwardIterator last, Predicate pred);
3210b57cec5SDimitry Andric
3220b57cec5SDimitry Andrictemplate <class InputIterator, class OutputIterator1,
3230b57cec5SDimitry Andric          class OutputIterator2, class Predicate>
3240b57cec5SDimitry Andric    constexpr pair<OutputIterator1, OutputIterator2>   // constexpr in C++20
3250b57cec5SDimitry Andric    partition_copy(InputIterator first, InputIterator last,
3260b57cec5SDimitry Andric                   OutputIterator1 out_true, OutputIterator2 out_false,
3270b57cec5SDimitry Andric                   Predicate pred);
3280b57cec5SDimitry Andric
3290b57cec5SDimitry Andrictemplate <class ForwardIterator, class Predicate>
3300b57cec5SDimitry Andric    ForwardIterator
3310b57cec5SDimitry Andric    stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
3320b57cec5SDimitry Andric
3330b57cec5SDimitry Andrictemplate<class ForwardIterator, class Predicate>
3340b57cec5SDimitry Andric    constexpr ForwardIterator  // constexpr in C++20
3350b57cec5SDimitry Andric    partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
3360b57cec5SDimitry Andric
3370b57cec5SDimitry Andrictemplate <class ForwardIterator>
3380b57cec5SDimitry Andric    constexpr bool  // constexpr in C++20
3390b57cec5SDimitry Andric    is_sorted(ForwardIterator first, ForwardIterator last);
3400b57cec5SDimitry Andric
3410b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare>
342e8d8bef9SDimitry Andric    constexpr bool  // constexpr in C++20
3430b57cec5SDimitry Andric    is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
3440b57cec5SDimitry Andric
3450b57cec5SDimitry Andrictemplate<class ForwardIterator>
3460b57cec5SDimitry Andric    constexpr ForwardIterator    // constexpr in C++20
3470b57cec5SDimitry Andric    is_sorted_until(ForwardIterator first, ForwardIterator last);
3480b57cec5SDimitry Andric
3490b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare>
3500b57cec5SDimitry Andric    constexpr ForwardIterator    // constexpr in C++20
3510b57cec5SDimitry Andric    is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
3520b57cec5SDimitry Andric
3530b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
354fe6060f1SDimitry Andric    constexpr void               // constexpr in C++20
3550b57cec5SDimitry Andric    sort(RandomAccessIterator first, RandomAccessIterator last);
3560b57cec5SDimitry Andric
3570b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
358fe6060f1SDimitry Andric    constexpr void               // constexpr in C++20
3590b57cec5SDimitry Andric    sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
3600b57cec5SDimitry Andric
3610b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
3620b57cec5SDimitry Andric    void
3630b57cec5SDimitry Andric    stable_sort(RandomAccessIterator first, RandomAccessIterator last);
3640b57cec5SDimitry Andric
3650b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
3660b57cec5SDimitry Andric    void
3670b57cec5SDimitry Andric    stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
3680b57cec5SDimitry Andric
3690b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
370fe6060f1SDimitry Andric    constexpr void                    // constexpr in C++20
3710b57cec5SDimitry Andric    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
3720b57cec5SDimitry Andric
3730b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
374fe6060f1SDimitry Andric    constexpr void                    // constexpr in C++20
3750b57cec5SDimitry Andric    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
3760b57cec5SDimitry Andric
3770b57cec5SDimitry Andrictemplate <class InputIterator, class RandomAccessIterator>
378fe6060f1SDimitry Andric    constexpr RandomAccessIterator    // constexpr in C++20
3790b57cec5SDimitry Andric    partial_sort_copy(InputIterator first, InputIterator last,
3800b57cec5SDimitry Andric                      RandomAccessIterator result_first, RandomAccessIterator result_last);
3810b57cec5SDimitry Andric
3820b57cec5SDimitry Andrictemplate <class InputIterator, class RandomAccessIterator, class Compare>
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, Compare comp);
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
388fe6060f1SDimitry Andric    constexpr void                    // constexpr in C++20
3890b57cec5SDimitry Andric    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
3900b57cec5SDimitry Andric
3910b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
392fe6060f1SDimitry Andric    constexpr void                    // constexpr in C++20
3930b57cec5SDimitry Andric    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
3940b57cec5SDimitry Andric
3950b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
3960b57cec5SDimitry Andric    constexpr ForwardIterator                         // constexpr in C++20
3970b57cec5SDimitry Andric    lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
3980b57cec5SDimitry Andric
3990b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare>
4000b57cec5SDimitry Andric    constexpr ForwardIterator                         // constexpr in C++20
4010b57cec5SDimitry Andric    lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
4020b57cec5SDimitry Andric
4030b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
4040b57cec5SDimitry Andric    constexpr ForwardIterator                         // constexpr in C++20
4050b57cec5SDimitry Andric    upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
4060b57cec5SDimitry Andric
4070b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare>
4080b57cec5SDimitry Andric    constexpr ForwardIterator                         // constexpr in C++20
4090b57cec5SDimitry Andric    upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
4100b57cec5SDimitry Andric
4110b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
4120b57cec5SDimitry Andric    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++20
4130b57cec5SDimitry Andric    equal_range(ForwardIterator first, ForwardIterator last, const T& value);
4140b57cec5SDimitry Andric
4150b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare>
4160b57cec5SDimitry Andric    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++20
4170b57cec5SDimitry Andric    equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
4180b57cec5SDimitry Andric
4190b57cec5SDimitry Andrictemplate <class ForwardIterator, class T>
4200b57cec5SDimitry Andric    constexpr bool                                    // constexpr in C++20
4210b57cec5SDimitry Andric    binary_search(ForwardIterator first, ForwardIterator last, const T& value);
4220b57cec5SDimitry Andric
4230b57cec5SDimitry Andrictemplate <class ForwardIterator, class T, class Compare>
4240b57cec5SDimitry Andric    constexpr bool                                    // constexpr in C++20
4250b57cec5SDimitry Andric    binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
4260b57cec5SDimitry Andric
4270b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
428e8d8bef9SDimitry Andric    constexpr OutputIterator                          // constexpr in C++20
4290b57cec5SDimitry Andric    merge(InputIterator1 first1, InputIterator1 last1,
4300b57cec5SDimitry Andric          InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4310b57cec5SDimitry Andric
4320b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
433e8d8bef9SDimitry Andric    constexpr OutputIterator                          // constexpr in C++20
4340b57cec5SDimitry Andric    merge(InputIterator1 first1, InputIterator1 last1,
4350b57cec5SDimitry Andric          InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
4360b57cec5SDimitry Andric
4370b57cec5SDimitry Andrictemplate <class BidirectionalIterator>
4380b57cec5SDimitry Andric    void
4390b57cec5SDimitry Andric    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
4400b57cec5SDimitry Andric
4410b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class Compare>
4420b57cec5SDimitry Andric    void
4430b57cec5SDimitry Andric    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
4440b57cec5SDimitry Andric
4450b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
4460b57cec5SDimitry Andric    constexpr bool                                    // constexpr in C++20
4470b57cec5SDimitry Andric    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
4480b57cec5SDimitry Andric
4490b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class Compare>
4500b57cec5SDimitry Andric    constexpr bool                                    // constexpr in C++20
4510b57cec5SDimitry Andric    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
4520b57cec5SDimitry Andric
4530b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
454e8d8bef9SDimitry Andric    constexpr OutputIterator                          // constexpr in C++20
4550b57cec5SDimitry Andric    set_union(InputIterator1 first1, InputIterator1 last1,
4560b57cec5SDimitry Andric              InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4570b57cec5SDimitry Andric
4580b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
459e8d8bef9SDimitry Andric    constexpr OutputIterator                          // constexpr in C++20
4600b57cec5SDimitry Andric    set_union(InputIterator1 first1, InputIterator1 last1,
4610b57cec5SDimitry Andric              InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
4620b57cec5SDimitry Andric
4630b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
4640b57cec5SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4650b57cec5SDimitry Andric    set_intersection(InputIterator1 first1, InputIterator1 last1,
4660b57cec5SDimitry Andric                     InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4670b57cec5SDimitry Andric
4680b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
4690b57cec5SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4700b57cec5SDimitry Andric    set_intersection(InputIterator1 first1, InputIterator1 last1,
4710b57cec5SDimitry Andric                     InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
4720b57cec5SDimitry Andric
4730b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
474e8d8bef9SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4750b57cec5SDimitry Andric    set_difference(InputIterator1 first1, InputIterator1 last1,
4760b57cec5SDimitry Andric                   InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4770b57cec5SDimitry Andric
4780b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
479e8d8bef9SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4800b57cec5SDimitry Andric    set_difference(InputIterator1 first1, InputIterator1 last1,
4810b57cec5SDimitry Andric                   InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
4820b57cec5SDimitry Andric
4830b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator>
484e8d8bef9SDimitry Andric    constexpr OutputIterator                         // constexpr in C++20
4850b57cec5SDimitry Andric    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
4860b57cec5SDimitry Andric                             InputIterator2 first2, InputIterator2 last2, OutputIterator result);
4870b57cec5SDimitry Andric
4880b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
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, Compare comp);
4920b57cec5SDimitry Andric
4930b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
494fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
4950b57cec5SDimitry Andric    push_heap(RandomAccessIterator first, RandomAccessIterator last);
4960b57cec5SDimitry Andric
4970b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
498fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
4990b57cec5SDimitry Andric    push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
5000b57cec5SDimitry Andric
5010b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
502fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5030b57cec5SDimitry Andric    pop_heap(RandomAccessIterator first, RandomAccessIterator last);
5040b57cec5SDimitry Andric
5050b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
506fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5070b57cec5SDimitry Andric    pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
5080b57cec5SDimitry Andric
5090b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
510fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5110b57cec5SDimitry Andric    make_heap(RandomAccessIterator first, RandomAccessIterator last);
5120b57cec5SDimitry Andric
5130b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
514fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5150b57cec5SDimitry Andric    make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
5160b57cec5SDimitry Andric
5170b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
518fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5190b57cec5SDimitry Andric    sort_heap(RandomAccessIterator first, RandomAccessIterator last);
5200b57cec5SDimitry Andric
5210b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
522fe6060f1SDimitry Andric    constexpr void                                   // constexpr in C++20
5230b57cec5SDimitry Andric    sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
5240b57cec5SDimitry Andric
5250b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
5260b57cec5SDimitry Andric    constexpr bool   // constexpr in C++20
5270b57cec5SDimitry Andric    is_heap(RandomAccessIterator first, RandomAccessiterator last);
5280b57cec5SDimitry Andric
5290b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
5300b57cec5SDimitry Andric    constexpr bool   // constexpr in C++20
5310b57cec5SDimitry Andric    is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
5320b57cec5SDimitry Andric
5330b57cec5SDimitry Andrictemplate <class RandomAccessIterator>
5340b57cec5SDimitry Andric    constexpr RandomAccessIterator   // constexpr in C++20
5350b57cec5SDimitry Andric    is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
5360b57cec5SDimitry Andric
5370b57cec5SDimitry Andrictemplate <class RandomAccessIterator, class Compare>
5380b57cec5SDimitry Andric    constexpr RandomAccessIterator   // constexpr in C++20
5390b57cec5SDimitry Andric    is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
5400b57cec5SDimitry Andric
5410b57cec5SDimitry Andrictemplate <class ForwardIterator>
542e8d8bef9SDimitry Andric    constexpr ForwardIterator        // constexpr in C++14
543e8d8bef9SDimitry Andric    min_element(ForwardIterator first, ForwardIterator last);
5440b57cec5SDimitry Andric
5450b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare>
546e8d8bef9SDimitry Andric    constexpr ForwardIterator        // constexpr in C++14
547e8d8bef9SDimitry Andric    min_element(ForwardIterator first, ForwardIterator last, Compare comp);
5480b57cec5SDimitry Andric
5490b57cec5SDimitry Andrictemplate <class T>
550e8d8bef9SDimitry Andric    constexpr const T&               // constexpr in C++14
551e8d8bef9SDimitry Andric    min(const T& a, const T& b);
5520b57cec5SDimitry Andric
5530b57cec5SDimitry Andrictemplate <class T, class Compare>
554e8d8bef9SDimitry Andric    constexpr const T&               // constexpr in C++14
555e8d8bef9SDimitry Andric    min(const T& a, const T& b, Compare comp);
5560b57cec5SDimitry Andric
5570b57cec5SDimitry Andrictemplate<class T>
558e8d8bef9SDimitry Andric    constexpr T                      // constexpr in C++14
559e8d8bef9SDimitry Andric    min(initializer_list<T> t);
5600b57cec5SDimitry Andric
5610b57cec5SDimitry Andrictemplate<class T, class Compare>
562e8d8bef9SDimitry Andric    constexpr T                      // constexpr in C++14
563e8d8bef9SDimitry Andric    min(initializer_list<T> t, Compare comp);
5640b57cec5SDimitry Andric
5650b57cec5SDimitry Andrictemplate<class T>
5660b57cec5SDimitry Andric    constexpr const T& clamp(const T& v, const T& lo, const T& hi);               // C++17
5670b57cec5SDimitry Andric
5680b57cec5SDimitry Andrictemplate<class T, class Compare>
5690b57cec5SDimitry Andric    constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17
5700b57cec5SDimitry Andric
5710b57cec5SDimitry Andrictemplate <class ForwardIterator>
572e8d8bef9SDimitry Andric    constexpr ForwardIterator        // constexpr in C++14
573e8d8bef9SDimitry Andric    max_element(ForwardIterator first, ForwardIterator last);
5740b57cec5SDimitry Andric
5750b57cec5SDimitry Andrictemplate <class ForwardIterator, class Compare>
576e8d8bef9SDimitry Andric    constexpr ForwardIterator        // constexpr in C++14
577e8d8bef9SDimitry Andric    max_element(ForwardIterator first, ForwardIterator last, Compare comp);
5780b57cec5SDimitry Andric
5790b57cec5SDimitry Andrictemplate <class T>
580e8d8bef9SDimitry Andric    constexpr const T&               // constexpr in C++14
581e8d8bef9SDimitry Andric    max(const T& a, const T& b);
5820b57cec5SDimitry Andric
5830b57cec5SDimitry Andrictemplate <class T, class Compare>
584e8d8bef9SDimitry Andric    constexpr const T&               // constexpr in C++14
585e8d8bef9SDimitry Andric    max(const T& a, const T& b, Compare comp);
5860b57cec5SDimitry Andric
5870b57cec5SDimitry Andrictemplate<class T>
588e8d8bef9SDimitry Andric    constexpr T                      // constexpr in C++14
589e8d8bef9SDimitry Andric    max(initializer_list<T> t);
5900b57cec5SDimitry Andric
5910b57cec5SDimitry Andrictemplate<class T, class Compare>
592e8d8bef9SDimitry Andric    constexpr T                      // constexpr in C++14
593e8d8bef9SDimitry Andric    max(initializer_list<T> t, Compare comp);
5940b57cec5SDimitry Andric
5950b57cec5SDimitry Andrictemplate<class ForwardIterator>
596e8d8bef9SDimitry Andric    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++14
597e8d8bef9SDimitry Andric    minmax_element(ForwardIterator first, ForwardIterator last);
5980b57cec5SDimitry Andric
5990b57cec5SDimitry Andrictemplate<class ForwardIterator, class Compare>
600e8d8bef9SDimitry Andric    constexpr pair<ForwardIterator, ForwardIterator>  // constexpr in C++14
601e8d8bef9SDimitry Andric    minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
6020b57cec5SDimitry Andric
6030b57cec5SDimitry Andrictemplate<class T>
604e8d8bef9SDimitry Andric    constexpr pair<const T&, const T&>  // constexpr in C++14
605e8d8bef9SDimitry Andric    minmax(const T& a, const T& b);
6060b57cec5SDimitry Andric
6070b57cec5SDimitry Andrictemplate<class T, class Compare>
608e8d8bef9SDimitry Andric    constexpr pair<const T&, const T&>  // constexpr in C++14
609e8d8bef9SDimitry Andric    minmax(const T& a, const T& b, Compare comp);
6100b57cec5SDimitry Andric
6110b57cec5SDimitry Andrictemplate<class T>
612e8d8bef9SDimitry Andric    constexpr pair<T, T>                // constexpr in C++14
613e8d8bef9SDimitry Andric    minmax(initializer_list<T> t);
6140b57cec5SDimitry Andric
6150b57cec5SDimitry Andrictemplate<class T, class Compare>
616e8d8bef9SDimitry Andric    constexpr pair<T, T>                // constexpr in C++14
617e8d8bef9SDimitry Andric    minmax(initializer_list<T> t, Compare comp);
6180b57cec5SDimitry Andric
6190b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2>
6200b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
6210b57cec5SDimitry Andric    lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
6220b57cec5SDimitry Andric
6230b57cec5SDimitry Andrictemplate <class InputIterator1, class InputIterator2, class Compare>
6240b57cec5SDimitry Andric    constexpr bool     // constexpr in C++20
6250b57cec5SDimitry Andric    lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
6260b57cec5SDimitry Andric                            InputIterator2 first2, InputIterator2 last2, Compare comp);
6270b57cec5SDimitry Andric
6280b57cec5SDimitry Andrictemplate <class BidirectionalIterator>
629e8d8bef9SDimitry Andric    constexpr bool     // constexpr in C++20
6300b57cec5SDimitry Andric    next_permutation(BidirectionalIterator first, BidirectionalIterator last);
6310b57cec5SDimitry Andric
6320b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class Compare>
633e8d8bef9SDimitry Andric    constexpr bool     // constexpr in C++20
6340b57cec5SDimitry Andric    next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
6350b57cec5SDimitry Andric
6360b57cec5SDimitry Andrictemplate <class BidirectionalIterator>
637e8d8bef9SDimitry Andric    constexpr bool     // constexpr in C++20
6380b57cec5SDimitry Andric    prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
6390b57cec5SDimitry Andric
6400b57cec5SDimitry Andrictemplate <class BidirectionalIterator, class Compare>
641e8d8bef9SDimitry Andric    constexpr bool     // constexpr in C++20
6420b57cec5SDimitry Andric    prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
6430b57cec5SDimitry Andric
6440b57cec5SDimitry Andric}  // std
6450b57cec5SDimitry Andric
6460b57cec5SDimitry Andric*/
6470b57cec5SDimitry Andric
6480b57cec5SDimitry Andric#include <__config>
649fe6060f1SDimitry Andric#include <__debug>
650fe6060f1SDimitry Andric#include <__bits> // __libcpp_clz
651fe6060f1SDimitry Andric#include <cstddef>
6520b57cec5SDimitry Andric#include <cstring>
653fe6060f1SDimitry Andric#include <functional>
654fe6060f1SDimitry Andric#include <initializer_list>
6550b57cec5SDimitry Andric#include <utility> // needed to provide swap_ranges.
6560b57cec5SDimitry Andric#include <memory>
6570b57cec5SDimitry Andric#include <iterator>
658fe6060f1SDimitry Andric#include <memory>
659fe6060f1SDimitry Andric#include <type_traits>
660fe6060f1SDimitry Andric#include <utility> // swap_ranges
6610b57cec5SDimitry Andric#include <version>
6620b57cec5SDimitry Andric
663fe6060f1SDimitry Andric#include <__algorithm/adjacent_find.h>
664fe6060f1SDimitry Andric#include <__algorithm/all_of.h>
665fe6060f1SDimitry Andric#include <__algorithm/any_of.h>
666fe6060f1SDimitry Andric#include <__algorithm/binary_search.h>
667fe6060f1SDimitry Andric#include <__algorithm/clamp.h>
668fe6060f1SDimitry Andric#include <__algorithm/comp.h>
669fe6060f1SDimitry Andric#include <__algorithm/comp_ref_type.h>
670fe6060f1SDimitry Andric#include <__algorithm/copy.h>
671fe6060f1SDimitry Andric#include <__algorithm/copy_backward.h>
672fe6060f1SDimitry Andric#include <__algorithm/copy_if.h>
673fe6060f1SDimitry Andric#include <__algorithm/copy_n.h>
674fe6060f1SDimitry Andric#include <__algorithm/count.h>
675fe6060f1SDimitry Andric#include <__algorithm/count_if.h>
676fe6060f1SDimitry Andric#include <__algorithm/equal.h>
677fe6060f1SDimitry Andric#include <__algorithm/equal_range.h>
678fe6060f1SDimitry Andric#include <__algorithm/fill_n.h>
679fe6060f1SDimitry Andric#include <__algorithm/fill.h>
680fe6060f1SDimitry Andric#include <__algorithm/find.h>
681fe6060f1SDimitry Andric#include <__algorithm/find_end.h>
682fe6060f1SDimitry Andric#include <__algorithm/find_first_of.h>
683fe6060f1SDimitry Andric#include <__algorithm/find_if.h>
684fe6060f1SDimitry Andric#include <__algorithm/find_if_not.h>
685fe6060f1SDimitry Andric#include <__algorithm/for_each.h>
686fe6060f1SDimitry Andric#include <__algorithm/for_each_n.h>
687fe6060f1SDimitry Andric#include <__algorithm/generate_n.h>
688fe6060f1SDimitry Andric#include <__algorithm/generate.h>
689fe6060f1SDimitry Andric#include <__algorithm/half_positive.h>
690fe6060f1SDimitry Andric#include <__algorithm/includes.h>
691fe6060f1SDimitry Andric#include <__algorithm/inplace_merge.h>
692fe6060f1SDimitry Andric#include <__algorithm/is_heap.h>
693fe6060f1SDimitry Andric#include <__algorithm/is_heap_until.h>
694fe6060f1SDimitry Andric#include <__algorithm/is_partitioned.h>
695fe6060f1SDimitry Andric#include <__algorithm/is_permutation.h>
696fe6060f1SDimitry Andric#include <__algorithm/is_sorted.h>
697fe6060f1SDimitry Andric#include <__algorithm/is_sorted_until.h>
698fe6060f1SDimitry Andric#include <__algorithm/iter_swap.h>
699fe6060f1SDimitry Andric#include <__algorithm/lexicographical_compare.h>
700fe6060f1SDimitry Andric#include <__algorithm/lower_bound.h>
701fe6060f1SDimitry Andric#include <__algorithm/make_heap.h>
702fe6060f1SDimitry Andric#include <__algorithm/max.h>
703fe6060f1SDimitry Andric#include <__algorithm/max_element.h>
704fe6060f1SDimitry Andric#include <__algorithm/merge.h>
705fe6060f1SDimitry Andric#include <__algorithm/min.h>
706fe6060f1SDimitry Andric#include <__algorithm/min_element.h>
707fe6060f1SDimitry Andric#include <__algorithm/minmax.h>
708fe6060f1SDimitry Andric#include <__algorithm/minmax_element.h>
709fe6060f1SDimitry Andric#include <__algorithm/mismatch.h>
710fe6060f1SDimitry Andric#include <__algorithm/move.h>
711fe6060f1SDimitry Andric#include <__algorithm/move_backward.h>
712fe6060f1SDimitry Andric#include <__algorithm/next_permutation.h>
713fe6060f1SDimitry Andric#include <__algorithm/none_of.h>
714fe6060f1SDimitry Andric#include <__algorithm/nth_element.h>
715fe6060f1SDimitry Andric#include <__algorithm/partial_sort.h>
716fe6060f1SDimitry Andric#include <__algorithm/partial_sort_copy.h>
717fe6060f1SDimitry Andric#include <__algorithm/partition.h>
718fe6060f1SDimitry Andric#include <__algorithm/partition_copy.h>
719fe6060f1SDimitry Andric#include <__algorithm/partition_point.h>
720fe6060f1SDimitry Andric#include <__algorithm/pop_heap.h>
721fe6060f1SDimitry Andric#include <__algorithm/prev_permutation.h>
722fe6060f1SDimitry Andric#include <__algorithm/push_heap.h>
723fe6060f1SDimitry Andric#include <__algorithm/remove.h>
724fe6060f1SDimitry Andric#include <__algorithm/remove_copy.h>
725fe6060f1SDimitry Andric#include <__algorithm/remove_copy_if.h>
726fe6060f1SDimitry Andric#include <__algorithm/remove_if.h>
727fe6060f1SDimitry Andric#include <__algorithm/replace.h>
728fe6060f1SDimitry Andric#include <__algorithm/replace_copy.h>
729fe6060f1SDimitry Andric#include <__algorithm/replace_copy_if.h>
730fe6060f1SDimitry Andric#include <__algorithm/replace_if.h>
731fe6060f1SDimitry Andric#include <__algorithm/reverse.h>
732fe6060f1SDimitry Andric#include <__algorithm/reverse_copy.h>
733fe6060f1SDimitry Andric#include <__algorithm/rotate.h>
734fe6060f1SDimitry Andric#include <__algorithm/rotate_copy.h>
735fe6060f1SDimitry Andric#include <__algorithm/sample.h>
736fe6060f1SDimitry Andric#include <__algorithm/search.h>
737fe6060f1SDimitry Andric#include <__algorithm/search_n.h>
738fe6060f1SDimitry Andric#include <__algorithm/set_difference.h>
739fe6060f1SDimitry Andric#include <__algorithm/set_intersection.h>
740fe6060f1SDimitry Andric#include <__algorithm/set_symmetric_difference.h>
741fe6060f1SDimitry Andric#include <__algorithm/set_union.h>
742fe6060f1SDimitry Andric#include <__algorithm/shift_left.h>
743fe6060f1SDimitry Andric#include <__algorithm/shift_right.h>
744fe6060f1SDimitry Andric#include <__algorithm/shuffle.h>
745fe6060f1SDimitry Andric#include <__algorithm/sift_down.h>
746fe6060f1SDimitry Andric#include <__algorithm/sort.h>
747fe6060f1SDimitry Andric#include <__algorithm/sort_heap.h>
748fe6060f1SDimitry Andric#include <__algorithm/stable_partition.h>
749fe6060f1SDimitry Andric#include <__algorithm/stable_sort.h>
750fe6060f1SDimitry Andric#include <__algorithm/swap_ranges.h>
751fe6060f1SDimitry Andric#include <__algorithm/transform.h>
752fe6060f1SDimitry Andric#include <__algorithm/unique_copy.h>
753fe6060f1SDimitry Andric#include <__algorithm/unique.h>
754fe6060f1SDimitry Andric#include <__algorithm/unwrap_iter.h>
755fe6060f1SDimitry Andric#include <__algorithm/upper_bound.h>
7560b57cec5SDimitry Andric
7570b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
7580b57cec5SDimitry Andric#pragma GCC system_header
7590b57cec5SDimitry Andric#endif
7600b57cec5SDimitry Andric
761e40139ffSDimitry Andric#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
762e40139ffSDimitry Andric#   include <__pstl_algorithm>
763e40139ffSDimitry Andric#endif
764e40139ffSDimitry Andric
7650b57cec5SDimitry Andric#endif // _LIBCPP_ALGORITHM
766