typeindex: New.

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.

From-SVN: r164521
This commit is contained in:
Paolo Carlini 2010-09-22 12:04:08 +00:00 committed by Paolo Carlini
parent 7d0255bd9f
commit bafa9791ac
10 changed files with 442 additions and 22 deletions

View File

@ -1,3 +1,16 @@
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...

View File

@ -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 \

View File

@ -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 \

View File

@ -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>

View File

@ -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

View File

@ -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;
VERIFY( typeid(int) != typeid(double) );
VERIFY( typeid(int).hash_code() != typeid(double).hash_code() );
class Abraca { };
Abraca a1, a2_;
VERIFY( typeid(a1) == typeid(a2) );
VERIFY( typeid(a1).hash_code() == typeid(a2).hash_code() );
typedef const Abraca cAbraca;
cAbraca a2 = a2_;
VERIFY( typeid(Abraca) == typeid(const Abraca) );
VERIFY( typeid(Abraca).hash_code() == typeid(const Abraca).hash_code() );
class Dabra { };
Dabra d1;
VERIFY( typeid(Abraca) == typeid(a2) );
VERIFY( typeid(Abraca).hash_code() == typeid(a2).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(Abraca) == typeid(const Abraca&) );
VERIFY( typeid(Abraca).hash_code() == typeid(const Abraca&).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(Dabra) );
VERIFY( typeid(Abraca).hash_code() != typeid(Dabra).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(a1) != typeid(d1) );
VERIFY( typeid(a1).hash_code() != typeid(d1).hash_code() );
const type_info& to07 = typeid(Abraca);
const type_info& to08 = typeid(a2);
VERIFY( to07 == to08 );
VERIFY( to07.hash_code() == to08.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() );
const type_info& to11 = typeid(Abraca);
const type_info& to12 = typeid(Dabra);
VERIFY( to11 != to12 );
VERIFY( to11.hash_code() != to12.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()

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}