summaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/ext/profile/profiler_algos.cc
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /libstdc++-v3/testsuite/ext/profile/profiler_algos.cc
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
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.
Diffstat (limited to 'libstdc++-v3/testsuite/ext/profile/profiler_algos.cc')
-rw-r--r--libstdc++-v3/testsuite/ext/profile/profiler_algos.cc147
1 files changed, 147 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/ext/profile/profiler_algos.cc b/libstdc++-v3/testsuite/ext/profile/profiler_algos.cc
new file mode 100644
index 000000000..fb9c8080d
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/profile/profiler_algos.cc
@@ -0,0 +1,147 @@
+// { dg-require-profile-mode "" }
+
+// -*- C++ -*-
+
+// Unit tests for profile/impl/profile_algos.h.
+
+// Copyright (C) 2010, 2011 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
+// <http://www.gnu.org/licenses/>.
+
+#include <vector>
+#include <profile/impl/profiler.h>
+
+using std::_GLIBCXX_STD_C::vector;
+
+enum Failure
+{
+ NO_FAILURES = 0x0,
+ INSERT_AFTER_N = 0x1,
+ INSERT_AT_HEAD = 0x2,
+ INSERT_AT_TAIL = 0x4,
+ INSERT_IN_THE_MIDDLE = 0x8,
+ TOP_N = 0x10,
+ FOR_EACH = 0x20,
+ REMOVE = 0x40
+};
+
+
+static int
+test_insert_top_n()
+{
+ vector<int> v;
+
+ for (int i = 0; i < 10; i++)
+ v.push_back(10 - i);
+
+ // Inserting -5 should have no effect if size is limited to 10.
+ __gnu_profile::__insert_top_n(v, -5, 10);
+ for (int i = 0; i < 10; i++)
+ if (v[i] != 10 - i)
+ return INSERT_AFTER_N;
+
+ // Insert at head.
+ __gnu_profile::__insert_top_n(v, 11, 10);
+ for (int i = 0; i < 11; i++)
+ if (v[i] != 11 - i)
+ return INSERT_AT_HEAD;
+
+ // Insert at end.
+ __gnu_profile::__insert_top_n(v, 0, 100);
+ for (int i = 0; i < 12; i++)
+ if (v[i] != 11 - i)
+ return INSERT_AT_TAIL;
+
+ // Insert in the middle.
+ __gnu_profile::__insert_top_n(v, 6, 11);
+ for (int i = 0; i < 6; i++)
+ if (v[i] != 11 - i)
+ return INSERT_IN_THE_MIDDLE;
+ for (int i = 6; i < 13; i++)
+ if (v[i] != 12 - i)
+ return INSERT_IN_THE_MIDDLE;
+
+ return NO_FAILURES;
+}
+
+static int
+test_top_n()
+{
+ vector<int> v, out;
+
+ for (int i = 0; i < 100; i++)
+ {
+ v.push_back(100 + i);
+ v.push_back(100 - i);
+ }
+
+ __gnu_profile::__top_n(v, out, 10);
+
+ for (int i = 0; i < 10; i++)
+ if (out[i] != 199 - i)
+ return TOP_N;
+
+ return NO_FAILURES;
+}
+
+struct test_for_each_helper
+{
+ static int sum;
+ void operator ()(int i) {
+ sum += i;
+ }
+};
+
+int test_for_each_helper::sum = 0;
+
+static int
+test_for_each()
+{
+ vector<int> v;
+ test_for_each_helper helper;
+ int checksum = 0;
+
+ for (int i = 0; i < 10; i++)
+ {
+ v.push_back(i);
+ checksum += i;
+ }
+
+ __gnu_profile::__for_each(v.begin(), v.end(), helper);
+
+ return helper.sum == checksum ? NO_FAILURES : FOR_EACH;
+}
+
+static int
+test_remove()
+{
+ vector<char> v;
+
+ for (int i = 0; i < 10; i++)
+ v.push_back(' ');
+ v.push_back('x');
+ for (int i = 0; i < 10; i++)
+ v.push_back(' ');
+ v.push_back('x');
+
+ return __gnu_profile::__remove(v.begin(), v.end(), ' ') == v.begin() + 2
+ ? NO_FAILURES : REMOVE;
+}
+
+int main()
+{
+ return test_insert_top_n() | test_top_n() | test_for_each() | test_remove();
+}