// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #ifndef CACHEKEYS_H #define CACHEKEYS_H #include "option.h" #include "project.h" #include #include #include #include #include QT_BEGIN_NAMESPACE // ------------------------------------------------------------------------------------------------- struct FixStringCacheKey { mutable size_t hash; QString string, pwd; uchar flags; FixStringCacheKey(const QString &s, uchar f) { hash = 0; pwd = qmake_getpwd(); string = s; flags = f; } bool operator==(const FixStringCacheKey &f) const { return (hashCode() == f.hashCode() && f.flags == flags && f.string == string && f.pwd == pwd); } inline size_t hashCode() const { if(!hash) hash = qHash(string) ^ qHash(flags) /*^ qHash(pwd)*/; return hash; } }; inline size_t qHash(const FixStringCacheKey &f) { return f.hashCode(); } // ------------------------------------------------------------------------------------------------- struct FileInfoCacheKey { mutable size_t hash; QString file, pwd; FileInfoCacheKey(const QString &f) { hash = 0; if(isRelativePath(f)) pwd = qmake_getpwd(); file = f; } bool operator==(const FileInfoCacheKey &f) const { return (hashCode() == f.hashCode() && f.file == file && f.pwd == pwd); } inline size_t hashCode() const { if(!hash) hash = qHash(file) /*^ qHash(pwd)*/; return hash; } inline bool isRelativePath(const QString &file) { int length = file.size(); if (!length) return true; const QChar c0 = file.at(0); const QChar c1 = length >= 2 ? file.at(1) : QChar::Null; return !(c0 == QLatin1Char('/') || c0 == QLatin1Char('\\') || (c0.isLetter() && c1 == QLatin1Char(':')) || (c0 == QLatin1Char('/') && c1 == QLatin1Char('/')) || (c0 == QLatin1Char('\\') && c1 == QLatin1Char('\\'))); } }; inline size_t qHash(const FileInfoCacheKey &f) { return f.hashCode(); } // ------------------------------------------------------------------------------------------------- template inline void qmakeDeleteCacheClear(void *i) { delete reinterpret_cast(i); } inline void qmakeFreeCacheClear(void *i) { free(i); } typedef void (*qmakeCacheClearFunc)(void *); void qmakeAddCacheClear(qmakeCacheClearFunc func, void **); void qmakeClearCaches(); QT_END_NAMESPACE #endif // CACHEKEYS_H