summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2010-09-22 12:04:08 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2010-09-22 12:04:08 +0000
commit823efdcffe36f0e1c74a7a67a10833f21d59ff30 (patch)
tree039fc7a24feb042c41c821e590759db90dae4c61
parent1910e93757a071db3dd888eaa7a1dd7a51b07cec (diff)
downloadgcc-823efdcffe36f0e1c74a7a67a10833f21d59ff30.tar.gz
2010-09-22 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/typeindex: New. * include/Makefile.am: Add. * include/Makefile.in: Regenerate. * include/precompiled/stdc++.h: Add. * testsuite/20_util/typeindex/comparison_operators.cc: New. * testsuite/20_util/typeindex/hash.cc: Likewise. * testsuite/20_util/typeindex/hash_code.cc: Likewise. * testsuite/20_util/typeindex/name.cc: Likewise. * testsuite/18_support/type_info/hash_code.cc: Tweak. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164521 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog13
-rw-r--r--libstdc++-v3/include/Makefile.am1
-rw-r--r--libstdc++-v3/include/Makefile.in1
-rw-r--r--libstdc++-v3/include/precompiled/stdc++.h3
-rw-r--r--libstdc++-v3/include/std/typeindex105
-rw-r--r--libstdc++-v3/testsuite/18_support/type_info/hash_code.cc59
-rw-r--r--libstdc++-v3/testsuite/20_util/typeindex/comparison_operators.cc88
-rw-r--r--libstdc++-v3/testsuite/20_util/typeindex/hash.cc60
-rw-r--r--libstdc++-v3/testsuite/20_util/typeindex/hash_code.cc67
-rw-r--r--libstdc++-v3/testsuite/20_util/typeindex/name.cc67
10 files changed, 442 insertions, 22 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index bc75ce7f5a6..58171dce3dd 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,18 @@
2010-09-22 Paolo Carlini <paolo.carlini@oracle.com>
+ * include/std/typeindex: New.
+ * include/Makefile.am: Add.
+ * include/Makefile.in: Regenerate.
+ * include/precompiled/stdc++.h: Add.
+ * testsuite/20_util/typeindex/comparison_operators.cc: New.
+ * testsuite/20_util/typeindex/hash.cc: Likewise.
+ * testsuite/20_util/typeindex/hash_code.cc: Likewise.
+ * testsuite/20_util/typeindex/name.cc: Likewise.
+
+ * testsuite/18_support/type_info/hash_code.cc: Tweak.
+
+2010-09-22 Paolo Carlini <paolo.carlini@oracle.com>
+
* src/hash_bytes.cc: Move...
* libsupc++/hash_bytes.cc: ... here.
* src/Makefile.am: Adjust.
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index 3b9c5519d4a..2fb3fd5c5c2 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -66,6 +66,7 @@ std_headers = \
${std_srcdir}/system_error \
${std_srcdir}/thread \
${std_srcdir}/tuple \
+ ${std_srcdir}/typeindex \
${std_srcdir}/type_traits \
${std_srcdir}/unordered_map \
${std_srcdir}/unordered_set \
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index d32efa8e7fd..d3adde5bf9a 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -308,6 +308,7 @@ std_headers = \
${std_srcdir}/system_error \
${std_srcdir}/thread \
${std_srcdir}/tuple \
+ ${std_srcdir}/typeindex \
${std_srcdir}/type_traits \
${std_srcdir}/unordered_map \
${std_srcdir}/unordered_set \
diff --git a/libstdc++-v3/include/precompiled/stdc++.h b/libstdc++-v3/include/precompiled/stdc++.h
index c19c9384be0..510a6552f52 100644
--- a/libstdc++-v3/include/precompiled/stdc++.h
+++ b/libstdc++-v3/include/precompiled/stdc++.h
@@ -1,6 +1,6 @@
// C++ includes used for precompiling -*- C++ -*-
-// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009
+// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -109,6 +109,7 @@
#include <system_error>
#include <thread>
#include <tuple>
+#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
diff --git a/libstdc++-v3/include/std/typeindex b/libstdc++-v3/include/std/typeindex
new file mode 100644
index 00000000000..a5d37666e78
--- /dev/null
+++ b/libstdc++-v3/include/std/typeindex
@@ -0,0 +1,105 @@
+// C++0x typeindex -*- C++ -*-
+
+// 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file include/typeindex
+ * This is a Standard C++ Library header.
+ */
+
+#ifndef _GLIBCXX_TYPEINDEX
+#define _GLIBCXX_TYPEINDEX 1
+
+#pragma GCC system_header
+
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
+# include <bits/c++0x_warning.h>
+#else
+
+#include <bits/c++config.h>
+#include <typeinfo>
+#include <bits/stl_function.h> // For unary_function
+
+namespace std
+{
+ /**
+ @brief The class type_index provides a simple wrapper for type_info
+ which can be used as an index type in associative containers (23.6)
+ and in unordered associative containers (23.7).
+ */
+ struct type_index
+ {
+ type_index(const type_info& __rhs)
+ : _M_target(&__rhs) { }
+
+ bool
+ operator==(const type_index& __rhs) const
+ { return *_M_target == *__rhs._M_target; }
+
+ bool
+ operator!=(const type_index& __rhs) const
+ { return *_M_target != *__rhs._M_target; }
+
+ bool
+ operator<(const type_index& __rhs) const
+ { return _M_target->before(*__rhs._M_target); }
+
+ bool
+ operator<=(const type_index& __rhs) const
+ { return !__rhs._M_target->before(*_M_target); }
+
+ bool
+ operator>(const type_index& __rhs) const
+ { return __rhs._M_target->before(*_M_target); }
+
+ bool
+ operator>=(const type_index& __rhs) const
+ { return !_M_target->before(*__rhs._M_target); }
+
+ size_t
+ hash_code() const
+ { return _M_target->hash_code(); }
+
+ const char*
+ name() const
+ { return _M_target->name(); }
+
+ private:
+ const type_info* _M_target;
+ };
+
+ template<typename _Tp> struct hash;
+
+ /// std::hash specialization for type_index.
+ template<>
+ struct hash<type_index>
+ : public std::unary_function<type_index, size_t>
+ {
+ size_t
+ operator()(const type_index& __ti) const
+ { return __ti.hash_code(); }
+ };
+}
+
+#endif // __GXX_EXPERIMENTAL_CXX0X__
+
+#endif // _GLIBCXX_TYPEINDEX
diff --git a/libstdc++-v3/testsuite/18_support/type_info/hash_code.cc b/libstdc++-v3/testsuite/18_support/type_info/hash_code.cc
index 066736c4ecf..2d4c65bc593 100644
--- a/libstdc++-v3/testsuite/18_support/type_info/hash_code.cc
+++ b/libstdc++-v3/testsuite/18_support/type_info/hash_code.cc
@@ -22,37 +22,54 @@
#include <typeinfo>
#include <testsuite_hooks.h>
-class Abraca { };
-Abraca a1, a2_;
-const Abraca a2 = a2_;
-
-class Dabra { };
-Dabra d1;
-
void test01()
{
bool test __attribute__((unused)) = true;
+ using namespace std;
+
+ class Abraca { };
+ Abraca a1, a2_;
+
+ typedef const Abraca cAbraca;
+ cAbraca a2 = a2_;
+
+ class Dabra { };
+ Dabra d1;
- VERIFY( typeid(int) != typeid(double) );
- VERIFY( typeid(int).hash_code() != typeid(double).hash_code() );
+ const type_info& to01 = typeid(int);
+ const type_info& to02 = typeid(double);
+ VERIFY( to01 != to02 );
+ VERIFY( to01.hash_code() != to02.hash_code() );
- VERIFY( typeid(a1) == typeid(a2) );
- VERIFY( typeid(a1).hash_code() == typeid(a2).hash_code() );
+ const type_info& to03 = typeid(a1);
+ const type_info& to04 = typeid(a2);
+ VERIFY( to03 == to04 );
+ VERIFY( to03.hash_code() == to04.hash_code() );
- VERIFY( typeid(Abraca) == typeid(const Abraca) );
- VERIFY( typeid(Abraca).hash_code() == typeid(const Abraca).hash_code() );
+ const type_info& to05 = typeid(Abraca);
+ const type_info& to06 = typeid(cAbraca);
+ VERIFY( to05 == to06 );
+ VERIFY( to05.hash_code() == to06.hash_code() );
- VERIFY( typeid(Abraca) == typeid(a2) );
- VERIFY( typeid(Abraca).hash_code() == typeid(a2).hash_code() );
+ const type_info& to07 = typeid(Abraca);
+ const type_info& to08 = typeid(a2);
+ VERIFY( to07 == to08 );
+ VERIFY( to07.hash_code() == to08.hash_code() );
- VERIFY( typeid(Abraca) == typeid(const Abraca&) );
- VERIFY( typeid(Abraca).hash_code() == typeid(const Abraca&).hash_code() );
+ const type_info& to09 = typeid(Abraca);
+ const type_info& to10 = typeid(const Abraca&);
+ VERIFY( to09 == to10 );
+ VERIFY( to09.hash_code() == to10.hash_code() );
- VERIFY( typeid(Abraca) != typeid(Dabra) );
- VERIFY( typeid(Abraca).hash_code() != typeid(Dabra).hash_code() );
+ const type_info& to11 = typeid(Abraca);
+ const type_info& to12 = typeid(Dabra);
+ VERIFY( to11 != to12 );
+ VERIFY( to11.hash_code() != to12.hash_code() );
- VERIFY( typeid(a1) != typeid(d1) );
- VERIFY( typeid(a1).hash_code() != typeid(d1).hash_code() );
+ const type_info& to13 = typeid(a1);
+ const type_info& to14 = typeid(d1);
+ VERIFY( to13 != to14 );
+ VERIFY( to13.hash_code() != to14.hash_code() );
}
int main()
diff --git a/libstdc++-v3/testsuite/20_util/typeindex/comparison_operators.cc b/libstdc++-v3/testsuite/20_util/typeindex/comparison_operators.cc
new file mode 100644
index 00000000000..5ca53967d4d
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/typeindex/comparison_operators.cc
@@ -0,0 +1,88 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2010-09-22 Paolo Carlini <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation
+//
+// 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 <typeindex>
+#include <testsuite_hooks.h>
+
+#define TEST3(TI1, TI2, TO1, TO2) \
+ VERIFY( (TI1 == TI2) == (TO1 == TO2) ); \
+ VERIFY( (TI1 != TI2) == (TO1 != TO2) ); \
+ VERIFY( (TI1 < TI2) == (TO1.before(TO2)) ); \
+ VERIFY( (TI1 <= TI2) == (!TO2.before(TO1)) ); \
+ VERIFY( (TI1 > TI2) == (TO2.before(TO1)) ); \
+ VERIFY( (TI1 >= TI2) == (!TO1.before(TO2)) );
+
+#define TEST2(TI, TO) \
+ TEST3(TI, ti1, TO, to1) \
+ TEST3(TI, ti2, TO, to2) \
+ TEST3(TI, ti3, TO, to3) \
+ TEST3(TI, ti4, TO, to4) \
+ TEST3(TI, ti5, TO, to5) \
+ TEST3(TI, ti6, TO, to6) \
+ TEST3(TI, ti7, TO, to7)
+
+#define TEST \
+ TEST2(ti1, to1) \
+ TEST2(ti2, to2) \
+ TEST2(ti3, to3) \
+ TEST2(ti4, to4) \
+ TEST2(ti5, to5) \
+ TEST2(ti6, to6) \
+ TEST2(ti7, to7)
+
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+ using namespace std;
+
+ class Abraca { };
+ Abraca a1, a2_;
+ const Abraca a2 = a2_;
+
+ const type_info& to1 = typeid(int);
+ const type_index ti1(to1);
+
+ const type_info& to2 = typeid(double);
+ const type_index ti2(to2);
+
+ const type_info& to3 = typeid(Abraca);
+ const type_index ti3(to3);
+
+ const type_info& to4 = typeid(const Abraca);
+ const type_index ti4(to4);
+
+ const type_info& to5 = typeid(const Abraca&);
+ const type_index ti5(to5);
+
+ const type_info& to6 = typeid(a1);
+ const type_index ti6(to6);
+
+ const type_info& to7 = typeid(a2);
+ const type_index ti7(to7);
+
+ TEST
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/20_util/typeindex/hash.cc b/libstdc++-v3/testsuite/20_util/typeindex/hash.cc
new file mode 100644
index 00000000000..2468ea6933e
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/typeindex/hash.cc
@@ -0,0 +1,60 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2010-09-22 Paolo Carlini <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation
+//
+// 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 <typeindex>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+ using namespace std;
+
+ class Abraca { };
+ Abraca a1, a2_;
+ const Abraca a2 = a2_;
+
+ const type_index ti1(typeid(int));
+ VERIFY( hash<type_index>()(ti1) == ti1.hash_code() );
+
+ const type_index ti2(typeid(double));
+ VERIFY( hash<type_index>()(ti2) == ti2.hash_code() );
+
+ const type_index ti3(typeid(Abraca));
+ VERIFY( hash<type_index>()(ti3) == ti3.hash_code() );
+
+ const type_index ti4(typeid(const Abraca));
+ VERIFY( hash<type_index>()(ti4) == ti4.hash_code() );
+
+ const type_index ti5(typeid(const Abraca&));
+ VERIFY( hash<type_index>()(ti5) == ti5.hash_code() );
+
+ const type_index ti6(typeid(a1));
+ VERIFY( hash<type_index>()(ti6) == ti6.hash_code() );
+
+ const type_index ti7(typeid(a2));
+ VERIFY( hash<type_index>()(ti7) == ti7.hash_code() );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/20_util/typeindex/hash_code.cc b/libstdc++-v3/testsuite/20_util/typeindex/hash_code.cc
new file mode 100644
index 00000000000..f12b6cbb943
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/typeindex/hash_code.cc
@@ -0,0 +1,67 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2010-09-22 Paolo Carlini <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation
+//
+// 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 <typeindex>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+ using namespace std;
+
+ class Abraca { };
+ Abraca a1, a2_;
+ const Abraca a2 = a2_;
+
+ const type_info& to1 = typeid(int);
+ const type_index ti1(to1);
+ VERIFY( ti1.hash_code() == to1.hash_code() );
+
+ const type_info& to2 = typeid(double);
+ const type_index ti2(to2);
+ VERIFY( ti2.hash_code() == to2.hash_code() );
+
+ const type_info& to3 = typeid(Abraca);
+ const type_index ti3(to3);
+ VERIFY( ti3.hash_code() == to3.hash_code() );
+
+ const type_info& to4 = typeid(const Abraca);
+ const type_index ti4(to4);
+ VERIFY( ti4.hash_code() == to4.hash_code() );
+
+ const type_info& to5 = typeid(const Abraca&);
+ const type_index ti5(to5);
+ VERIFY( ti5.hash_code() == to5.hash_code() );
+
+ const type_info& to6 = typeid(a1);
+ const type_index ti6(to6);
+ VERIFY( ti6.hash_code() == to6.hash_code() );
+
+ const type_info& to7 = typeid(a2);
+ const type_index ti7(to7);
+ VERIFY( ti7.hash_code() == to7.hash_code() );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/20_util/typeindex/name.cc b/libstdc++-v3/testsuite/20_util/typeindex/name.cc
new file mode 100644
index 00000000000..fa6e6945ceb
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/typeindex/name.cc
@@ -0,0 +1,67 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2010-09-22 Paolo Carlini <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation
+//
+// 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 <typeindex>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+ using namespace std;
+
+ class Abraca { };
+ Abraca a1, a2_;
+ const Abraca a2 = a2_;
+
+ const type_info& to1 = typeid(int);
+ const type_index ti1(to1);
+ VERIFY( ti1.name() == to1.name() );
+
+ const type_info& to2 = typeid(double);
+ const type_index ti2(to2);
+ VERIFY( ti2.name() == to2.name() );
+
+ const type_info& to3 = typeid(Abraca);
+ const type_index ti3(to3);
+ VERIFY( ti3.name() == to3.name() );
+
+ const type_info& to4 = typeid(const Abraca);
+ const type_index ti4(to4);
+ VERIFY( ti4.name() == to4.name() );
+
+ const type_info& to5 = typeid(const Abraca&);
+ const type_index ti5(to5);
+ VERIFY( ti5.name() == to5.name() );
+
+ const type_info& to6 = typeid(a1);
+ const type_index ti6(to6);
+ VERIFY( ti6.name() == to6.name() );
+
+ const type_info& to7 = typeid(a2);
+ const type_index ti7(to7);
+ VERIFY( ti7.name() == to7.name() );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}