OSDN Git Service

2011-02-10 Jonathan Wakely <jwakely.gcc@gmail.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / src / compatibility-c++0x.cc
index df28eca..08a5727 100644 (file)
@@ -1,6 +1,6 @@
 // Compatibility symbols for previous versions, C++0x bits -*- C++ -*-
 
-// Copyright (C) 2009 Free Software Foundation, Inc.
+// Copyright (C) 2009, 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
 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 // <http://www.gnu.org/licenses/>.
 
-#include <cstddef>
+#define _GLIBCXX_COMPATIBILITY_CXX0X
 #include <string>
-#include <cmath>
 #include <system_error>
 
 #ifndef __GXX_EXPERIMENTAL_CXX0X__
 # error "compatibility-c++0x.cc must be compiled with -std=gnu++0x"
 #endif
 
-namespace std
+namespace std _GLIBCXX_VISIBILITY(default)
 {
+  // gcc-4.4.0
+  // <mutex> exported std::lock_error
+#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
+  class lock_error : public exception
+  {
+  public:
+    virtual const char*
+    _GLIBCXX_CONST what() const throw();
+  };
+
+  const char*
+  lock_error::what() const throw()
+  { return "std::lock_error"; }
+#endif
+
   // We need these due to the symbols exported since GLIBCXX_3.4.10.
   // See libstdc++/41662 for details.
 
-  template<typename _Tp>
-    struct hash : public std::unary_function<_Tp, size_t>
-    {
-      size_t
-      operator()(_Tp __val) const;
-    };
-
-  /// Dummy generic implementation (for sizeof(size_t) != 4, 8).
-  template<size_t = sizeof(size_t)>
-    struct _Fnv_hash
-    {
-      static size_t
-      hash(const char* __first, size_t __length)
-      {
-       size_t __result = 0;
-       for (; __length > 0; --__length)
-         __result = (__result * 131) + *__first++;
-       return __result;
-      }
-    };
+#ifndef _GLIBCXX_LONG_DOUBLE_COMPAT_IMPL
+  template<>
+    size_t
+    hash<string>::operator()(string __s) const
+    { return _Hash_impl::hash(__s.data(), __s.length()); }
 
   template<>
-    struct _Fnv_hash<4>
-    {
-      static size_t
-      hash(const char* __first, size_t __length)
-      {
-       size_t __result = static_cast<size_t>(2166136261UL);
-       for (; __length > 0; --__length)
-         {
-           __result ^= static_cast<size_t>(*__first++);
-           __result *= static_cast<size_t>(16777619UL);
-         }
-       return __result;
-      }
-    };
-  
+    size_t
+    hash<const string&>::operator()(const string& __s) const
+    { return _Hash_impl::hash(__s.data(), __s.length()); }
+
+#ifdef _GLIBCXX_USE_WCHAR_T
   template<>
-    struct _Fnv_hash<8>
-    {
-      static size_t
-      hash(const char* __first, size_t __length)
-      {
-       size_t __result =
-         static_cast<size_t>(14695981039346656037ULL);
-       for (; __length > 0; --__length)
-         {
-           __result ^= static_cast<size_t>(*__first++);
-           __result *= static_cast<size_t>(1099511628211ULL);
-         }
-       return __result;
-      }
-    };
+    size_t
+    hash<wstring>::operator()(wstring __s) const
+    { return _Hash_impl::hash(__s.data(), __s.length() * sizeof(wchar_t)); }
 
-#include "hash.cc"
+  template<>
+    size_t
+    hash<const wstring&>::operator()(const wstring& __s) const
+    { return _Hash_impl::hash(__s.data(), __s.length() * sizeof(wchar_t)); }
+#endif
+#endif
 
   template<>
     size_t
     hash<error_code>::operator()(error_code __e) const
-    { 
-      const char* __p = reinterpret_cast<const char*>(&__e);
-      return _Fnv_hash<>::hash(__p, sizeof(__e));
+    {
+      const size_t __tmp = std::_Hash_impl::hash(__e._M_value);
+      return std::_Hash_impl::__hash_combine(__e._M_cat, __tmp);
     }
 }