/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the qmake application of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** 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 Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef CACHEKEYS_H #define CACHEKEYS_H #include "project.h" #include #include #include #include #include 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 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