/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the qmake application of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef CACHEKEYS_H #define CACHEKEYS_H #include "project.h" #include <qstring.h> #include <qstringlist.h> #include <qfile.h> #include <qfileinfo.h> #include <qhash.h> QT_BEGIN_NAMESPACE // ------------------------------------------------------------------------------------------------- struct FixStringCacheKey { mutable uint 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 uint hashCode() const { if(!hash) hash = qHash(string) ^ qHash(flags) /*^ qHash(pwd)*/; return hash; } }; inline uint qHash(const FixStringCacheKey &f) { return f.hashCode(); } // ------------------------------------------------------------------------------------------------- struct FileInfoCacheKey { mutable uint 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 uint hashCode() const { if(!hash) hash = qHash(file) /*^ qHash(pwd)*/; return hash; } inline bool isRelativePath(const QString &file) { int length = file.length(); if (!length) return true; const QChar c0 = file.at(0); const QChar c1 = length >= 2 ? file.at(1) : QChar(0); return !(c0 == QLatin1Char('/') || c0 == QLatin1Char('\\') || (c0.isLetter() && c1 == QLatin1Char(':')) || (c0 == QLatin1Char('/') && c1 == QLatin1Char('/')) || (c0 == QLatin1Char('\\') && c1 == QLatin1Char('\\'))); } }; inline uint qHash(const FileInfoCacheKey &f) { return f.hashCode(); } // ------------------------------------------------------------------------------------------------- template <typename T> inline void qmakeDeleteCacheClear(void *i) { delete reinterpret_cast<T*>(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