#endif
 #endif
 
+#ifndef HAVE_TYPE_TRAITS
+    #if defined(__has_include) && __has_include(<type_traits>)
+        #define HAVE_TYPE_TRAITS
+    #endif
+#endif
+
 #ifndef HAVE_TR1_TYPE_TRAITS
-    #if defined(__VISUALC__) && (_MSC_FULL_VER >= 150030729)
+    #if defined(__has_include) && __has_include(<tr1/type_traits>)
+        #define HAVE_TR1_TYPE_TRAITS
+    #endif
+    #elif defined(__VISUALC__) && (_MSC_FULL_VER >= 150030729)
         #define HAVE_TR1_TYPE_TRAITS
     #endif
 #endif
 
+#ifndef HAVE_STD_UNORDERED_MAP
+    #if defined(__has_include) && __has_include(<unordered_map>)
+        #define HAVE_STD_UNORDERED_MAP
+    #endif
+#endif
+
+#ifndef HAVE_TR1_UNORDERED_MAP
+    #if defined(__has_include) && __has_include(<tr1/unordered_map>)
+        #define HAVE_TR1_UNORDERED_MAP
+    #endif
+#endif
+
+#ifndef HAVE_STD_UNORDERED_SET
+    #if defined(__has_include) && __has_include(<unordered_set>)
+        #define HAVE_STD_UNORDERED_SET
+    #endif
+#endif
+
+#ifndef HAVE_TR1_UNORDERED_SET
+    #if defined(__has_include) && __has_include(<tr1/unordered_set>)
+        #define HAVE_TR1_UNORDERED_SET
+    #endif
+#endif
+
 /* provide replacement for C99 va_copy() if the compiler doesn't have it */
 
 /* could be already defined by configure or the user */