1// Copyright (C) 2001, 2009 Free Software Foundation, Inc. 2// 3// This file is part of the GNU ISO C++ Library. This library is free 4// software; you can redistribute it and/or modify it under the 5// terms of the GNU General Public License as published by the 6// Free Software Foundation; either version 3, or (at your option) 7// any later version. 8 9// This library is distributed in the hope that it will be useful, 10// but WITHOUT ANY WARRANTY; without even the implied warranty of 11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12// GNU General Public License for more details. 13 14// You should have received a copy of the GNU General Public License along 15// with this library; see the file COPYING3. If not see 16// <http://www.gnu.org/licenses/>. 17 18// 25.3.1 algorithms, sort() 19 20#include <algorithm> 21#include <testsuite_hooks.h> 22 23bool test __attribute__((unused)) = true; 24 25const int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; 26const int B[] = {10, 20, 1, 11, 2, 12, 3, 13, 4, 14, 5, 15, 6, 16, 7, 17, 8, 18, 9, 19}; 27const int C[] = {20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; 28const int N = sizeof(A) / sizeof(int); 29const int logN = 3; // ln(N) rounded up 30const int P = 7; 31 32// comparison predicate for stable_sort: order by rightmost digit 33struct CompLast 34{ 35 bool 36 operator()(const int x, const int y) 37 { return x % 10 < y % 10; } 38}; 39 40// This functor has the equivalent functionality of std::geater<>, 41// but there is no dependency on <functional> and it also tracks the 42// number of invocations since creation. 43class Gt 44{ 45public: 46 static int count() { return itsCount; } 47 static void reset() { itsCount = 0; } 48 49 bool 50 operator()(const int& x, const int& y) 51 { 52 ++itsCount; 53 return x > y; 54 } 55 56private: 57 static int itsCount; 58}; 59 60int Gt::itsCount = 0; 61 62// 25.3.2 nth_element() 63void 64test05() 65{ 66 using std::nth_element; 67 68 int s1[N]; 69 std::copy(B, B + N, s1); 70 VERIFY(std::equal(s1, s1 + N, B)); 71 72 int* pn = s1 + (N / 2) - 1; 73 nth_element(s1, pn, s1 + N); 74 for (const int* i = pn; i < s1 + N; ++i) VERIFY(!(*i < *pn)); 75 76 CompLast pred; 77 nth_element(s1, pn, s1 + N, pred); 78 for (const int* i = pn; i < s1 + N; ++i) VERIFY(!pred(*i, *pn)); 79} 80 81int 82main() 83{ 84 test05(); 85 return 0; 86} 87