diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-09-22 12:04:08 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-09-22 12:04:08 +0000 |
commit | 823efdcffe36f0e1c74a7a67a10833f21d59ff30 (patch) | |
tree | 039fc7a24feb042c41c821e590759db90dae4c61 | |
parent | 1910e93757a071db3dd888eaa7a1dd7a51b07cec (diff) | |
download | gcc-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/ChangeLog | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/Makefile.am | 1 | ||||
-rw-r--r-- | libstdc++-v3/include/Makefile.in | 1 | ||||
-rw-r--r-- | libstdc++-v3/include/precompiled/stdc++.h | 3 | ||||
-rw-r--r-- | libstdc++-v3/include/std/typeindex | 105 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/18_support/type_info/hash_code.cc | 59 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/typeindex/comparison_operators.cc | 88 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/typeindex/hash.cc | 60 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/typeindex/hash_code.cc | 67 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/typeindex/name.cc | 67 |
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; +} |