diff options
author | Brad King <brad.king@kitware.com> | 2022-11-06 13:33:10 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-11-06 13:33:10 (GMT) |
commit | 0d35f598d9841a944e030c0b9a5e6439ca0f8674 (patch) | |
tree | 7d8e4af2b8dd97c619839ecfccc601c4f137caaf /Source/kwsys/SystemTools.cxx | |
parent | b46f582bc399211dc0b4dbda8d2b57d8d1cd59a8 (diff) | |
parent | ee9c09548cf4fa8c7edf0eb53494367fc17c859a (diff) | |
download | CMake-0d35f598d9841a944e030c0b9a5e6439ca0f8674.zip CMake-0d35f598d9841a944e030c0b9a5e6439ca0f8674.tar.gz CMake-0d35f598d9841a944e030c0b9a5e6439ca0f8674.tar.bz2 |
Merge branch 'upstream-KWSys' into update-kwsys
# By KWSys Upstream
* upstream-KWSys:
KWSys 2022-11-06 (9aebb97f)
Diffstat (limited to 'Source/kwsys/SystemTools.cxx')
-rw-r--r-- | Source/kwsys/SystemTools.cxx | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx index a20901c..fdd6b2d 100644 --- a/Source/kwsys/SystemTools.cxx +++ b/Source/kwsys/SystemTools.cxx @@ -36,6 +36,7 @@ #ifdef _WIN32 # include <cwchar> +# include <unordered_map> #endif // Work-around CMake dependency scanning limitation. This must @@ -506,16 +507,39 @@ public: }; #ifdef _WIN32 -struct SystemToolsPathCaseCmp +# if defined(_WIN64) +static constexpr size_t FNV_OFFSET_BASIS = 14695981039346656037ULL; +static constexpr size_t FNV_PRIME = 1099511628211ULL; +# else +static constexpr size_t FNV_OFFSET_BASIS = 2166136261U; +static constexpr size_t FNV_PRIME = 16777619U; +# endif + +// Case insensitive Fnv1a hash +struct SystemToolsPathCaseHash +{ + size_t operator()(std::string const& path) const + { + size_t hash = FNV_OFFSET_BASIS; + for (auto c : path) { + hash ^= static_cast<size_t>(std::tolower(c)); + hash *= FNV_PRIME; + } + + return hash; + } +}; + +struct SystemToolsPathCaseEqual { bool operator()(std::string const& l, std::string const& r) const { # ifdef _MSC_VER - return _stricmp(l.c_str(), r.c_str()) < 0; + return _stricmp(l.c_str(), r.c_str()) == 0; # elif defined(__GNUC__) - return strcasecmp(l.c_str(), r.c_str()) < 0; + return strcasecmp(l.c_str(), r.c_str()) == 0; # else - return SystemTools::Strucmp(l.c_str(), r.c_str()) < 0; + return SystemTools::Strucmp(l.c_str(), r.c_str()) == 0; # endif } }; @@ -540,8 +564,12 @@ public: bool const cache); static std::string GetActualCaseForPathCached(std::string const& path); static const char* GetEnvBuffered(const char* key); - std::map<std::string, std::string, SystemToolsPathCaseCmp> FindFileMap; - std::map<std::string, std::string, SystemToolsPathCaseCmp> PathCaseMap; + std::unordered_map<std::string, std::string, SystemToolsPathCaseHash, + SystemToolsPathCaseEqual> + FindFileMap; + std::unordered_map<std::string, std::string, SystemToolsPathCaseHash, + SystemToolsPathCaseEqual> + PathCaseMap; std::map<std::string, std::string> EnvMap; #endif #ifdef __CYGWIN__ |