1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <algorithm> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant// template<ForwardIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> 13eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant// requires CopyConstructible<Compare> 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Iter 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// max_element(Iter first, Iter last, Compare comp); 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <algorithm> 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <functional> 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 2183e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h" 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class Iter> 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest(Iter first, Iter last) 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant Iter i = std::max_element(first, last, std::greater<int>()); 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if (first != last) 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant for (Iter j = first; j != last; ++j) 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(!std::greater<int>()(*i, *j)); 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant else 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(i == last); 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class Iter> 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest(unsigned N) 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int* a = new int[N]; 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant for (int i = 0; i < N; ++i) 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant a[i] = i; 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::random_shuffle(a, a+N); 45eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant test(Iter(a), Iter(a+N)); 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant delete [] a; 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class Iter> 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest() 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<Iter>(0); 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<Iter>(1); 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<Iter>(2); 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<Iter>(3); 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<Iter>(10); 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<Iter>(1000); 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 6190dc8dd841b975fccfa4a278b9b44065d3644839Dan Alberttemplate <class Iter, class Pred> 6290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albertvoid test_eq0(Iter first, Iter last, Pred p) 6390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert{ 6490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert assert(first == std::max_element(first, last, p)); 6590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert} 6690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert 6790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albertvoid test_eq() 6890dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert{ 6990dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert const size_t N = 10; 7090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert int* a = new int[N]; 7190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert for (int i = 0; i < N; ++i) 7290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert a[i] = 10; // all the same 7390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert test_eq0(a, a+N, std::less<int>()); 7490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert test_eq0(a, a+N, std::greater<int>()); 7590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert delete [] a; 7690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert} 7790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<forward_iterator<const int*> >(); 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<bidirectional_iterator<const int*> >(); 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<random_access_iterator<const int*> >(); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test<const int*>(); 8490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert test_eq(); 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 86