diff options
author | graehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-08-11 02:46:13 +0000 |
---|---|---|
committer | graehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-08-11 02:46:13 +0000 |
commit | 82384b4ec365f3d2ad2c9bca078a0b38d4be09c0 (patch) | |
tree | f6f015f2791ec9b1ec94c90c98b09c0d251aee9e /decoder/hash.h | |
parent | e4e66118c14704509e214aa32689ef304ae5ada2 (diff) |
merge
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@511 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'decoder/hash.h')
-rwxr-xr-x | decoder/hash.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/decoder/hash.h b/decoder/hash.h new file mode 100755 index 00000000..3a60a429 --- /dev/null +++ b/decoder/hash.h @@ -0,0 +1,54 @@ +#ifndef CDEC_HASH_H +#define CDEC_HASH_H + +#include "murmur_hash.h" + +#include "config.h" +#ifdef HAVE_SPARSEHASH +# include <google/dense_hash_map> +# define HASH_MAP google::dense_hash_map +# define HASH_MAP_RESERVED(h,empty,deleted) do { h.set_empty_key(empty); h.set_deleted_key(deleted); } while(0) +# define HASH_MAP_EMPTY(h,empty) do { h.set_empty_key(empty); } while(0) +#else +# include <tr1/unordered_map> +# define HASH_MAP std::tr1::unordered_map +# define HASH_MAP_RESERVED(h,empty,deleted) +# define HASH_MAP_EMPTY(h,empty) +#endif + +#include <boost/functional/hash.hpp> + +// assumes C is POD +template <class C> +struct murmur_hash +{ + typedef MurmurInt return_type; + typedef C /*const&*/ argument_type; + return_type operator()(argument_type const& c) const { + return MurmurHash((void*)&c,sizeof(c)); + } +}; + +// murmur_hash_array isn't std guaranteed safe (you need to use string::data()) +template <> +struct murmur_hash<std::string> +{ + typedef MurmurInt return_type; + typedef std::string /*const&*/ argument_type; + return_type operator()(argument_type const& c) const { + return MurmurHash(c.data(),c.size()); + } +}; + +// uses begin(),size() assuming contiguous layout and POD +template <class C> +struct murmur_hash_array +{ + typedef MurmurInt return_type; + typedef C /*const&*/ argument_type; + return_type operator()(argument_type const& c) const { + return MurmurHash(&*c.begin(),c.size()*sizeof(*c.begin())); + } +}; + +#endif |