// RTTI support for -*- C++ -*-
-// Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-// 2003, 2004, 2005, 2006, 2007, 2009, 2010
-// Free Software Foundation
+// Copyright (C) 1994-2014 Free Software Foundation, Inc.
//
// This file is part of GCC.
//
// 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.
-//
+//
// GCC 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.
#pragma GCC system_header
#include <exception>
+#if __cplusplus >= 201103L
+#include <bits/hash_bytes.h>
+#endif
#pragma GCC visibility push(default)
#endif
#endif
-namespace std
+namespace std
{
/**
* @brief Part of RTTI.
* The @c type_info class describes type information generated by
* an implementation.
*/
- class type_info
+ class type_info
{
public:
/** Destructor first. Being the first non-inline virtual function, this
/** Returns an @e implementation-defined byte string; this is not
* portable between compilers! */
- const char* name() const
+ const char* name() const _GLIBCXX_NOEXCEPT
{ return __name[0] == '*' ? __name + 1 : __name; }
#if !__GXX_TYPEINFO_EQUALITY_INLINE
// In old abi, or when weak symbols are not supported, there can
// be multiple instances of a type_info object for one
// type. Uniqueness must use the _name value, not object address.
- bool before(const type_info& __arg) const;
- bool operator==(const type_info& __arg) const;
+ bool before(const type_info& __arg) const _GLIBCXX_NOEXCEPT;
+ bool operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT;
#else
#if !__GXX_MERGED_TYPEINFO_NAMES
/** Returns true if @c *this precedes @c __arg in the implementation's
// Even with the new abi, on systems that support dlopen
// we can run into cases where type_info names aren't merged,
// so we still need to do string comparison.
- bool before(const type_info& __arg) const
+ bool before(const type_info& __arg) const _GLIBCXX_NOEXCEPT
{ return (__name[0] == '*' && __arg.__name[0] == '*')
? __name < __arg.__name
: __builtin_strcmp (__name, __arg.__name) < 0; }
- bool operator==(const type_info& __arg) const
+ bool operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT
{
return ((__name == __arg.__name)
|| (__name[0] != '*' &&
#else
// On some targets we can rely on type_info's NTBS being unique,
// and therefore address comparisons are sufficient.
- bool before(const type_info& __arg) const
+ bool before(const type_info& __arg) const _GLIBCXX_NOEXCEPT
{ return __name < __arg.__name; }
- bool operator==(const type_info& __arg) const
+ bool operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT
{ return __name == __arg.__name; }
#endif
#endif
- bool operator!=(const type_info& __arg) const
+ bool operator!=(const type_info& __arg) const _GLIBCXX_NOEXCEPT
{ return !operator==(__arg); }
+#if __cplusplus >= 201103L
+ size_t hash_code() const noexcept
+ {
+# if !__GXX_MERGED_TYPEINFO_NAMES
+ return _Hash_bytes(name(), __builtin_strlen(name()),
+ static_cast<size_t>(0xc70f6907UL));
+# else
+ return reinterpret_cast<size_t>(__name);
+# endif
+ }
+#endif // C++11
+
// Return true if this is a pointer type of some kind
virtual bool __is_pointer_p() const;
protected:
const char *__name;
-
+
explicit type_info(const char *__n): __name(__n) { }
-
+
private:
/// Assigning type_info is not supported.
type_info& operator=(const type_info&);
*
* If you attempt an invalid @c dynamic_cast expression, an instance of
* this class (or something derived from this class) is thrown. */
- class bad_cast : public exception
+ class bad_cast : public exception
{
public:
- bad_cast() throw() { }
+ bad_cast() _GLIBCXX_USE_NOEXCEPT { }
// This declaration is not useless:
// http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
- virtual ~bad_cast() throw();
+ virtual ~bad_cast() _GLIBCXX_USE_NOEXCEPT;
// See comment in eh_exception.cc.
- virtual const char* what() const throw();
+ virtual const char* what() const _GLIBCXX_USE_NOEXCEPT;
};
-
- /**
+
+ /**
* @brief Thrown when a NULL pointer in a @c typeid expression is used.
* @ingroup exceptions
*/
- class bad_typeid : public exception
+ class bad_typeid : public exception
{
public:
- bad_typeid () throw() { }
+ bad_typeid () _GLIBCXX_USE_NOEXCEPT { }
// This declaration is not useless:
// http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
- virtual ~bad_typeid() throw();
+ virtual ~bad_typeid() _GLIBCXX_USE_NOEXCEPT;
// See comment in eh_exception.cc.
- virtual const char* what() const throw();
+ virtual const char* what() const _GLIBCXX_USE_NOEXCEPT;
};
} // namespace std
+} // extern "C++"
+
#pragma GCC visibility pop
-} // extern "C++"
#endif