|
|
|
@ -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> { |
|
|
|
|