]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libstdc++-v3/libsupc++/typeinfo
Update copyright years in libstdc++-v3/
[thirdparty/gcc.git] / libstdc++-v3 / libsupc++ / typeinfo
index 1a4736e1cbaa39b803b41b6e34e960d653241a39..8e4c3aedce5b663a287c4d82c3a25c632b0f2957 100644 (file)
@@ -1,7 +1,5 @@
 // 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.
 //
@@ -9,12 +7,12 @@
 // 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.
@@ -34,6 +32,9 @@
 #pragma GCC system_header
 
 #include <exception>
+#if __cplusplus >= 201103L
+#include <bits/hash_bytes.h>
+#endif
 
 #pragma GCC visibility push(default)
 
@@ -76,7 +77,7 @@ namespace __cxxabiv1
   #endif
 #endif
 
-namespace std 
+namespace std
 {
   /**
    *  @brief  Part of RTTI.
@@ -84,7 +85,7 @@ namespace std
    *  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
@@ -95,15 +96,15 @@ namespace std
 
     /** 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
@@ -111,12 +112,12 @@ namespace std
     // 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] != '*' &&
@@ -125,16 +126,28 @@ namespace std
   #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;
 
@@ -156,9 +169,9 @@ namespace std
 
   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&);
@@ -171,38 +184,39 @@ namespace std
    *
    *  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