111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <algorithm>
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template<ForwardIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare>
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   requires CopyConstructible<Compare>
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   Iter
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   max_element(Iter first, Iter last, Compare comp);
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <algorithm>
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <functional>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_iterators.h"
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class Iter>
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttest(Iter first, Iter last)
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    Iter i = std::max_element(first, last, std::greater<int>());
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (first != last)
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        for (Iter j = first; j != last; ++j)
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!std::greater<int>()(*i, *j));
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        assert(i == last);
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class Iter>
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttest(unsigned N)
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    int* a = new int[N];
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (int i = 0; i < N; ++i)
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        a[i] = i;
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::random_shuffle(a, a+N);
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(Iter(a), Iter(a+N));
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    delete [] a;
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class Iter>
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttest()
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(0);
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(1);
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(2);
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(3);
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(10);
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(1000);
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class Iter, class Pred>
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_eq0(Iter first, Iter last, Pred p)
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(first == std::max_element(first, last, p));
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_eq()
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const size_t N = 10;
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    int* a = new int[N];
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (int i = 0; i < N; ++i)
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        a[i] = 10; // all the same
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test_eq0(a, a+N, std::less<int>());
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test_eq0(a, a+N, std::greater<int>());
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    delete [] a;
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201402L
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertconstexpr int il[] = { 2, 4, 6, 8, 7, 5, 3, 1 };
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct less { constexpr bool operator ()( const int &x, const int &y) const { return x < y; }};
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid constexpr_test()
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201402L
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    constexpr auto p = std::max_element(il, il+8, less());
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert ( *p == 8, "" );
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main()
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<forward_iterator<const int*> >();
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<bidirectional_iterator<const int*> >();
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<random_access_iterator<const int*> >();
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<const int*>();
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test_eq();
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    constexpr_test();
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
101