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