1// Copyright (C) 2001-2015 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.1.2 stable_sort() 63void 64test02() 65{ 66 int s1[N]; 67 std::copy(A, A + N, s1); 68 VERIFY(std::equal(s1, s1 + N, A)); 69 70 std::stable_sort(s1, s1 + N, CompLast()); 71 VERIFY(std::equal(s1, s1 + N, B)); 72 73 std::stable_sort(s1, s1 + N); 74 VERIFY(std::equal(s1, s1 + N, A)); 75 76 Gt gt; 77 gt.reset(); 78 std::stable_sort(s1, s1 + N, gt); 79 VERIFY(std::equal(s1, s1 + N, C)); 80 VERIFY(gt.count() <= N * logN * logN); 81} 82 83int 84main() 85{ 86 test02(); 87 return 0; 88} 89