Skip to content

Commit

Permalink
[10369] Implement UNORDERED_SET support.
Browse files Browse the repository at this point in the history
Signed-off-by: VladimirMangos <vladimir@getmangos.com>

Also added compatibility code for old Visual Studio versions
for non standard way hash calculation for hash_set.

Thanks to Lynx3D for help in Unix side testing.
  • Loading branch information
CipherCOM authored and VladimirMangos committed Aug 18, 2010
1 parent 1a351db commit 61ad4c7
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 7 deletions.
40 changes: 34 additions & 6 deletions src/framework/Utilities/UnorderedMap.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,31 +23,41 @@
#include "Platform/Define.h"

#if COMPILER == COMPILER_INTEL
#include <ext/hash_map>
# include <ext/hash_map>
# include <ext/hash_set>
#elif COMPILER == COMPILER_GNU && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 3)
#include <tr1/unordered_map>
# include <tr1/unordered_map>
# include <tr1/unordered_set>
#elif COMPILER == COMPILER_GNU && __GNUC__ >= 3
#include <ext/hash_map>
# include <ext/hash_map>
# include <ext/hash_set>
#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1500 && _HAS_TR1 // VC9.0 SP1 and later
#include <unordered_map>
# include <unordered_map>
# include <unordered_set>
#else
#include <hash_map>
# include <hash_map>
# include <hash_set>
#endif

#ifdef _STLPORT_VERSION
# define UNORDERED_MAP std::hash_map
# define UNORDERED_SET std::hash_set
# define HASH_NAMESPACE_START namespace std {
# define HASH_NAMESPACE_END }
using std::hash_map;
using std::hash_set;
#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1500 && _HAS_TR1
# define UNORDERED_MAP std::tr1::unordered_map
# define UNORDERED_SET std::tr1::unordered_set
# define HASH_NAMESPACE_START namespace std {
# define HASH_NAMESPACE_END }
#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1300
# define UNORDERED_MAP stdext::hash_map
# define UNORDERED_SET stdext::hash_set
# define HASH_NAMESPACE_START namespace stdext {
# define HASH_NAMESPACE_END }
using stdext::hash_map;
using stdext::hash_set;

#if !_HAS_TRADITIONAL_STL

Expand All @@ -67,15 +77,19 @@ HASH_NAMESPACE_END

#elif COMPILER == COMPILER_INTEL
# define UNORDERED_MAP std::hash_map
# define UNORDERED_SET std::hash_set
# define HASH_NAMESPACE_START namespace std {
# define HASH_NAMESPACE_END }
using std::hash_map;
using std::hash_set;
#elif COMPILER == COMPILER_GNU && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 3)
#define UNORDERED_MAP std::tr1::unordered_map
# define UNORDERED_MAP std::tr1::unordered_map
# define UNORDERED_SET std::tr1::unordered_set
# define HASH_NAMESPACE_START namespace std { namespace tr1 {
# define HASH_NAMESPACE_END } }
#elif COMPILER == COMPILER_GNU && __GNUC__ >= 3
# define UNORDERED_MAP __gnu_cxx::hash_map
# define UNORDERED_SET __gnu_cxx::hash_set
# define HASH_NAMESPACE_START namespace __gnu_cxx {
# define HASH_NAMESPACE_END }

Expand All @@ -102,13 +116,27 @@ HASH_NAMESPACE_START
return hash<const char *>()(__x.c_str());
}
};

HASH_NAMESPACE_END

#else
# define UNORDERED_MAP std::hash_map
# define UNORDERED_SET std::hash_set
# define HASH_NAMESPACE_START namespace std {
# define HASH_NAMESPACE_END }
using std::hash_map;
using std::hash_set;
#endif

#if COMPILER != COMPILER_MICROSOFT

// Visual Studio use non standard hash calculation function, so provide fake forward for other
HASH_NAMESPACE_START

template<class K>
size_t hash_value(K const&);

HASH_NAMESPACE_END

#endif

Expand Down
6 changes: 6 additions & 0 deletions src/game/ObjectGuid.h
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,12 @@ HASH_NAMESPACE_START
}
};

// for pre-TR1 Visual Studio versions (VS90 SP1 or early)
inline size_t hash_value(ObjectGuid const& key)
{
return hash_value(key.GetRawValue());
}

HASH_NAMESPACE_END

#endif
2 changes: 1 addition & 1 deletion src/shared/revision_nr.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "10368"
#define REVISION_NR "10369"
#endif // __REVISION_NR_H__

0 comments on commit 61ad4c7

Please sign in to comment.