OSDN Git Service

2010-02-25 Paolo Carlini <paolo.carlini@oracle.com>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 25 Feb 2010 13:32:52 +0000 (13:32 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 25 Feb 2010 13:32:52 +0000 (13:32 +0000)
* include/bits/functional_hash.h (__hash_combine): Remove.
(_Fnv_hash_base<>::hash(const char*, size_t)): Add defaulted
hash parameter.
(_Fnv_hash::__hash_combine(const _Tp&, size_t)): Add.
* include/std/system_error (hash<system_error>): Adjust.
* src/compatibility-c++0x.cc (hash<system_error>): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157065 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/functional_hash.h
libstdc++-v3/include/std/system_error
libstdc++-v3/src/compatibility-c++0x.cc

index 66d4120..d363282 100644 (file)
@@ -1,3 +1,12 @@
+2010-02-25  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * include/bits/functional_hash.h (__hash_combine): Remove.
+       (_Fnv_hash_base<>::hash(const char*, size_t)): Add defaulted
+       hash parameter.
+       (_Fnv_hash::__hash_combine(const _Tp&, size_t)): Add.
+       * include/std/system_error (hash<system_error>): Adjust.
+       * src/compatibility-c++0x.cc (hash<system_error>): Likewise.
+
 2010-02-24  Benjamin Kosnik  <bkoz@redhat.com>
 
        * doc/xml/faq.xml: Adjust structure for pdf index.
index 8a29189..41fe11f 100644 (file)
@@ -123,12 +123,11 @@ namespace std
     struct _Fnv_hash_base
     {
       static size_t
-      hash(const char* __first, size_t __length)
+      hash(const char* __first, size_t __length, size_t __hash = 0)
       {
-       size_t __result = 0;
-       for (; __length > 0; --__length)
-         __result = (__result * 131) + *__first++;
-       return __result;
+       for (; __length; --__length)
+         __hash = (__hash * 131) + *__first++;
+       return __hash;
       }
     };
 
@@ -136,15 +135,15 @@ namespace std
     struct _Fnv_hash_base<4>
     {
       static size_t
-      hash(const char* __first, size_t __length)
+      hash(const char* __first, size_t __length,
+          size_t __hash = static_cast<size_t>(2166136261UL))
       {
-       size_t __result = static_cast<size_t>(2166136261UL);
-       for (; __length > 0; --__length)
+       for (; __length; --__length)
          {
-           __result ^= static_cast<size_t>(*__first++);
-           __result *= static_cast<size_t>(16777619UL);
+           __hash ^= static_cast<size_t>(*__first++);
+           __hash *= static_cast<size_t>(16777619UL);
          }
-       return __result;
+       return __hash;
       }
     };
   
@@ -152,16 +151,15 @@ namespace std
     struct _Fnv_hash_base<8>
     {
       static size_t
-      hash(const char* __first, size_t __length)
+      hash(const char* __first, size_t __length,
+          size_t __hash = static_cast<size_t>(14695981039346656037ULL))
       {
-       size_t __result =
-         static_cast<size_t>(14695981039346656037ULL);
-       for (; __length > 0; --__length)
+       for (; __length; --__length)
          {
-           __result ^= static_cast<size_t>(*__first++);
-           __result *= static_cast<size_t>(1099511628211ULL);
+           __hash ^= static_cast<size_t>(*__first++);
+           __hash *= static_cast<size_t>(1099511628211ULL);
          }
-       return __result;
+       return __hash;
       }
     };
 
@@ -175,16 +173,13 @@ namespace std
         hash(const _Tp& __val)
         { return hash(reinterpret_cast<const char*>(&__val),
                      sizeof(__val)); }
-    };
 
-  // Inspired by the Boost facility hash_combine.
-  template<typename _Tp>
-    inline size_t
-    __hash_combine(size_t __hash, const _Tp& __val)
-    {
-      const size_t __tmp = std::_Fnv_hash::hash(__val);
-      return __hash ^ (__tmp + 0x9e3779b9 + (__hash << 6) + (__hash >> 2));
-    }
+      template<typename _Tp>
+        static size_t
+        __hash_combine(const _Tp& __val, size_t __hash)
+        { return hash(reinterpret_cast<const char*>(&__val),
+                     sizeof(__val), __hash); }
+    };
 
   /// Specialization for float.
   template<>
index 9b6eff8..920b9de 100644 (file)
@@ -356,7 +356,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       operator()(const error_code& __e) const
       {
        const size_t __tmp = std::_Fnv_hash::hash(__e._M_value);
-       return std::__hash_combine(__tmp, __e._M_cat);
+       return std::_Fnv_hash::__hash_combine(__e._M_cat, __tmp);
       }
     };
 
index 7dd5768..759267a 100644 (file)
@@ -57,6 +57,6 @@ namespace std
     hash<error_code>::operator()(error_code __e) const
     {
       const size_t __tmp = std::_Fnv_hash::hash(__e._M_value);
-      return std::__hash_combine(__tmp, __e._M_cat);
+      return std::_Fnv_hash::__hash_combine(__e._M_cat, __tmp);
     }
 }