ZFFramework
 
Loading...
Searching...
No Matches
unordered_map.hpp
1// Portable header for std::unordered_map<K,V> template. Welcome to C++. Enjoy!
2// - rlyeh / zlib/libpng licensed
3
4#pragma once
5
6/*
7 * Just in case somebody else defined `unordered_map` before us.
8 */
9
10#ifdef unordered_map
11#undef unordered_map
12#endif
13
14/* Headers (in order)
15 * - std >= C++11: GCC <4.7.X defines __cplusplus as 1, use __GXX_EXPERIMENTAL_CXX0X__ instead
16 * - ICC
17 * - G++ >= 4.3.X
18 * - G++ >= 3.X.X
19 * - MSVC++ >= 9.0
20 * - OTHERS
21 */
22
23#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
24#include <unordered_map>
25#elif defined(__INTEL_COMPILER)
26#include <ext/hash_map>
27#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 3)
28#include <tr1/unordered_map>
29#elif defined(__GNUC__) && __GNUC__ >= 3
30#include <ext/hash_map>
31#elif defined(_MSC_VER) && ( ( _MSC_VER >= 1500 && _HAS_TR1 ) || ( _MSC_VER >= 1600 ) )
32#include <unordered_map>
33#else
34#include <hash_map>
35#endif
36
37/* Namespace and type (in order)
38 * - C++11, C++0X (std::unordered_map)
39 * - STLPORT (std::hash_map)
40 * - MSVC++ 2010 (std::unordered_map)
41 * - MSVC++ 9.0 (std::tr1::unordered_map)
42 * - MSVC++ 7.0 (stdext::hash_map)
43 * - G++ 4.3.X (std::tr1::unordered_map)
44 * - G++ 3.X.X, ICC (__gnu_cxx::hash_map)
45 * - OTHERS (std::hash_map)
46 */
47
48#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
49// ok
50
51#elif defined(_STLPORT_VERSION)
52#define unordered_map hash_map
53namespace std { using std::hash_map; }
54
55#elif defined(_MSC_VER) && _MSC_VER >= 1600
56// ok
57
58#elif defined(_MSC_VER) && _MSC_VER >= 1500 && _HAS_TR1
59#define _ZFT_zfstlhash std::tr1::hash
60#define _ZFT_zfstlequalto std::tr1::equal_to
61namespace std { using std::tr1::unordered_map; }
62
63#elif defined(_MSC_VER) && _MSC_VER >= 1300
64#define unordered_map hash_map
65#define _ZFT_zfstlhash stdext::hash
66#define _ZFT_zfstlequalto stdext::equal_to
67namespace std { using stdext::hash_map; }
68
69#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 3)
70#define _ZFT_zfstlhash std::tr1::hash
71#define _ZFT_zfstlequalto std::tr1::equal_to
72namespace std { using std::tr1::unordered_map; }
73
74#elif (defined(__GNUC__) && __GNUC__ >= 3) || defined(__INTEL_COMPILER)
75#include <string>
76#define unordered_map hash_map
77#define _ZFT_zfstlhash __gnu_cxx::hash
78#define _ZFT_zfstlequalto std::equal_to
79namespace std { using __gnu_cxx::hash_map; }
80
81 namespace __gnu_cxx {
82 template<> struct hash<unsigned long long> {
83 size_t operator()(const unsigned long long &__x) const {
84 return (size_t)__x;
85 }
86 };
87 template<typename T> struct hash<T *> {
88 size_t operator()(T * const &__x) const {
89 return (size_t)__x;
90 }
91 };
92 template<> struct hash<std::string> {
93 size_t operator()(const std::string &__x) const {
94 return hash<const char *>()(__x.c_str());
95 }
96 };
97 };
98
99#else
100#define unordered_map hash_map
101namespace std { using std::hash_map; }
102
103#endif