blob: a66b2ff27cb0e85321ab5a6a2640afb42407c120 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001//===----------------------------------------------------------------------===//
2//
Howard Hinnantf5256e12010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10// <algorithm>
11
Howard Hinnanteb564e72010-08-22 00:08:10 +000012// template<class T, class Compare>
Howard Hinnant98e5d972010-08-21 20:10:01 +000013// pair<T, T>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000014// minmax(initializer_list<T> t, Compare comp);
Marshall Clow3024f862015-02-11 15:41:34 +000015//
16// Complexity: At most (3/2) * t.size() applications of the corresponding predicate.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000017
18#include <algorithm>
Howard Hinnant98e5d972010-08-21 20:10:01 +000019#include <functional>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000020#include <cassert>
21
Marshall Clow3024f862015-02-11 15:41:34 +000022#include "counting_predicates.hpp"
23
Dan Albert1d4a1ed2016-05-25 22:36:09 -070024bool all_equal(int a, int b) { return false; } // everything is equal
Marshall Clow3024f862015-02-11 15:41:34 +000025
Marshall Clowe7d39252015-02-11 15:48:21 +000026#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Marshall Clow3024f862015-02-11 15:41:34 +000027void test_all_equal(std::initializer_list<int> il)
28{
29 binary_counting_predicate<bool(*)(int, int), int, int> pred (all_equal);
30 std::pair<int, int> p = std::minmax(il, std::ref(pred));
31 const int *ptr = il.end();
32 assert(p.first == *il.begin());
33 assert(p.second == *--ptr);
34 assert(pred.count() <= ((3 * il.size()) / 2));
35}
Marshall Clowe7d39252015-02-11 15:48:21 +000036#endif
Marshall Clow3024f862015-02-11 15:41:34 +000037
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000038int main()
39{
Howard Hinnante3e32912011-08-12 21:56:02 +000040#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant98e5d972010-08-21 20:10:01 +000041 assert((std::minmax({1, 2, 3}, std::greater<int>()) == std::pair<int, int>(3, 1)));
42 assert((std::minmax({1, 3, 2}, std::greater<int>()) == std::pair<int, int>(3, 1)));
43 assert((std::minmax({2, 1, 3}, std::greater<int>()) == std::pair<int, int>(3, 1)));
44 assert((std::minmax({2, 3, 1}, std::greater<int>()) == std::pair<int, int>(3, 1)));
45 assert((std::minmax({3, 1, 2}, std::greater<int>()) == std::pair<int, int>(3, 1)));
46 assert((std::minmax({3, 2, 1}, std::greater<int>()) == std::pair<int, int>(3, 1)));
Marshall Clow3024f862015-02-11 15:41:34 +000047 assert((std::minmax({1, 2, 3}, all_equal ) == std::pair<int, int>(1, 3)));
48
49 binary_counting_predicate<std::greater<int>, int, int> pred ((std::greater<int>()));
50 assert((std::minmax({1, 2, 2, 3, 3, 3, 5, 5, 5, 5, 5, 3}, std::ref(pred)) == std::pair<int, int>(5, 1)));
51 assert(pred.count() <= 18); // size == 12
52
53 test_all_equal({0});
54 test_all_equal({0,1});
55 test_all_equal({0,1,2});
56 test_all_equal({0,1,2,3});
57 test_all_equal({0,1,2,3,4});
58 test_all_equal({0,1,2,3,4,5});
59 test_all_equal({0,1,2,3,4,5,6});
60 test_all_equal({0,1,2,3,4,5,6,7});
61 test_all_equal({0,1,2,3,4,5,6,7,8});
62 test_all_equal({0,1,2,3,4,5,6,7,8,9});
63 test_all_equal({0,1,2,3,4,5,6,7,8,9,10});
64 test_all_equal({0,1,2,3,4,5,6,7,8,9,10,11});
65
Marshall Clow9d9463a2014-02-19 16:51:35 +000066#if _LIBCPP_STD_VER > 11
67 {
68 static_assert((std::minmax({1, 2, 3}, std::greater<int>()) == std::pair<int, int>(3, 1)), "");
69 static_assert((std::minmax({1, 3, 2}, std::greater<int>()) == std::pair<int, int>(3, 1)), "");
70 static_assert((std::minmax({2, 1, 3}, std::greater<int>()) == std::pair<int, int>(3, 1)), "");
71 static_assert((std::minmax({2, 3, 1}, std::greater<int>()) == std::pair<int, int>(3, 1)), "");
72 static_assert((std::minmax({3, 1, 2}, std::greater<int>()) == std::pair<int, int>(3, 1)), "");
73 static_assert((std::minmax({3, 2, 1}, std::greater<int>()) == std::pair<int, int>(3, 1)), "");
74 }
75#endif
Howard Hinnante3e32912011-08-12 21:56:02 +000076#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000077}