OSDN Git Service

2010-05-11 Silvius Rus <silvius.rus@gmail.com>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 May 2010 10:23:20 +0000 (10:23 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 May 2010 10:23:20 +0000 (10:23 +0000)
PR libstdc++/43259
* include/profile/impl/profiler_algos.h: New.
* include/Makefile.am: Add.
* include/Makefile.in: Regenerate.
* include/profile/impl/profiler.h
(_GLIBCXX_PROFILE_DEFINE_UNINIT_DATA): Add.
* include/profile/impl/profiler_trace.h
(__mutex_t, __lock, __unlock): Remove.
(__lock_object_table, __lock_stack_table): Remove. Replace uses with
calls to __gnu_cxx::__mutex::lock.
(__unlock_object_table, __unlock_stack_table): Remove. Replace uses
with calls to __gnu_cxx::__mutex::unlock.
(__warn, __cost_factor_writer, __cost_factor_setter): Add.
* testsuite/ext/profile/profiler_algos.cc: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159269 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/testsuite/ext/profile/profiler_algos.cc [new file with mode: 0644]

diff --git a/libstdc++-v3/testsuite/ext/profile/profiler_algos.cc b/libstdc++-v3/testsuite/ext/profile/profiler_algos.cc
new file mode 100644 (file)
index 0000000..5963cee
--- /dev/null
@@ -0,0 +1,147 @@
+// { dg-options "-D_GLIBCXX_PROFILE" }
+
+// -*- C++ -*-
+
+// Unit tests for profile/impl/profile_algos.h.
+
+// Copyright (C) 2010 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::__norm::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();
+}