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:
parent
7d0255bd9f
commit
bafa9791ac
@ -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...
|
||||
|
@ -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 \
|
||||
|
@ -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 \
|
||||
|
@ -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>
|
||||
|
105
libstdc++-v3/include/std/typeindex
Normal file
105
libstdc++-v3/include/std/typeindex
Normal 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
|
@ -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()
|
||||
|
@ -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;
|
||||
}
|
60
libstdc++-v3/testsuite/20_util/typeindex/hash.cc
Normal file
60
libstdc++-v3/testsuite/20_util/typeindex/hash.cc
Normal 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;
|
||||
}
|
67
libstdc++-v3/testsuite/20_util/typeindex/hash_code.cc
Normal file
67
libstdc++-v3/testsuite/20_util/typeindex/hash_code.cc
Normal 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;
|
||||
}
|
67
libstdc++-v3/testsuite/20_util/typeindex/name.cc
Normal file
67
libstdc++-v3/testsuite/20_util/typeindex/name.cc
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user