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