-/** Where hash_map is varies from compiler to compiler
- * as it is not standard.
- */
-#ifndef WIN32
-#include <ext/hash_map>
-/** Oddball linux namespace for hash_map */
-#define nspace __gnu_cxx
-#else
-#include <hash_map>
-#define nspace stdext
-/** Oddball windows namespace for hash_map */
-using stdext::hash_map;
-#endif
+#ifndef INSPIRCD_HASHMAP_H
+#define INSPIRCD_HASHMAP_H
+
+ /** Where hash_map is varies from compiler to compiler
+ * as it is not standard unless we have tr1.
+ *
+ * TODO: in 2.2 if we drop support for libstdc++ older than 3.4.7 and GCC older
+ * than 4.1 this can be cleaned up massively.
+ */
+ #if !defined _LIBCPP_VERSION && !defined _WIN32
+ #if !defined __GLIBCXX__ || __GLIBCXX__ > 20060309
+ // GCC4+ has deprecated hash_map and uses tr1. But of course, uses a different include to MSVC. FOR FUCKS SAKE.
+ #include <tr1/unordered_map>
+ #define HAS_TR1_UNORDERED
+ #define HASHMAP_DEPRECATED
+ #define hash_map unordered_map
+ #define nspace std::tr1
+ #define BEGIN_HASHMAP_NAMESPACE namespace std { namespace tr1 {
+ #define END_HASHMAP_NAMESPACE } }
+ #else
+ #include <ext/hash_map>
+ /** Oddball linux namespace for hash_map */
+ #define nspace __gnu_cxx
+ #define BEGIN_HASHMAP_NAMESPACE namespace nspace {
+ #define END_HASHMAP_NAMESPACE }
+ #endif
+ #else
+ #include <unordered_map>
+ #define HAS_TR1_UNORDERED
+ #define HASHMAP_DEPRECATED
+ #define hash_map unordered_map
+ #define nspace std
+ #define BEGIN_HASHMAP_NAMESPACE namespace std {
+ #define END_HASHMAP_NAMESPACE }
+ #endif