Reviewers: choiniere.vincent,

Description:
Hi Vincent,

After looking at your change I came up with an alternative version.  Can
you try this out and let me know if it works for you?

Please review this at http://codereview.appspot.com/5683

Affected files:
   src/google/protobuf/stubs/hash.h


Index: src/google/protobuf/stubs/hash.h
===================================================================
--- src/google/protobuf/stubs/hash.h    (revision 45)
+++ src/google/protobuf/stubs/hash.h    (working copy)
@@ -29,17 +29,64 @@
  #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> {
  };




--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To post to this group, send email to protobuf@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to