From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- libstdc++-v3/testsuite/25_algorithms/heap/1.cc | 145 +++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 libstdc++-v3/testsuite/25_algorithms/heap/1.cc (limited to 'libstdc++-v3/testsuite/25_algorithms/heap/1.cc') diff --git a/libstdc++-v3/testsuite/25_algorithms/heap/1.cc b/libstdc++-v3/testsuite/25_algorithms/heap/1.cc new file mode 100644 index 000000000..1683a83f7 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/heap/1.cc @@ -0,0 +1,145 @@ +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2009 +// Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// 25.3.6 Heap operations [lib.alg.heap.operations] + +#include +#include + +const int A[] = {1, 11, 12, 3, 10, 6, 17, 4, 8, 2, 5, 13, 9, 15, 14, 16, 7}; +const int B[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}; +const int C[] = {17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; +const int N = sizeof(A) / sizeof(int); + +// This functor has the equivalent functionality of std::greater<>, +// but there is no dependency on and it also tracks the +// number of invocations since creation. +class Gt +{ +public: + static int count() { return _M_count; } + static void reset() { _M_count = 0; } + + bool + operator()(const int& x, const int& y) + { + ++_M_count; + return x > y; + } + +private: + static int _M_count; +}; + +int Gt::_M_count = 0; + +// Exercise all of the heap functions for operator<. The intermediate +// results between push_heap and pop_heap and make_heap and sort_heap +// are not checked (they could be). +void +test01() +{ + bool test __attribute__((unused)) = true; + + // sort array s1 using push_heap/pop_heap + int s1[N]; + std::copy(A, A + N, s1); + VERIFY(std::equal(s1, s1 + N, A)); + + for (int i = 2; i <= N; ++i) + std::push_heap(s1, s1 + i); + + for (int i = N; i >= 2; --i) + std::pop_heap(s1, s1 + i); + + VERIFY(std::equal(s1, s1 + N, B)); + + // sort array s2 using make_heap/sort_heap + int s2[N]; + std::copy(A, A + N, s2); + VERIFY(std::equal(s2, s2 + N, A)); + + std::make_heap(s2, s2 + N); + std::sort_heap(s2, s2 + N); + VERIFY(std::equal(s2, s2 + N, B)); +} + +// Perform same tests as above but with the comparison predicate +// versions, and add complexity constraint checks. +void +test02() +{ + bool test __attribute__((unused)) = true; + + Gt gt; + +#ifndef _GLIBCXX_DEBUG + //const int logN = static_cast(std::log(static_cast(N)) + 0.5); + const int logN = 3; +#endif + + int s1[N]; + std::copy(A, A + N, s1); + VERIFY(std::equal(s1, s1 + N, A)); + + for (int i = 2; i <= N; ++i) + { + std::push_heap(s1, s1 + i, gt); +#ifndef _GLIBCXX_DEBUG + VERIFY(gt.count() <= logN); +#endif + gt.reset(); + } + + for (int i = N; i >= 2; --i) + { + std::pop_heap(s1, s1 + i, gt); +#ifndef _GLIBCXX_DEBUG + VERIFY(gt.count() <= 2 * logN); +#endif + gt.reset(); + } + + VERIFY(std::equal(s1, s1 + N, C)); + + // sort array s2 using make_heap/sort_heap + int s2[N]; + std::copy(A, A + N, s2); + VERIFY(std::equal(s2, s2 + N, A)); + + std::make_heap(s2, s2 + N, gt); +#ifndef _GLIBCXX_DEBUG + VERIFY(gt.count() <= 3 * N); +#endif + gt.reset(); + + std::sort_heap(s2, s2 + N, gt); +#ifndef _GLIBCXX_DEBUG + VERIFY(gt.count() <= N * logN); +#endif + + VERIFY(std::equal(s2, s2 + N, C)); +} + +int +main() +{ + test01(); + test02(); + return 0; +} -- cgit v1.2.3