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:
Ivan Komissarov 2018-09-25 21:49:05 +03:00
parent 0e1866017f
commit 09e926cc27
3 changed files with 29 additions and 26 deletions

View File

@ -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;
} }

View File

@ -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:

View File

@ -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"