From d7923b82ade9f84d0fc4c6d44b9719f2f7c0e9af Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 16 May 2015 06:57:53 +0200 Subject: [PATCH] Use std::unordered_map instead of hash_map where available. --- CMakeLists.txt | 1 + Source/Checks/cm_cxx11_unordered_map.cmake | 25 ++++++++++++++++++++++ Source/Checks/cm_cxx11_unordered_map.cpp | 6 ++++++ Source/cmConfigure.cmake.h.in | 1 + Source/cmDefinitions.h | 9 +++++++- Source/cmFileTimeComparison.cxx | 12 +++++++++++ Source/cmGlobalGenerator.h | 10 ++++++++- Source/cmMakefile.h | 14 +++++++++++- Source/cmTarget.h | 12 +++++++++-- 9 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 Source/Checks/cm_cxx11_unordered_map.cmake create mode 100644 Source/Checks/cm_cxx11_unordered_map.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 19d83f17e..5a7566621 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ if(NOT DEFINED CMAKE_CXX_STANDARD AND NOT CMake_NO_CXX_STANDARD) set(CMAKE_CXX_STANDARD 11) endif() endif() +include(${CMake_SOURCE_DIR}/Source/Checks/cm_cxx11_unordered_map.cmake) # option to set the internal encoding of CMake to UTF-8 option(CMAKE_ENCODING_UTF8 "Use UTF-8 encoding internally." ON) diff --git a/Source/Checks/cm_cxx11_unordered_map.cmake b/Source/Checks/cm_cxx11_unordered_map.cmake new file mode 100644 index 000000000..80fe391bc --- /dev/null +++ b/Source/Checks/cm_cxx11_unordered_map.cmake @@ -0,0 +1,25 @@ + +if(CMAKE_CXX_STANDARD AND NOT DEFINED CMake_HAVE_CXX11_UNORDERED_MAP) + message(STATUS "Checking if compiler supports C++11 unordered_map") + try_compile(CMake_HAVE_CXX11_UNORDERED_MAP + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_LIST_DIR}/cm_cxx11_unordered_map.cpp + CMAKE_FLAGS -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} + OUTPUT_VARIABLE OUTPUT + ) + if(CMake_HAVE_CXX11_UNORDERED_MAP) + message(STATUS "Checking if compiler supports C++11 unordered_map - yes") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if compiler supports C++11 unordered_map passed with the following output:\n" + "${OUTPUT}\n" + "\n" + ) + else() + message(STATUS "Checking if compiler supports C++11 unordered_map - no") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if compiler supports C++11 unordered_map failed with the following output:\n" + "${OUTPUT}\n" + "\n" + ) + endif() +endif() diff --git a/Source/Checks/cm_cxx11_unordered_map.cpp b/Source/Checks/cm_cxx11_unordered_map.cpp new file mode 100644 index 000000000..beeb31b23 --- /dev/null +++ b/Source/Checks/cm_cxx11_unordered_map.cpp @@ -0,0 +1,6 @@ +#include +int main() { + std::unordered_map map; + map[0] = 0; + return 0; +} diff --git a/Source/cmConfigure.cmake.h.in b/Source/cmConfigure.cmake.h.in index c0a1aa955..62128a793 100644 --- a/Source/cmConfigure.cmake.h.in +++ b/Source/cmConfigure.cmake.h.in @@ -14,4 +14,5 @@ #cmakedefine CMAKE_USE_ELF_PARSER #cmakedefine CMAKE_USE_MACH_PARSER #cmakedefine CMAKE_ENCODING_UTF8 +#cmakedefine CMake_HAVE_CXX11_UNORDERED_MAP #define CMAKE_DATA_DIR "/@CMAKE_DATA_DIR@" diff --git a/Source/cmDefinitions.h b/Source/cmDefinitions.h index b24479352..245a0bdea 100644 --- a/Source/cmDefinitions.h +++ b/Source/cmDefinitions.h @@ -14,8 +14,12 @@ #include "cmStandardIncludes.h" #if defined(CMAKE_BUILD_WITH_CMAKE) +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP +#include +#else #include "cmsys/hash_map.hxx" #endif +#endif #include @@ -65,9 +69,12 @@ private: }; static Def NoDef; - // Local definitions, set or unset. #if defined(CMAKE_BUILD_WITH_CMAKE) +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP + typedef std::unordered_map MapType; +#else typedef cmsys::hash_map MapType; +#endif #else typedef std::map MapType; #endif diff --git a/Source/cmFileTimeComparison.cxx b/Source/cmFileTimeComparison.cxx index 57274708b..13e2a66e0 100644 --- a/Source/cmFileTimeComparison.cxx +++ b/Source/cmFileTimeComparison.cxx @@ -13,8 +13,12 @@ // Use a hash table to avoid duplicate file time checks from disk. #if defined(CMAKE_BUILD_WITH_CMAKE) +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP +#include +#else # include #endif +#endif #include @@ -47,9 +51,17 @@ private: { return h(s.c_str()); } +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP + std::hash h; +#else cmsys::hash h; +#endif }; +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP + typedef std::unordered_map FileStatsMap; FileStatsMap Files; #endif diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 3b2a41f66..c4c98ea08 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -24,7 +24,11 @@ #if defined(CMAKE_BUILD_WITH_CMAKE) # include "cmFileLockPool.h" -# include +# ifdef CMake_HAVE_CXX11_UNORDERED_MAP +# include +# else +# include +# endif #endif class cmake; @@ -429,7 +433,11 @@ protected: // All targets in the entire project. #if defined(CMAKE_BUILD_WITH_CMAKE) +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP + typedef std::unordered_map TargetMap; +#else typedef cmsys::hash_map TargetMap; +#endif #else typedef std::map TargetMap; #endif diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index e0eef6f9e..8271cc272 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -31,7 +31,11 @@ #include #include #if defined(CMAKE_BUILD_WITH_CMAKE) -# include +# ifdef CMake_HAVE_CXX11_UNORDERED_MAP +# include +# else +# include +# endif #endif #include @@ -868,7 +872,11 @@ protected: // libraries, classes, and executables mutable cmTargets Targets; #if defined(CMAKE_BUILD_WITH_CMAKE) +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP + typedef std::unordered_map TargetMap; +#else typedef cmsys::hash_map TargetMap; +#endif #else typedef std::map TargetMap; #endif @@ -1041,7 +1049,11 @@ private: // A map for fast output to input look up. #if defined(CMAKE_BUILD_WITH_CMAKE) +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP + typedef std::unordered_map OutputToSourceMap; +#else typedef cmsys::hash_map OutputToSourceMap; +#endif #else typedef std::map OutputToSourceMap; #endif diff --git a/Source/cmTarget.h b/Source/cmTarget.h index a03241466..f43c87c8e 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -19,7 +19,11 @@ #include #if defined(CMAKE_BUILD_WITH_CMAKE) -#include +# ifdef CMake_HAVE_CXX11_UNORDERED_MAP +# include +# else +# include +# endif #endif #define CM_FOR_EACH_TARGET_POLICY(F) \ @@ -849,7 +853,11 @@ private: }; #ifdef CMAKE_BUILD_WITH_CMAKE -typedef cmsys::hash_map cmTargets; +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP +typedef std::unordered_map cmTargets; +#else +typedef cmsys::hash_map cmTargets; +#endif #else typedef std::map cmTargets; #endif