From: Paolo Carlini Date: Thu, 25 Feb 2010 13:32:52 +0000 (+0000) Subject: functional_hash.h (__hash_combine): Remove. X-Git-Tag: releases/gcc-4.5.0~607 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=640f8e65484943a0bc1c2c47cdbee438fc40b8ad;p=thirdparty%2Fgcc.git functional_hash.h (__hash_combine): Remove. 2010-02-25 Paolo Carlini * 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): Adjust. * src/compatibility-c++0x.cc (hash): Likewise. From-SVN: r157065 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 66d4120ba57a..d36328280814 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2010-02-25 Paolo Carlini + + * 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): Adjust. + * src/compatibility-c++0x.cc (hash): Likewise. + 2010-02-24 Benjamin Kosnik * doc/xml/faq.xml: Adjust structure for pdf index. diff --git a/libstdc++-v3/include/bits/functional_hash.h b/libstdc++-v3/include/bits/functional_hash.h index 8a2918997985..41fe11fae8f5 100644 --- a/libstdc++-v3/include/bits/functional_hash.h +++ b/libstdc++-v3/include/bits/functional_hash.h @@ -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(2166136261UL)) { - size_t __result = static_cast(2166136261UL); - for (; __length > 0; --__length) + for (; __length; --__length) { - __result ^= static_cast(*__first++); - __result *= static_cast(16777619UL); + __hash ^= static_cast(*__first++); + __hash *= static_cast(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(14695981039346656037ULL)) { - size_t __result = - static_cast(14695981039346656037ULL); - for (; __length > 0; --__length) + for (; __length; --__length) { - __result ^= static_cast(*__first++); - __result *= static_cast(1099511628211ULL); + __hash ^= static_cast(*__first++); + __hash *= static_cast(1099511628211ULL); } - return __result; + return __hash; } }; @@ -175,16 +173,13 @@ namespace std hash(const _Tp& __val) { return hash(reinterpret_cast(&__val), sizeof(__val)); } - }; - // Inspired by the Boost facility hash_combine. - template - 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 + static size_t + __hash_combine(const _Tp& __val, size_t __hash) + { return hash(reinterpret_cast(&__val), + sizeof(__val), __hash); } + }; /// Specialization for float. template<> diff --git a/libstdc++-v3/include/std/system_error b/libstdc++-v3/include/std/system_error index 9b6eff8e836e..920b9dee37b9 100644 --- a/libstdc++-v3/include/std/system_error +++ b/libstdc++-v3/include/std/system_error @@ -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); } }; diff --git a/libstdc++-v3/src/compatibility-c++0x.cc b/libstdc++-v3/src/compatibility-c++0x.cc index 7dd57680484f..759267ab3a5d 100644 --- a/libstdc++-v3/src/compatibility-c++0x.cc +++ b/libstdc++-v3/src/compatibility-c++0x.cc @@ -57,6 +57,6 @@ namespace std hash::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); } }