diff options
| author | fdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-04 21:14:07 +0000 |
|---|---|---|
| committer | fdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-04 21:14:07 +0000 |
| commit | 23d376822b3cbecc7adbc64659f48bdf3d113832 (patch) | |
| tree | ff7ddf9a008fd3fd07840be0618a5767dbf5ca34 /libstdc++-v3/include | |
| parent | ec7e9f786f28d4410e09adbbbae1dc8d1d4e14fe (diff) | |
| download | gcc-23d376822b3cbecc7adbc64659f48bdf3d113832.tar.gz | |
2013-02-04 François Dumont <fdumont@gcc.gnu.org>
* include/bits/functional_hash.h (std::__is_fast_hash<>): New.
* include/bits/basic_string.h: Specialize previous to mark
std::hash for string types as slow.
* include/bits/hashtable.h (__cache_default): Replace is_integral
with __is_fast_hash.
* src/c++11/hash_c++0x.cc: Add type_traits include.
* testsuite/23_containers/unordered_set/instantiation_neg.cc:
Adapt dg-error line number.
* testsuite/23_containers/unordered_set/
not_default_constructible_hash_neg.cc: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195738 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include')
| -rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 16 | ||||
| -rw-r--r-- | libstdc++-v3/include/bits/functional_hash.h | 12 | ||||
| -rw-r--r-- | libstdc++-v3/include/bits/hashtable.h | 5 |
3 files changed, 30 insertions, 3 deletions
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index b5d2526c907..aa188f53a68 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -3051,6 +3051,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { 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<> @@ -3062,6 +3066,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { 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 */ @@ -3077,6 +3085,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __s.length() * sizeof(char16_t)); } }; + template<> + struct __is_fast_hash<hash<u16string>> : std::false_type + { }; + /// std::hash specialization for u32string. template<> struct hash<u32string> @@ -3087,6 +3099,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { 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 diff --git a/libstdc++-v3/include/bits/functional_hash.h b/libstdc++-v3/include/bits/functional_hash.h index 5a99c541495..bc29235cf14 100644 --- a/libstdc++-v3/include/bits/functional_hash.h +++ b/libstdc++-v3/include/bits/functional_hash.h @@ -194,6 +194,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // @} 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 diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index d899fa728eb..6515b71eef9 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -40,9 +40,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION 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>, |
