diff options
| author | Alexis Hunt <alercah@gmail.com> | 2011-07-29 23:31:56 +0000 |
|---|---|---|
| committer | Alexis Hunt <alercah@gmail.com> | 2011-07-29 23:31:56 +0000 |
| commit | 8d2ed56644047c08e2646aa8c981bebd84347b4a (patch) | |
| tree | 11c6dbd52bbbe6daac1122e7ceafdae5b6219cc2 /libcxx/include/ext | |
| parent | fe473ae27747fec22e90083b26c1f81b31a3c68c (diff) | |
| download | bcm5719-llvm-8d2ed56644047c08e2646aa8c981bebd84347b4a.tar.gz bcm5719-llvm-8d2ed56644047c08e2646aa8c981bebd84347b4a.zip | |
Add a new hash class in __gnu_ext for the extension containers. There
are two motivations for this.
First, this allows users who are specializing __gnu_ext::hash to
continue doing so without changing their code.
Second, SGI specifies hash overloads for char* and const char* that
perform a hash of the string, not of the pointer.
In order to support this, the hashing code for string is factored out.
llvm-svn: 136539
Diffstat (limited to 'libcxx/include/ext')
| -rw-r--r-- | libcxx/include/ext/__hash | 46 | ||||
| -rw-r--r-- | libcxx/include/ext/hash_map | 1 | ||||
| -rw-r--r-- | libcxx/include/ext/hash_set | 3 |
3 files changed, 49 insertions, 1 deletions
diff --git a/libcxx/include/ext/__hash b/libcxx/include/ext/__hash new file mode 100644 index 00000000000..8e9635d07f5 --- /dev/null +++ b/libcxx/include/ext/__hash @@ -0,0 +1,46 @@ +// -*- C++ -*- +//===------------------------- hash_set ------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_EXT_HASH +#define _LIBCPP_EXT_HASH + +#pragma GCC system_header + +#include <string> +#include <cstring> + +namespace __gnu_cxx { +using namespace std; + +template <typename T> struct _LIBCPP_VISIBLE hash : public std::hash<T> + { }; + +template <> struct _LIBCPP_VISIBLE hash<const char*> + : public unary_function<const char*, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const char *__c) const _NOEXCEPT + { + return __do_string_hash(__c, __c + strlen(__c)); + } +}; + +template <> struct _LIBCPP_VISIBLE hash<char *> + : public unary_function<char*, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char *__c) const _NOEXCEPT + { + return __do_string_hash<const char *>(__c, __c + strlen(__c)); + } +}; +} + +#endif _LIBCPP_EXT_HASH diff --git a/libcxx/include/ext/hash_map b/libcxx/include/ext/hash_map index 21ce3be8a18..9e62e7a777d 100644 --- a/libcxx/include/ext/hash_map +++ b/libcxx/include/ext/hash_map @@ -203,6 +203,7 @@ template <class Key, class T, class Hash, class Pred, class Alloc> #include <__hash_table> #include <functional> #include <stdexcept> +#include <ext/__hash> #if __DEPRECATED #warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> diff --git a/libcxx/include/ext/hash_set b/libcxx/include/ext/hash_set index daad847afb3..14daf7bc29e 100644 --- a/libcxx/include/ext/hash_set +++ b/libcxx/include/ext/hash_set @@ -196,6 +196,7 @@ template <class Value, class Hash, class Pred, class Alloc> #include <__config> #include <__hash_table> #include <functional> +#include <ext/__hash> #if __DEPRECATED #warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set> @@ -205,7 +206,7 @@ namespace __gnu_cxx { using namespace std; -template <class _Value, class _Hash = std::hash<_Value>, class _Pred = equal_to<_Value>, +template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, class _Alloc = allocator<_Value> > class _LIBCPP_VISIBLE hash_set { |

