===================================================================
@@ -195,6 +195,18 @@
// @} group hashes
+ // Hint about performance of hash functor. If not fast the hash based
+ // containers will cache the hash code.
+ // Default behavior is to consider that hasher are fast unless specified
+ // otherwise.
+ template<typename _Hash>
+ struct __is_fast_hash : public std::true_type
+ { };
+
+ template<>
+ struct __is_fast_hash<hash<long double>> : public std::false_type
+ { };
+
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
===================================================================
@@ -3053,6 +3053,10 @@
{ return std::_Hash_impl::hash(__s.data(), __s.length()); }
};
+ template<>
+ struct __is_fast_hash<hash<string>> : std::false_type
+ { };
+
#ifdef _GLIBCXX_USE_WCHAR_T
/// std::hash specialization for wstring.
template<>
@@ -3064,6 +3068,10 @@
{ return std::_Hash_impl::hash(__s.data(),
__s.length() * sizeof(wchar_t)); }
};
+
+ template<>
+ struct __is_fast_hash<hash<wstring>> : std::false_type
+ { };
#endif
#endif /* _GLIBCXX_COMPATIBILITY_CXX0X */
@@ -3079,6 +3087,10 @@
__s.length() * sizeof(char16_t)); }
};
+ template<>
+ struct __is_fast_hash<hash<u16string>> : std::false_type
+ { };
+
/// std::hash specialization for u32string.
template<>
struct hash<u32string>
@@ -3089,6 +3101,10 @@
{ return std::_Hash_impl::hash(__s.data(),
__s.length() * sizeof(char32_t)); }
};
+
+ template<>
+ struct __is_fast_hash<hash<u32string>> : std::false_type
+ { };
#endif
_GLIBCXX_END_NAMESPACE_VERSION
===================================================================
@@ -40,9 +40,8 @@
template<typename _Tp, typename _Hash>
using __cache_default
- = __not_<__and_<// Do not cache for builtin integral types having trivial
- // hasher.
- is_integral<_Tp>,
+ = __not_<__and_<// Do not cache for fast hasher.
+ __is_fast_hash<_Hash>,
// Mandatory to make local_iterator default
// constructible.
is_default_constructible<_Hash>,
===================================================================
@@ -26,6 +26,7 @@
# error "hash_c++0x.cc must be compiled with -std=gnu++0x"
#endif
+#include <type_traits>
#include <bits/functional_hash.h>
namespace std _GLIBCXX_VISIBILITY(default)