diff options
author | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2008-09-19 16:53:32 +0000 |
---|---|---|
committer | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2008-09-19 16:53:32 +0000 |
commit | 4410396f11bbce82ed806f93ab9befb8034619b1 (patch) | |
tree | 1f965a83c84fcf1988d7d8f442817ab1038fb4c9 /src/google/protobuf/stubs/hash.h | |
parent | 4014b9f83f612cd6ca4348b0d2ca9974d44e671d (diff) | |
download | protobuf-4410396f11bbce82ed806f93ab9befb8034619b1.tar.gz protobuf-4410396f11bbce82ed806f93ab9befb8034619b1.tar.bz2 protobuf-4410396f11bbce82ed806f93ab9befb8034619b1.zip |
Work around absence of hash_map.
Also, update version numbers to 2.0.2-SNAPSHOT.
Diffstat (limited to 'src/google/protobuf/stubs/hash.h')
-rw-r--r-- | src/google/protobuf/stubs/hash.h | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/src/google/protobuf/stubs/hash.h b/src/google/protobuf/stubs/hash.h index a62b3f6e..27b83ed4 100644 --- a/src/google/protobuf/stubs/hash.h +++ b/src/google/protobuf/stubs/hash.h @@ -29,15 +29,62 @@ #include HASH_MAP_H #include HASH_SET_H #else -// TODO(kenton): Deal with non-existence of hash_map somehow. Maybe emulate -// it with map? -#error "Your STL implementation lacks hash_map and/or hash_set." +#define MISSING_HASH +#include <map> +#include <set> #endif namespace google { namespace protobuf { -#ifdef _MSC_VER +#ifdef MISSING_HASH + +// This system doesn't have hash_map or hash_set. Emulate them using map and +// set. + +// Make hash<T> be the same as less<T>. Note that everywhere where custom +// hash functions are defined in the protobuf code, they are also defined such +// that they can be used as "less" functions, which is required by MSVC anyway. +template <typename Key> +struct hash { + // Dummy, just to make derivative hash functions compile. + int operator()(const Key& key) { + GOOGLE_LOG(FATAL) << "Should never be called."; + return 0; + } + + inline bool operator()(const Key& a, const Key& b) const { + return a < b; + } +}; + +// Make sure char* is compared by value. +template <> +struct hash<const char*> { + // Dummy, just to make derivative hash functions compile. + int operator()(const char* key) { + GOOGLE_LOG(FATAL) << "Should never be called."; + return 0; + } + + inline bool operator()(const char* a, const char* b) const { + return strcmp(a, b) < 0; + } +}; + +template <typename Key, typename Data, + typename HashFcn = hash<Key>, + typename EqualKey = int > +class hash_map : public std::map<Key, Data, HashFcn> { +}; + +template <typename Key, + typename HashFcn = hash<Key>, + typename EqualKey = int > +class hash_set : public std::set<Key, HashFcn> { +}; + +#elif defined(_MSC_VER) template <typename Key> struct hash : public HASH_NAMESPACE::hash_compare<Key> { |