Index: third_party/protobuf/src/google/protobuf/stubs/hash.h |
diff --git a/third_party/protobuf/src/google/protobuf/stubs/hash.h b/third_party/protobuf/src/google/protobuf/stubs/hash.h |
old mode 100755 |
new mode 100644 |
index 583343222ec61af2e18ebbd0245b3ce1a36a70f5..4eac7d5d2584cd75dd242ad097df2d3af0e8c946 |
--- a/third_party/protobuf/src/google/protobuf/stubs/hash.h |
+++ b/third_party/protobuf/src/google/protobuf/stubs/hash.h |
@@ -108,8 +108,13 @@ |
# define GOOGLE_PROTOBUF_HAS_CXX11_HASH |
# define GOOGLE_PROTOBUF_HASH_COMPARE std::hash_compare |
# elif _MSC_VER >= 1500 // Since Visual Studio 2008 |
-# undef GOOGLE_PROTOBUF_HAVE_HASH_MAP |
-# undef GOOGLE_PROTOBUF_HAVE_HASH_SET |
+# define GOOGLE_PROTOBUF_HASH_NAMESPACE stdext |
+# include <hash_map> |
+# define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map |
+# include <hash_set> |
+# define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set |
+# define GOOGLE_PROTOBUF_HASH_COMPARE stdext::hash_compare |
+# define GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE |
# elif _MSC_VER >= 1310 |
# define GOOGLE_PROTOBUF_HASH_NAMESPACE stdext |
# include <hash_map> |
@@ -214,6 +219,8 @@ class hash_map : public std::map<Key, Data, HashFcn, Alloc> { |
hash_map(int a = 0, const HashFcn& b = HashFcn(), |
const EqualKey& c = EqualKey(), |
const Alloc& d = Alloc()) : BaseClass(b, d) {} |
+ |
+ HashFcn hash_function() const { return HashFcn(); } |
}; |
template <typename Key, |
@@ -222,6 +229,8 @@ template <typename Key, |
class hash_set : public std::set<Key, HashFcn> { |
public: |
hash_set(int = 0) {} |
+ |
+ HashFcn hash_function() const { return HashFcn(); } |
}; |
#elif defined(_MSC_VER) && !defined(_STLPORT_VERSION) |
@@ -243,6 +252,52 @@ template <> |
struct hash<const char*> |
: public GOOGLE_PROTOBUF_HASH_COMPARE<const char*, CstringLess> {}; |
+#ifdef GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE |
+ |
+template <typename Key, typename HashFcn, typename EqualKey> |
+struct InternalHashCompare : public GOOGLE_PROTOBUF_HASH_COMPARE<Key> { |
+ InternalHashCompare() {} |
+ InternalHashCompare(HashFcn hashfcn, EqualKey equalkey) |
+ : hashfcn_(hashfcn), equalkey_(equalkey) {} |
+ size_t operator()(const Key& key) const { return hashfcn_(key); } |
+ bool operator()(const Key& key1, const Key& key2) const { |
+ return !equalkey_(key1, key2); |
+ } |
+ HashFcn hashfcn_; |
+ EqualKey equalkey_; |
+}; |
+ |
+template <typename Key, typename Data, |
+ typename HashFcn = hash<Key>, |
+ typename EqualKey = std::equal_to<Key>, |
+ typename Alloc = std::allocator< std::pair<const Key, Data> > > |
+class hash_map |
+ : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< |
+ Key, Data, InternalHashCompare<Key, HashFcn, EqualKey>, Alloc> { |
+ typedef GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< |
+ Key, Data, InternalHashCompare<Key, HashFcn, EqualKey>, Alloc> BaseClass; |
+ |
+ public: |
+ hash_map(int a = 0, const HashFcn& b = HashFcn(), |
+ const EqualKey& c = EqualKey(), const Alloc& d = Alloc()) |
+ : BaseClass(InternalHashCompare<Key, HashFcn, EqualKey>(b, c), d) {} |
+ |
+ HashFcn hash_function() const { return HashFcn(); } |
+}; |
+ |
+template <typename Key, typename HashFcn = hash<Key>, |
+ typename EqualKey = std::equal_to<Key> > |
+class hash_set |
+ : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_SET_CLASS< |
+ Key, InternalHashCompare<Key, HashFcn, EqualKey> > { |
+ public: |
+ hash_set(int = 0) {} |
+ |
+ HashFcn hash_function() const { return HashFcn(); } |
+}; |
+ |
+#else // GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE |
+ |
template <typename Key, typename Data, |
typename HashFcn = hash<Key>, |
typename EqualKey = std::equal_to<Key>, |
@@ -257,6 +312,8 @@ class hash_map |
hash_map(int a = 0, const HashFcn& b = HashFcn(), |
const EqualKey& c = EqualKey(), |
const Alloc& d = Alloc()) : BaseClass(a, b, c, d) {} |
+ |
+ HashFcn hash_function() const { return HashFcn(); } |
}; |
template <typename Key, typename HashFcn = hash<Key>, |
@@ -266,9 +323,12 @@ class hash_set |
Key, HashFcn, EqualKey> { |
public: |
hash_set(int = 0) {} |
+ |
+ HashFcn hash_function() const { return HashFcn(); } |
}; |
+#endif // GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE |
-#else |
+#else // defined(_MSC_VER) && !defined(_STLPORT_VERSION) |
template <typename Key> |
struct hash : public GOOGLE_PROTOBUF_HASH_NAMESPACE::hash<Key> { |
@@ -315,6 +375,8 @@ class hash_map |
hash_map(int a = 0, const HashFcn& b = HashFcn(), |
const EqualKey& c = EqualKey(), |
const Alloc& d = Alloc()) : BaseClass(a, b, c, d) {} |
+ |
+ HashFcn hash_function() const { return HashFcn(); } |
}; |
template <typename Key, typename HashFcn = hash<Key>, |
@@ -324,6 +386,8 @@ class hash_set |
Key, HashFcn, EqualKey> { |
public: |
hash_set(int = 0) {} |
+ |
+ HashFcn hash_function() const { return HashFcn(); } |
}; |
#endif // !GOOGLE_PROTOBUF_MISSING_HASH |