Use a std::vector instead of a QVector in QMimeDatabasePrivate
Using std::vector saves a bit c++ code when using range-for loop over the vector. Besides, no shared copies created anymore which is a bit faster. Change-Id: I564306ed9ac907e9f32f59b33ed15c027a59b4eb Reviewed-by: David Faure <david.faure@kdab.com>
This commit is contained in:
parent
0e1866017f
commit
09e926cc27
@ -109,8 +109,8 @@ void QMimeDatabasePrivate::loadProviders()
|
|||||||
mimeDirs.prepend(QLatin1String(":/qt-project.org/qmime"));
|
mimeDirs.prepend(QLatin1String(":/qt-project.org/qmime"));
|
||||||
//qDebug() << "mime dirs:" << mimeDirs;
|
//qDebug() << "mime dirs:" << mimeDirs;
|
||||||
|
|
||||||
QVector<QMimeProviderBase *> currentProviders = m_providers;
|
Providers currentProviders;
|
||||||
m_providers.clear();
|
std::swap(m_providers, currentProviders);
|
||||||
m_providers.reserve(mimeDirs.size());
|
m_providers.reserve(mimeDirs.size());
|
||||||
for (const QString &mimeDir : qAsConst(mimeDirs)) {
|
for (const QString &mimeDir : qAsConst(mimeDirs)) {
|
||||||
const QString cacheFile = mimeDir + QStringLiteral("/mime.cache");
|
const QString cacheFile = mimeDir + QStringLiteral("/mime.cache");
|
||||||
@ -133,7 +133,7 @@ void QMimeDatabasePrivate::loadProviders()
|
|||||||
provider = new QMimeXMLProvider(this, mimeDir);
|
provider = new QMimeXMLProvider(this, mimeDir);
|
||||||
//qDebug() << "Created XML provider for" << mimeDir;
|
//qDebug() << "Created XML provider for" << mimeDir;
|
||||||
}
|
}
|
||||||
m_providers.append(provider);
|
m_providers.push_back(provider);
|
||||||
} else {
|
} else {
|
||||||
QMimeProviderBase *provider = *it;
|
QMimeProviderBase *provider = *it;
|
||||||
currentProviders.erase(it);
|
currentProviders.erase(it);
|
||||||
@ -143,18 +143,18 @@ void QMimeDatabasePrivate::loadProviders()
|
|||||||
provider = new QMimeXMLProvider(this, mimeDir);
|
provider = new QMimeXMLProvider(this, mimeDir);
|
||||||
//qDebug() << "Created XML provider to replace binary provider for" << mimeDir;
|
//qDebug() << "Created XML provider to replace binary provider for" << mimeDir;
|
||||||
}
|
}
|
||||||
m_providers.append(provider);
|
m_providers.push_back(provider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qDeleteAll(currentProviders);
|
qDeleteAll(currentProviders);
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<QMimeProviderBase *> QMimeDatabasePrivate::providers()
|
const QMimeDatabasePrivate::Providers &QMimeDatabasePrivate::providers()
|
||||||
{
|
{
|
||||||
#ifndef Q_OS_WASM // stub implementation always returns true
|
#ifndef Q_OS_WASM // stub implementation always returns true
|
||||||
Q_ASSERT(!mutex.tryLock()); // caller should have locked mutex
|
Q_ASSERT(!mutex.tryLock()); // caller should have locked mutex
|
||||||
#endif
|
#endif
|
||||||
if (m_providers.isEmpty()) {
|
if (m_providers.empty()) {
|
||||||
loadProviders();
|
loadProviders();
|
||||||
m_lastCheck.start();
|
m_lastCheck.start();
|
||||||
} else {
|
} else {
|
||||||
@ -166,8 +166,7 @@ QVector<QMimeProviderBase *> QMimeDatabasePrivate::providers()
|
|||||||
|
|
||||||
QString QMimeDatabasePrivate::resolveAlias(const QString &nameOrAlias)
|
QString QMimeDatabasePrivate::resolveAlias(const QString &nameOrAlias)
|
||||||
{
|
{
|
||||||
const auto allProviders = providers();
|
for (const auto &provider : providers()) {
|
||||||
for (QMimeProviderBase *provider : allProviders) {
|
|
||||||
const QString ret = provider->resolveAlias(nameOrAlias);
|
const QString ret = provider->resolveAlias(nameOrAlias);
|
||||||
if (!ret.isEmpty())
|
if (!ret.isEmpty())
|
||||||
return ret;
|
return ret;
|
||||||
@ -181,9 +180,8 @@ QString QMimeDatabasePrivate::resolveAlias(const QString &nameOrAlias)
|
|||||||
*/
|
*/
|
||||||
QMimeType QMimeDatabasePrivate::mimeTypeForName(const QString &nameOrAlias)
|
QMimeType QMimeDatabasePrivate::mimeTypeForName(const QString &nameOrAlias)
|
||||||
{
|
{
|
||||||
const auto allProviders = providers();
|
|
||||||
const QString mimeName = resolveAlias(nameOrAlias);
|
const QString mimeName = resolveAlias(nameOrAlias);
|
||||||
for (QMimeProviderBase *provider : allProviders) {
|
for (const auto &provider : providers()) {
|
||||||
const QMimeType mime = provider->mimeTypeForName(mimeName);
|
const QMimeType mime = provider->mimeTypeForName(mimeName);
|
||||||
if (mime.isValid())
|
if (mime.isValid())
|
||||||
return mime;
|
return mime;
|
||||||
@ -207,8 +205,7 @@ QMimeGlobMatchResult QMimeDatabasePrivate::findByFileName(const QString &fileNam
|
|||||||
{
|
{
|
||||||
QMimeGlobMatchResult result;
|
QMimeGlobMatchResult result;
|
||||||
// TODO this parses in the order (local, global). Check that it handles "NOGLOBS" correctly.
|
// TODO this parses in the order (local, global). Check that it handles "NOGLOBS" correctly.
|
||||||
const auto allProviders = providers();
|
for (const auto &provider : providers())
|
||||||
for (QMimeProviderBase *provider : allProviders)
|
|
||||||
provider->addFileNameMatches(fileName, result);
|
provider->addFileNameMatches(fileName, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -229,8 +226,7 @@ void QMimeDatabasePrivate::loadGenericIcon(QMimeTypePrivate &mimePrivate)
|
|||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
if (mimePrivate.fromCache) {
|
if (mimePrivate.fromCache) {
|
||||||
mimePrivate.genericIconName.clear();
|
mimePrivate.genericIconName.clear();
|
||||||
const auto allProviders = providers();
|
for (const auto &provider : providers()) {
|
||||||
for (QMimeProviderBase *provider : allProviders) {
|
|
||||||
provider->loadGenericIcon(mimePrivate);
|
provider->loadGenericIcon(mimePrivate);
|
||||||
if (!mimePrivate.genericIconName.isEmpty())
|
if (!mimePrivate.genericIconName.isEmpty())
|
||||||
break;
|
break;
|
||||||
@ -243,8 +239,7 @@ void QMimeDatabasePrivate::loadIcon(QMimeTypePrivate &mimePrivate)
|
|||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
if (mimePrivate.fromCache) {
|
if (mimePrivate.fromCache) {
|
||||||
mimePrivate.iconName.clear();
|
mimePrivate.iconName.clear();
|
||||||
const auto allProviders = providers();
|
for (const auto &provider : providers()) {
|
||||||
for (QMimeProviderBase *provider : allProviders) {
|
|
||||||
provider->loadIcon(mimePrivate);
|
provider->loadIcon(mimePrivate);
|
||||||
if (!mimePrivate.iconName.isEmpty())
|
if (!mimePrivate.iconName.isEmpty())
|
||||||
break;
|
break;
|
||||||
@ -278,8 +273,7 @@ QStringList QMimeDatabasePrivate::parents(const QString &mimeName)
|
|||||||
{
|
{
|
||||||
Q_ASSERT(!mutex.tryLock());
|
Q_ASSERT(!mutex.tryLock());
|
||||||
QStringList result;
|
QStringList result;
|
||||||
const auto allProviders = providers();
|
for (const auto &provider : providers())
|
||||||
for (QMimeProviderBase *provider : allProviders)
|
|
||||||
provider->addParents(mimeName, result);
|
provider->addParents(mimeName, result);
|
||||||
if (result.isEmpty()) {
|
if (result.isEmpty()) {
|
||||||
const QString parent = fallbackParent(mimeName);
|
const QString parent = fallbackParent(mimeName);
|
||||||
@ -293,8 +287,7 @@ QStringList QMimeDatabasePrivate::listAliases(const QString &mimeName)
|
|||||||
{
|
{
|
||||||
QMutexLocker locker(&mutex);
|
QMutexLocker locker(&mutex);
|
||||||
QStringList result;
|
QStringList result;
|
||||||
const auto allProviders = providers();
|
for (const auto &provider : providers())
|
||||||
for (QMimeProviderBase *provider : allProviders)
|
|
||||||
provider->addAliases(mimeName, result);
|
provider->addAliases(mimeName, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -333,8 +326,7 @@ QMimeType QMimeDatabasePrivate::findByData(const QByteArray &data, int *accuracy
|
|||||||
|
|
||||||
*accuracyPtr = 0;
|
*accuracyPtr = 0;
|
||||||
QMimeType candidate;
|
QMimeType candidate;
|
||||||
const auto allProviders = providers();
|
for (const auto &provider : providers())
|
||||||
for (QMimeProviderBase *provider : allProviders)
|
|
||||||
provider->findByMagic(data, accuracyPtr, candidate);
|
provider->findByMagic(data, accuracyPtr, candidate);
|
||||||
|
|
||||||
if (candidate.isValid())
|
if (candidate.isValid())
|
||||||
@ -416,8 +408,7 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFileNameAndData(const QString &fileNa
|
|||||||
QList<QMimeType> QMimeDatabasePrivate::allMimeTypes()
|
QList<QMimeType> QMimeDatabasePrivate::allMimeTypes()
|
||||||
{
|
{
|
||||||
QList<QMimeType> result;
|
QList<QMimeType> result;
|
||||||
const auto allProviders = providers();
|
for (const auto &provider : providers())
|
||||||
for (QMimeProviderBase *provider : allProviders)
|
|
||||||
provider->addAllMimeTypes(result);
|
provider->addAllMimeTypes(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -102,11 +102,12 @@ public:
|
|||||||
bool mimeInherits(const QString &mime, const QString &parent);
|
bool mimeInherits(const QString &mime, const QString &parent);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QVector<QMimeProviderBase *> providers();
|
using Providers = std::vector<QMimeProviderBase *>;
|
||||||
|
const Providers &providers();
|
||||||
bool shouldCheck();
|
bool shouldCheck();
|
||||||
void loadProviders();
|
void loadProviders();
|
||||||
|
|
||||||
mutable QVector<QMimeProviderBase *> m_providers;
|
mutable Providers m_providers;
|
||||||
QElapsedTimer m_lastCheck;
|
QElapsedTimer m_lastCheck;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -35,6 +35,7 @@ class tst_QMimeDatabase: public QObject
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void inheritsPerformance();
|
void inheritsPerformance();
|
||||||
|
void benchMimeTypeForName();
|
||||||
};
|
};
|
||||||
|
|
||||||
void tst_QMimeDatabase::inheritsPerformance()
|
void tst_QMimeDatabase::inheritsPerformance()
|
||||||
@ -70,5 +71,15 @@ void tst_QMimeDatabase::inheritsPerformance()
|
|||||||
// parsing XML, and then keeps being around 4.5 MB for all the in-memory hashes.
|
// parsing XML, and then keeps being around 4.5 MB for all the in-memory hashes.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QMimeDatabase::benchMimeTypeForName()
|
||||||
|
{
|
||||||
|
QMimeDatabase db;
|
||||||
|
|
||||||
|
QBENCHMARK {
|
||||||
|
const auto s = db.mimeTypeForName(QStringLiteral("text/plain"));
|
||||||
|
QVERIFY(s.isValid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_QMimeDatabase)
|
QTEST_MAIN(tst_QMimeDatabase)
|
||||||
#include "main.moc"
|
#include "main.moc"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user