Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix hash.h for MSVC and platforms without hash map/set support.
Change-Id: Ic0fdb52c17b9495c73b8ce15879531383a148585
- Loading branch information
Showing
3 changed files
with
48 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -89,16 +89,17 @@ struct hash<const char*> { | |
|
||
template <typename Key, typename Data, | ||
typename HashFcn = hash<Key>, | ||
typename EqualKey = int, | ||
typename EqualKey = std::equal_to<Key>, | ||
typename Alloc = std::allocator< std::pair<const Key, Data> > > | ||
class hash_map : public std::map<Key, Data, HashFcn, Alloc> { | ||
class hash_map : public std::map<Key, Data, HashFcn, EqualKey, Alloc> { | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
liujisi
Author
Contributor
|
||
public: | ||
hash_map(int = 0) {} | ||
hash_map(int = 0, const HashFcn& = HashFcn(), const EqualKey& = EqualKey(), | ||
const Alloc& = Alloc()) {} | ||
}; | ||
|
||
template <typename Key, | ||
typename HashFcn = hash<Key>, | ||
typename EqualKey = int > | ||
typename EqualKey = std::equal_to<Key> > | ||
class hash_set : public std::set<Key, HashFcn> { | ||
public: | ||
hash_set(int = 0) {} | ||
|
@@ -126,19 +127,21 @@ struct hash<const char*> | |
|
||
template <typename Key, typename Data, | ||
typename HashFcn = hash<Key>, | ||
typename EqualKey = int, | ||
typename EqualKey = std::equal_to<Key>, | ||
typename Alloc = std::allocator< std::pair<const Key, Data> > > | ||
class hash_map : public GOOGLE_PROTOBUF_HASH_NAMESPACE::hash_map< | ||
Key, Data, HashFcn, Alloc> { | ||
class hash_map | ||
: public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< | ||
Key, Data, HashFcn, EqualKey, Alloc> { | ||
public: | ||
hash_map(int = 0) {} | ||
hash_map(int = 0, const HashFcn& = HashFcn(), const EqualKey& = EqualKey(), | ||
const Alloc& = Alloc()) {} | ||
}; | ||
|
||
template <typename Key, | ||
typename HashFcn = hash<Key>, | ||
typename EqualKey = int > | ||
class hash_set : public GOOGLE_PROTOBUF_HASH_NAMESPACE::hash_set< | ||
Key, 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, HashFcn, EqualKey> { | ||
public: | ||
hash_set(int = 0) {} | ||
}; | ||
|
@@ -169,7 +172,8 @@ struct hash<const char*> { | |
} | ||
}; | ||
|
||
template <typename Key, typename Data, typename HashFcn = hash<Key>, | ||
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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
30 changes: 20 additions & 10 deletions
30
vsprojects/google/protobuf/stubs/pbconfig.h
100644 → 100755
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,39 @@ | ||
/* protobuf config.h for MSVC. On other platforms, this is generated | ||
* automatically by autoheader / autoconf / configure. */ | ||
|
||
/* the location of <hash_map> */ | ||
#define GOOGLE_PROTOBUF_HASH_MAP_H <hash_map> | ||
// NOTE: if you add new macros in this file manually, please propagate the macro | ||
// to vsprojects/config.h. | ||
|
||
/* the namespace of hash_map/hash_set */ | ||
// Apparently Microsoft decided to move hash_map *back* to the std namespace | ||
// in MSVC 2010: | ||
// http://blogs.msdn.com/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx | ||
// TODO(kenton): Use unordered_map instead, which is available in MSVC 2010. | ||
#if _MSC_VER < 1310 || _MSC_VER >= 1600 | ||
// And.. they are moved back to stdext in MSVC 2013 (haven't checked 2012). That | ||
// said, use unordered_map for MSVC 2010 and beyond is our safest bet. | ||
#if _MSC_VER >= 1600 | ||
#define GOOGLE_PROTOBUF_HASH_NAMESPACE std | ||
#else | ||
#define GOOGLE_PROTOBUF_HASH_MAP_H <unordered_map> | ||
#define GOOGLE_PROTOBUF_HASH_MAP_CLASS unordered_map | ||
#define GOOGLE_PROTOBUF_HASH_SET_H <unordered_set> | ||
#define GOOGLE_PROTOBUF_HASH_SET_CLASS unordered_set | ||
#elif _MSC_VER >= 1310 | ||
#define GOOGLE_PROTOBUF_HASH_NAMESPACE stdext | ||
#define GOOGLE_PROTOBUF_HASH_MAP_H <hash_map> | ||
#define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map | ||
#define GOOGLE_PROTOBUF_HASH_SET_H <hash_set> | ||
#define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set | ||
#else | ||
#define GOOGLE_PROTOBUF_HASH_NAMESPACE std | ||
#define GOOGLE_PROTOBUF_HASH_MAP_H <hash_map> | ||
#define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map | ||
#define GOOGLE_PROTOBUF_HASH_SET_H <hash_set> | ||
#define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set | ||
#endif | ||
|
||
/* the location of <hash_set> */ | ||
#define GOOGLE_PROTOBUF_HASH_SET_H <hash_set> | ||
|
||
/* define if the compiler has hash_map */ | ||
#define GOOGLE_PROTOBUF_HAVE_HASH_MAP 1 | ||
|
||
/* define if the compiler has hash_set */ | ||
#define GOOGLE_PROTOBUF_HAVE_HASH_SET 1 | ||
|
||
/* define if you want to use zlib. See readme.txt for additional | ||
* requirements. */ | ||
// #define HAVE_ZLIB 1 |
std::map only takes 4 type parameters. How is this code compiled?