| /**************************************************************************** |
| ** |
| ** 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 |