14a8734deSArthur O'Dwyer //===----------------------------------------------------------------------===//
24a8734deSArthur O'Dwyer //
34a8734deSArthur O'Dwyer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44a8734deSArthur O'Dwyer // See https://llvm.org/LICENSE.txt for license information.
54a8734deSArthur O'Dwyer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64a8734deSArthur O'Dwyer //
74a8734deSArthur O'Dwyer //===----------------------------------------------------------------------===//
84a8734deSArthur O'Dwyer
94a8734deSArthur O'Dwyer // <algorithm>
104a8734deSArthur O'Dwyer
114a8734deSArthur O'Dwyer #include <algorithm>
12b07b5bd7SArthur O'Dwyer #include <cstddef>
134a8734deSArthur O'Dwyer #include <functional>
143cd4531bSNikolas Klauser #include <iterator>
154a8734deSArthur O'Dwyer
164a8734deSArthur O'Dwyer #include "test_macros.h"
174a8734deSArthur O'Dwyer
184a8734deSArthur O'Dwyer struct Incomplete;
194a8734deSArthur O'Dwyer template<class T> struct Holder { T t; };
204a8734deSArthur O'Dwyer
214a8734deSArthur O'Dwyer template<class>
224a8734deSArthur O'Dwyer struct ConvertibleToIntegral {
operator intConvertibleToIntegral234a8734deSArthur O'Dwyer TEST_CONSTEXPR operator int() const { return 1; }
244a8734deSArthur O'Dwyer };
254a8734deSArthur O'Dwyer
264a8734deSArthur O'Dwyer struct Tester {
274a8734deSArthur O'Dwyer using Element = Holder<Incomplete>*;
284a8734deSArthur O'Dwyer Element data[10] = {};
294a8734deSArthur O'Dwyer };
304a8734deSArthur O'Dwyer
operator ()UnaryVoid314a8734deSArthur O'Dwyer struct UnaryVoid { TEST_CONSTEXPR_CXX14 void operator()(void*) const {} };
operator ()UnaryTrue324a8734deSArthur O'Dwyer struct UnaryTrue { TEST_CONSTEXPR bool operator()(void*) const { return true; } };
operator ()NullaryValue33b07b5bd7SArthur O'Dwyer struct NullaryValue { TEST_CONSTEXPR std::nullptr_t operator()() const { return nullptr; } };
operator ()UnaryTransform34b07b5bd7SArthur O'Dwyer struct UnaryTransform { TEST_CONSTEXPR std::nullptr_t operator()(void*) const { return nullptr; } };
operator ()BinaryTransform35b07b5bd7SArthur O'Dwyer struct BinaryTransform { TEST_CONSTEXPR std::nullptr_t operator()(void*, void*) const { return nullptr; } };
364a8734deSArthur O'Dwyer
all_the_algorithms()374a8734deSArthur O'Dwyer TEST_CONSTEXPR_CXX20 bool all_the_algorithms()
384a8734deSArthur O'Dwyer {
394a8734deSArthur O'Dwyer Tester t;
404a8734deSArthur O'Dwyer Tester u;
414a8734deSArthur O'Dwyer Holder<Incomplete> **first = t.data;
424a8734deSArthur O'Dwyer Holder<Incomplete> **mid = t.data+5;
434a8734deSArthur O'Dwyer Holder<Incomplete> **last = t.data+10;
444a8734deSArthur O'Dwyer Holder<Incomplete> **first2 = u.data;
454a8734deSArthur O'Dwyer Holder<Incomplete> **mid2 = u.data+5;
464a8734deSArthur O'Dwyer Holder<Incomplete> **last2 = u.data+10;
474a8734deSArthur O'Dwyer Tester::Element value = nullptr;
484a8734deSArthur O'Dwyer ConvertibleToIntegral<Tester::Element> count;
494a8734deSArthur O'Dwyer
504a8734deSArthur O'Dwyer (void)std::adjacent_find(first, last);
514a8734deSArthur O'Dwyer (void)std::adjacent_find(first, last, std::equal_to<void*>());
524a8734deSArthur O'Dwyer #if TEST_STD_VER >= 11
534a8734deSArthur O'Dwyer (void)std::all_of(first, last, UnaryTrue());
544a8734deSArthur O'Dwyer (void)std::any_of(first, last, UnaryTrue());
554a8734deSArthur O'Dwyer #endif
564a8734deSArthur O'Dwyer (void)std::binary_search(first, last, value);
574a8734deSArthur O'Dwyer (void)std::binary_search(first, last, value, std::less<void*>());
584a8734deSArthur O'Dwyer #if TEST_STD_VER > 17
594a8734deSArthur O'Dwyer (void)std::clamp(value, value, value);
604a8734deSArthur O'Dwyer (void)std::clamp(value, value, value, std::less<void*>());
614a8734deSArthur O'Dwyer #endif
624a8734deSArthur O'Dwyer (void)std::copy(first, last, first2);
634a8734deSArthur O'Dwyer (void)std::copy_backward(first, last, last2);
6440e52d30SJoe Loser (void)std::copy_n(first, count, first2);
654a8734deSArthur O'Dwyer (void)std::count(first, last, value);
664a8734deSArthur O'Dwyer (void)std::count_if(first, last, UnaryTrue());
674a8734deSArthur O'Dwyer (void)std::distance(first, last);
684a8734deSArthur O'Dwyer (void)std::equal(first, last, first2);
694a8734deSArthur O'Dwyer (void)std::equal(first, last, first2, std::equal_to<void*>());
704a8734deSArthur O'Dwyer #if TEST_STD_VER > 11
714a8734deSArthur O'Dwyer (void)std::equal(first, last, first2, last2);
724a8734deSArthur O'Dwyer (void)std::equal(first, last, first2, last2, std::equal_to<void*>());
734a8734deSArthur O'Dwyer #endif
744a8734deSArthur O'Dwyer (void)std::equal_range(first, last, value);
754a8734deSArthur O'Dwyer (void)std::equal_range(first, last, value, std::less<void*>());
764a8734deSArthur O'Dwyer (void)std::fill(first, last, value);
774a8734deSArthur O'Dwyer (void)std::fill_n(first, count, value);
784a8734deSArthur O'Dwyer (void)std::find(first, last, value);
7940e52d30SJoe Loser (void)std::find_end(first, last, first2, mid2);
8040e52d30SJoe Loser (void)std::find_end(first, last, first2, mid2, std::equal_to<void*>());
814a8734deSArthur O'Dwyer (void)std::find_if(first, last, UnaryTrue());
824a8734deSArthur O'Dwyer (void)std::find_if_not(first, last, UnaryTrue());
834a8734deSArthur O'Dwyer (void)std::for_each(first, last, UnaryVoid());
844a8734deSArthur O'Dwyer #if TEST_STD_VER > 14
854a8734deSArthur O'Dwyer (void)std::for_each_n(first, count, UnaryVoid());
864a8734deSArthur O'Dwyer #endif
874a8734deSArthur O'Dwyer (void)std::generate(first, last, NullaryValue());
884a8734deSArthur O'Dwyer (void)std::generate_n(first, count, NullaryValue());
894a8734deSArthur O'Dwyer (void)std::includes(first, last, first2, last2);
904a8734deSArthur O'Dwyer (void)std::includes(first, last, first2, last2, std::less<void*>());
914a8734deSArthur O'Dwyer (void)std::is_heap(first, last);
924a8734deSArthur O'Dwyer (void)std::is_heap(first, last, std::less<void*>());
934a8734deSArthur O'Dwyer (void)std::is_heap_until(first, last);
944a8734deSArthur O'Dwyer (void)std::is_heap_until(first, last, std::less<void*>());
954a8734deSArthur O'Dwyer (void)std::is_partitioned(first, last, UnaryTrue());
964a8734deSArthur O'Dwyer (void)std::is_permutation(first, last, first2);
974a8734deSArthur O'Dwyer (void)std::is_permutation(first, last, first2, std::equal_to<void*>());
984a8734deSArthur O'Dwyer #if TEST_STD_VER > 11
994a8734deSArthur O'Dwyer (void)std::is_permutation(first, last, first2, last2);
1004a8734deSArthur O'Dwyer (void)std::is_permutation(first, last, first2, last2, std::equal_to<void*>());
1014a8734deSArthur O'Dwyer #endif
1024a8734deSArthur O'Dwyer (void)std::is_sorted(first, last);
1034a8734deSArthur O'Dwyer (void)std::is_sorted(first, last, std::less<void*>());
1044a8734deSArthur O'Dwyer (void)std::is_sorted_until(first, last);
1054a8734deSArthur O'Dwyer (void)std::is_sorted_until(first, last, std::less<void*>());
1064a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::inplace_merge(first, mid, last);
1074a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::inplace_merge(first, mid, last, std::less<void*>());
1084a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::iter_swap(first, mid);
1094a8734deSArthur O'Dwyer (void)std::lexicographical_compare(first, last, first2, last2);
1104a8734deSArthur O'Dwyer (void)std::lexicographical_compare(first, last, first2, last2, std::less<void*>());
111*2a06757aSAdrian Vogelsgesang #if TEST_STD_VER > 17
112*2a06757aSAdrian Vogelsgesang (void)std::lexicographical_compare_three_way(first, last, first2, last2);
113*2a06757aSAdrian Vogelsgesang (void)std::lexicographical_compare_three_way(first, last, first2, last2, std::compare_three_way());
114*2a06757aSAdrian Vogelsgesang #endif
1154a8734deSArthur O'Dwyer (void)std::lower_bound(first, last, value);
1164a8734deSArthur O'Dwyer (void)std::lower_bound(first, last, value, std::less<void*>());
11740e52d30SJoe Loser (void)std::make_heap(first, last);
11840e52d30SJoe Loser (void)std::make_heap(first, last, std::less<void*>());
1194a8734deSArthur O'Dwyer (void)std::max(value, value);
1204a8734deSArthur O'Dwyer (void)std::max(value, value, std::less<void*>());
1214a8734deSArthur O'Dwyer #if TEST_STD_VER >= 11
1224a8734deSArthur O'Dwyer (void)std::max({ value, value });
1234a8734deSArthur O'Dwyer (void)std::max({ value, value }, std::less<void*>());
1244a8734deSArthur O'Dwyer #endif
1254a8734deSArthur O'Dwyer (void)std::max_element(first, last);
1264a8734deSArthur O'Dwyer (void)std::max_element(first, last, std::less<void*>());
1274a8734deSArthur O'Dwyer (void)std::merge(first, mid, mid, last, first2);
1284a8734deSArthur O'Dwyer (void)std::merge(first, mid, mid, last, first2, std::less<void*>());
1294a8734deSArthur O'Dwyer (void)std::min(value, value);
1304a8734deSArthur O'Dwyer (void)std::min(value, value, std::less<void*>());
1314a8734deSArthur O'Dwyer #if TEST_STD_VER >= 11
1324a8734deSArthur O'Dwyer (void)std::min({ value, value });
1334a8734deSArthur O'Dwyer (void)std::min({ value, value }, std::less<void*>());
1344a8734deSArthur O'Dwyer #endif
1354a8734deSArthur O'Dwyer (void)std::min_element(first, last);
1364a8734deSArthur O'Dwyer (void)std::min_element(first, last, std::less<void*>());
1374a8734deSArthur O'Dwyer (void)std::minmax(value, value);
1384a8734deSArthur O'Dwyer (void)std::minmax(value, value, std::less<void*>());
1394a8734deSArthur O'Dwyer #if TEST_STD_VER >= 11
1404a8734deSArthur O'Dwyer (void)std::minmax({ value, value });
1414a8734deSArthur O'Dwyer (void)std::minmax({ value, value }, std::less<void*>());
1424a8734deSArthur O'Dwyer #endif
1434a8734deSArthur O'Dwyer (void)std::minmax_element(first, last);
1444a8734deSArthur O'Dwyer (void)std::minmax_element(first, last, std::less<void*>());
1454a8734deSArthur O'Dwyer (void)std::mismatch(first, last, first2);
1464a8734deSArthur O'Dwyer (void)std::mismatch(first, last, first2, std::equal_to<void*>());
1474a8734deSArthur O'Dwyer #if TEST_STD_VER > 11
1484a8734deSArthur O'Dwyer (void)std::mismatch(first, last, first2, last2);
1494a8734deSArthur O'Dwyer (void)std::mismatch(first, last, first2, last2, std::equal_to<void*>());
1504a8734deSArthur O'Dwyer #endif
1514a8734deSArthur O'Dwyer (void)std::move(first, last, first2);
1524a8734deSArthur O'Dwyer (void)std::move_backward(first, last, last2);
1534a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::next_permutation(first, last);
1544a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::next_permutation(first, last, std::less<void*>());
1554a8734deSArthur O'Dwyer #if TEST_STD_VER >= 11
1564a8734deSArthur O'Dwyer (void)std::none_of(first, last, UnaryTrue());
1574a8734deSArthur O'Dwyer #endif
1584a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::nth_element(first, mid, last);
1594a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::nth_element(first, mid, last, std::less<void*>());
1604a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::partial_sort(first, mid, last);
1614a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::partial_sort(first, mid, last, std::less<void*>());
16240e52d30SJoe Loser (void)std::partial_sort_copy(first, last, first2, mid2);
16340e52d30SJoe Loser (void)std::partial_sort_copy(first, last, first2, mid2, std::less<void*>());
1644a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::partition(first, last, UnaryTrue());
1654a8734deSArthur O'Dwyer (void)std::partition_copy(first, last, first2, last2, UnaryTrue());
1664a8734deSArthur O'Dwyer (void)std::partition_point(first, last, UnaryTrue());
16740e52d30SJoe Loser (void)std::pop_heap(first, last);
16840e52d30SJoe Loser (void)std::pop_heap(first, last, std::less<void*>());
1694a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::prev_permutation(first, last);
1704a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::prev_permutation(first, last, std::less<void*>());
17140e52d30SJoe Loser (void)std::push_heap(first, last);
17240e52d30SJoe Loser (void)std::push_heap(first, last, std::less<void*>());
1734a8734deSArthur O'Dwyer (void)std::remove(first, last, value);
1744a8734deSArthur O'Dwyer (void)std::remove_copy(first, last, first2, value);
1754a8734deSArthur O'Dwyer (void)std::remove_copy_if(first, last, first2, UnaryTrue());
1764a8734deSArthur O'Dwyer (void)std::remove_if(first, last, UnaryTrue());
1774a8734deSArthur O'Dwyer (void)std::replace(first, last, value, value);
1784a8734deSArthur O'Dwyer (void)std::replace_copy(first, last, first2, value, value);
1794a8734deSArthur O'Dwyer (void)std::replace_copy_if(first, last, first2, UnaryTrue(), value);
1804a8734deSArthur O'Dwyer (void)std::replace_if(first, last, UnaryTrue(), value);
1814a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::reverse(first, last);
18240e52d30SJoe Loser (void)std::reverse_copy(first, last, first2);
1834a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::rotate(first, mid, last);
1844a8734deSArthur O'Dwyer (void)std::rotate_copy(first, mid, last, first2);
1854a8734deSArthur O'Dwyer (void)std::search(first, last, first2, mid2);
1864a8734deSArthur O'Dwyer (void)std::search(first, last, first2, mid2, std::equal_to<void*>());
1874a8734deSArthur O'Dwyer (void)std::search_n(first, last, count, value);
1884a8734deSArthur O'Dwyer (void)std::search_n(first, last, count, value, std::equal_to<void*>());
1894a8734deSArthur O'Dwyer (void)std::set_difference(first, mid, mid, last, first2);
1904a8734deSArthur O'Dwyer (void)std::set_difference(first, mid, mid, last, first2, std::less<void*>());
1914a8734deSArthur O'Dwyer (void)std::set_intersection(first, mid, mid, last, first2);
1924a8734deSArthur O'Dwyer (void)std::set_intersection(first, mid, mid, last, first2, std::less<void*>());
1934a8734deSArthur O'Dwyer (void)std::set_symmetric_difference(first, mid, mid, last, first2);
1944a8734deSArthur O'Dwyer (void)std::set_symmetric_difference(first, mid, mid, last, first2, std::less<void*>());
1954a8734deSArthur O'Dwyer (void)std::set_union(first, mid, mid, last, first2);
1964a8734deSArthur O'Dwyer (void)std::set_union(first, mid, mid, last, first2, std::less<void*>());
1974a8734deSArthur O'Dwyer #if TEST_STD_VER > 17
1984a8734deSArthur O'Dwyer (void)std::shift_left(first, last, count);
1994a8734deSArthur O'Dwyer (void)std::shift_right(first, last, count);
2004a8734deSArthur O'Dwyer #endif
2014a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::sort(first, last);
2024a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::sort(first, last, std::less<void*>());
20340e52d30SJoe Loser (void)std::sort_heap(first, last);
20440e52d30SJoe Loser (void)std::sort_heap(first, last, std::less<void*>());
2054a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::stable_partition(first, last, UnaryTrue());
2064a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::stable_sort(first, last);
2074a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::stable_sort(first, last, std::less<void*>());
2084a8734deSArthur O'Dwyer // RELIES ON ADL SWAP (void)std::swap_ranges(first, last, first2);
2094a8734deSArthur O'Dwyer (void)std::transform(first, last, first2, UnaryTransform());
2104a8734deSArthur O'Dwyer (void)std::transform(first, mid, mid, first2, BinaryTransform());
2114a8734deSArthur O'Dwyer (void)std::unique(first, last);
2124a8734deSArthur O'Dwyer (void)std::unique(first, last, std::equal_to<void*>());
2134a8734deSArthur O'Dwyer (void)std::unique_copy(first, last, first2);
2144a8734deSArthur O'Dwyer (void)std::unique_copy(first, last, first2, std::equal_to<void*>());
2154a8734deSArthur O'Dwyer (void)std::upper_bound(first, last, value);
2164a8734deSArthur O'Dwyer (void)std::upper_bound(first, last, value, std::less<void*>());
2174a8734deSArthur O'Dwyer
2184a8734deSArthur O'Dwyer return true;
2194a8734deSArthur O'Dwyer }
2204a8734deSArthur O'Dwyer
test()2214a8734deSArthur O'Dwyer void test()
2224a8734deSArthur O'Dwyer {
2234a8734deSArthur O'Dwyer all_the_algorithms();
2244a8734deSArthur O'Dwyer #if TEST_STD_VER > 17
2254a8734deSArthur O'Dwyer static_assert(all_the_algorithms());
2264a8734deSArthur O'Dwyer #endif
2274a8734deSArthur O'Dwyer }
228