[10366] Add portable way for hash specialization adding.

Use it for ObjectGuid hash specialization
This commit is contained in:
VladimirMangos 2010-08-17 23:54:52 +04:00
parent 821bb9fcc4
commit fbf4c5b3b4
3 changed files with 66 additions and 14 deletions

View file

@ -36,31 +36,62 @@
#ifdef _STLPORT_VERSION #ifdef _STLPORT_VERSION
# define UNORDERED_MAP std::hash_map # define UNORDERED_MAP std::hash_map
# define HASH_NAMESPACE_START namespace std {
# define HASH_NAMESPACE_END }
using std::hash_map; using std::hash_map;
#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1500 && _HAS_TR1 #elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1500 && _HAS_TR1
# define UNORDERED_MAP std::tr1::unordered_map # define UNORDERED_MAP std::tr1::unordered_map
# define HASH_NAMESPACE_START namespace std {
# define HASH_NAMESPACE_END }
#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1300 #elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1300
# define UNORDERED_MAP stdext::hash_map # define UNORDERED_MAP stdext::hash_map
# define HASH_NAMESPACE_START namespace stdext {
# define HASH_NAMESPACE_END }
using stdext::hash_map; using stdext::hash_map;
#if !_HAS_TRADITIONAL_STL
// can be not used by some platforms, so provide fake forward
HASH_NAMESPACE_START
template<class K>
class hash
{
public:
size_t operator() (K const&);
};
HASH_NAMESPACE_END
#endif
#elif COMPILER == COMPILER_INTEL #elif COMPILER == COMPILER_INTEL
# define UNORDERED_MAP std::hash_map # define UNORDERED_MAP std::hash_map
# define HASH_NAMESPACE_START namespace std {
# define HASH_NAMESPACE_END }
using std::hash_map; using std::hash_map;
#elif COMPILER == COMPILER_GNU && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 3) #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 HASH_NAMESPACE_START namespace std { namespace tr1 {
# define HASH_NAMESPACE_END } }
#elif COMPILER == COMPILER_GNU && __GNUC__ >= 3 #elif COMPILER == COMPILER_GNU && __GNUC__ >= 3
# define UNORDERED_MAP __gnu_cxx::hash_map # define UNORDERED_MAP __gnu_cxx::hash_map
# define HASH_NAMESPACE_START namespace __gnu_cxx {
# define HASH_NAMESPACE_END }
HASH_NAMESPACE_START
namespace __gnu_cxx
{
template<> template<>
struct hash<unsigned long long> class hash<unsigned long long>
{ {
public:
size_t operator()(const unsigned long long &__x) const { return (size_t)__x; } size_t operator()(const unsigned long long &__x) const { return (size_t)__x; }
}; };
template<typename T> template<typename T>
struct hash<T *> class hash<T *>
{ {
public:
size_t operator()(T * const &__x) const { return (size_t)__x; } size_t operator()(T * const &__x) const { return (size_t)__x; }
}; };
@ -71,10 +102,14 @@ namespace __gnu_cxx
return hash<const char *>()(__x.c_str()); return hash<const char *>()(__x.c_str());
} }
}; };
}; HASH_NAMESPACE_END
#else #else
# define UNORDERED_MAP std::hash_map # define UNORDERED_MAP std::hash_map
# define HASH_NAMESPACE_START namespace std {
# define HASH_NAMESPACE_END }
using std::hash_map; using std::hash_map;
#endif #endif
#endif #endif

View file

@ -22,6 +22,8 @@
#include "Common.h" #include "Common.h"
#include "ByteBuffer.h" #include "ByteBuffer.h"
#include <functional>
enum TypeID enum TypeID
{ {
TYPEID_OBJECT = 0, TYPEID_OBJECT = 0,
@ -277,4 +279,19 @@ ByteBuffer& operator>> (ByteBuffer& buf, PackedGuidReader const& guid);
inline PackedGuid ObjectGuid::WriteAsPacked() const { return PackedGuid(*this); } inline PackedGuid ObjectGuid::WriteAsPacked() const { return PackedGuid(*this); }
HASH_NAMESPACE_START
template<>
class hash<ObjectGuid>
{
public:
size_t operator() (ObjectGuid const& key) const
{
return hash<uint64>()(key.GetRawValue());
}
};
HASH_NAMESPACE_END
#endif #endif

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "10365" #define REVISION_NR "10366"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__