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>
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   requires LessThanComparable<Iter::value_type>
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   Iter
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//   max_element(Iter first, Iter last);
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <algorithm>
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_iterators.h"
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class Iter>
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttest(Iter first, Iter last)
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    Iter i = std::max_element(first, last);
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (first != last)
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        for (Iter j = first; j != last; ++j)
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!(*i < *j));
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        assert(i == last);
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class Iter>
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttest(unsigned N)
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    int* a = new int[N];
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (int i = 0; i < N; ++i)
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        a[i] = i;
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::random_shuffle(a, a+N);
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test(Iter(a), Iter(a+N));
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    delete [] a;
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class Iter>
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttest()
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(0);
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(1);
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(2);
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(3);
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(10);
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<Iter>(1000);
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201402L
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertconstexpr int il[] = { 2, 4, 6, 8, 7, 5, 3, 1 };
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid constexpr_test()
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201402L
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    constexpr auto p = std::max_element(il,il+8);
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert ( *p == 8, "" );
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main()
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<forward_iterator<const int*> >();
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<bidirectional_iterator<const int*> >();
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<random_access_iterator<const int*> >();
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    test<const int*>();
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    constexpr_test ();
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
81