1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <algorithm>
11 
12 // template<ForwardIterator Iter, class T, CopyConstructible Compare>
13 //   requires Predicate<Compare, T, Iter::value_type>
14 //         && Predicate<Compare, Iter::value_type, T>
15 //   bool
16 //   binary_search(Iter first, Iter last, const T& value, Compare comp);
17 
18 #include <algorithm>
19 #include <vector>
20 #include <functional>
21 #include <cassert>
22 
23 #include "test_iterators.h"
24 
25 template <class Iter, class T>
26 void
test(Iter first,Iter last,const T & value,bool x)27 test(Iter first, Iter last, const T& value, bool x)
28 {
29     assert(std::binary_search(first, last, value, std::greater<int>()) == x);
30 }
31 
32 template <class Iter>
33 void
test()34 test()
35 {
36     const unsigned N = 1000;
37     const unsigned M = 10;
38     std::vector<int> v(N);
39     int x = 0;
40     for (int i = 0; i < v.size(); ++i)
41     {
42         v[i] = x;
43         if (++x == M)
44             x = 0;
45     }
46     std::sort(v.begin(), v.end(), std::greater<int>());
47     for (x = 0; x < M; ++x)
48         test(Iter(v.data()), Iter(v.data()+v.size()), x, true);
49     test(Iter(v.data()), Iter(v.data()+v.size()), -1, false);
50     test(Iter(v.data()), Iter(v.data()+v.size()), M, false);
51 }
52 
main()53 int main()
54 {
55     int d[] = {6, 4, 2, 0};
56     for (int* e = d; e <= d+4; ++e)
57         for (int x = -1; x <= 7; ++x)
58             test(d, e, x, (x % 2 == 0) && e != d && (-2*(e-d) + 8 <= x));
59 
60     test<forward_iterator<const int*> >();
61     test<bidirectional_iterator<const int*> >();
62     test<random_access_iterator<const int*> >();
63     test<const int*>();
64 }
65