Commit 640f8e65 by Paolo Carlini Committed by Paolo Carlini

functional_hash.h (__hash_combine): Remove.

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.

From-SVN: r157065
parent 06796564
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> 2010-02-24 Benjamin Kosnik <bkoz@redhat.com>
* doc/xml/faq.xml: Adjust structure for pdf index. * doc/xml/faq.xml: Adjust structure for pdf index.
......
...@@ -123,12 +123,11 @@ namespace std ...@@ -123,12 +123,11 @@ namespace std
struct _Fnv_hash_base struct _Fnv_hash_base
{ {
static size_t 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; --__length)
for (; __length > 0; --__length) __hash = (__hash * 131) + *__first++;
__result = (__result * 131) + *__first++; return __hash;
return __result;
} }
}; };
...@@ -136,15 +135,15 @@ namespace std ...@@ -136,15 +135,15 @@ namespace std
struct _Fnv_hash_base<4> struct _Fnv_hash_base<4>
{ {
static size_t 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; --__length)
for (; __length > 0; --__length)
{ {
__result ^= static_cast<size_t>(*__first++); __hash ^= static_cast<size_t>(*__first++);
__result *= static_cast<size_t>(16777619UL); __hash *= static_cast<size_t>(16777619UL);
} }
return __result; return __hash;
} }
}; };
...@@ -152,16 +151,15 @@ namespace std ...@@ -152,16 +151,15 @@ namespace std
struct _Fnv_hash_base<8> struct _Fnv_hash_base<8>
{ {
static size_t 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 = for (; __length; --__length)
static_cast<size_t>(14695981039346656037ULL);
for (; __length > 0; --__length)
{ {
__result ^= static_cast<size_t>(*__first++); __hash ^= static_cast<size_t>(*__first++);
__result *= static_cast<size_t>(1099511628211ULL); __hash *= static_cast<size_t>(1099511628211ULL);
} }
return __result; return __hash;
} }
}; };
...@@ -175,16 +173,13 @@ namespace std ...@@ -175,16 +173,13 @@ namespace std
hash(const _Tp& __val) hash(const _Tp& __val)
{ return hash(reinterpret_cast<const char*>(&__val), { return hash(reinterpret_cast<const char*>(&__val),
sizeof(__val)); } sizeof(__val)); }
};
// Inspired by the Boost facility hash_combine. template<typename _Tp>
template<typename _Tp> static size_t
inline size_t __hash_combine(const _Tp& __val, size_t __hash)
__hash_combine(size_t __hash, const _Tp& __val) { return hash(reinterpret_cast<const char*>(&__val),
{ sizeof(__val), __hash); }
const size_t __tmp = std::_Fnv_hash::hash(__val); };
return __hash ^ (__tmp + 0x9e3779b9 + (__hash << 6) + (__hash >> 2));
}
/// Specialization for float. /// Specialization for float.
template<> template<>
......
...@@ -356,7 +356,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -356,7 +356,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
operator()(const error_code& __e) const operator()(const error_code& __e) const
{ {
const size_t __tmp = std::_Fnv_hash::hash(__e._M_value); 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);
} }
}; };
......
...@@ -57,6 +57,6 @@ namespace std ...@@ -57,6 +57,6 @@ namespace std
hash<error_code>::operator()(error_code __e) const hash<error_code>::operator()(error_code __e) const
{ {
const size_t __tmp = std::_Fnv_hash::hash(__e._M_value); 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);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment