summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIgor Kushnir <igorkuo@gmail.com>2021-12-12 12:32:45 +0200
committerIgor Kushnir <igorkuo@gmail.com>2021-12-21 21:21:50 +0200
commit0dbbda670d1e9f79d85edc1599315943d9eec33a (patch)
treebd33abbddc0fba2aea43aaccb60705ae06cf6404 /src
parent11409f4c023d7a9596ab5c0ca98256f650be9a90 (diff)
QMimeDatabasePrivate: deduplicate QStringLiteral
defaultMimeType() cannot be moved out of the class and defined in qmimedatabase.cpp, because it is called from QMimeType::isDefault() in qmimetype.cpp. Return m_defaultMimeType constant by reference rather than by value from the inline helper function. This eliminates useless copying of QString when calling code needs only a reference, and so improves performance. Even though m_defaultMimeType is initialized with a QStringLiteral and its QArrayDataPointer has d == nullptr, QArrayDataPointer's ref() and deref() still have to compare d with nullptr to decide that no reference count manipulation is needed. Compilers might be unable to reorder these checks with surrounding code because they guard reference count manipulation. Branch misprediction could further harm performance. Optimizing these checks out can be difficult for compilers. Change-Id: I3ffa0fdc5ad948452301dd9688073b5323a7983b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/mimetypes/qmimedatabase.cpp31
-rw-r--r--src/corelib/mimetypes/qmimedatabase_p.h5
2 files changed, 23 insertions, 13 deletions
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp
index 7e4150c1b6..aa24ed4dcf 100644
--- a/src/corelib/mimetypes/qmimedatabase.cpp
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -61,6 +61,15 @@
QT_BEGIN_NAMESPACE
+static QString directoryMimeType()
+{
+ return QStringLiteral("inode/directory");
+}
+static QString plainTextMimeType()
+{
+ return QStringLiteral("text/plain");
+}
+
Q_GLOBAL_STATIC(QMimeDatabasePrivate, staticQMimeDatabase)
QMimeDatabasePrivate *QMimeDatabasePrivate::instance()
@@ -205,7 +214,7 @@ QMimeType QMimeDatabasePrivate::mimeTypeForName(const QString &nameOrAlias)
QStringList QMimeDatabasePrivate::mimeTypeForFileName(const QString &fileName)
{
if (fileName.endsWith(QLatin1Char('/')))
- return QStringList() << QStringLiteral("inode/directory");
+ return { directoryMimeType() };
const QMimeGlobMatchResult result = findByFileName(fileName);
QStringList matchingMimeTypes = result.m_matchingMimeTypes;
@@ -272,18 +281,18 @@ void QMimeDatabasePrivate::loadIcon(QMimeTypePrivate &mimePrivate)
}
}
-static QString fallbackParent(const QString &mimeTypeName)
+QString QMimeDatabasePrivate::fallbackParent(const QString &mimeTypeName) const
{
const QStringView myGroup = QStringView{mimeTypeName}.left(mimeTypeName.indexOf(QLatin1Char('/')));
// All text/* types are subclasses of text/plain.
- if (myGroup == QLatin1String("text") && mimeTypeName != QLatin1String("text/plain"))
- return QStringLiteral("text/plain");
+ if (myGroup == QLatin1String("text") && mimeTypeName != plainTextMimeType())
+ return plainTextMimeType();
// All real-file mimetypes implicitly derive from application/octet-stream
if (myGroup != QLatin1String("inode") &&
// ignore non-file extensions
myGroup != QLatin1String("all") && myGroup != QLatin1String("fonts") && myGroup != QLatin1String("print") && myGroup != QLatin1String("uri")
- && mimeTypeName != QLatin1String("application/octet-stream")) {
- return QStringLiteral("application/octet-stream");
+ && mimeTypeName != defaultMimeType()) {
+ return defaultMimeType();
}
return QString();
}
@@ -359,7 +368,7 @@ QMimeType QMimeDatabasePrivate::findByData(const QByteArray &data, int *accuracy
if (isTextFile(data)) {
*accuracyPtr = 5;
- return mimeTypeForName(QStringLiteral("text/plain"));
+ return mimeTypeForName(plainTextMimeType());
}
return mimeTypeForName(defaultMimeType());
@@ -469,7 +478,7 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFile(const QString &fileName,
QT_STATBUF statBuffer;
if (QT_STAT(nativeFilePath.constData(), &statBuffer) == 0) {
if (S_ISDIR(statBuffer.st_mode))
- return mimeTypeForName(QStringLiteral("inode/directory"));
+ return mimeTypeForName(directoryMimeType());
if (S_ISCHR(statBuffer.st_mode))
return mimeTypeForName(QStringLiteral("inode/chardevice"));
if (S_ISBLK(statBuffer.st_mode))
@@ -482,7 +491,7 @@ QMimeType QMimeDatabasePrivate::mimeTypeForFile(const QString &fileName,
#else
const bool isDirectory = fileInfo ? fileInfo->isDir() : QFileInfo(fileName).isDir();
if (isDirectory)
- return mimeTypeForName(QStringLiteral("inode/directory"));
+ return mimeTypeForName(directoryMimeType());
#endif
switch (mode) {
@@ -764,7 +773,7 @@ QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, QIO
QMutexLocker locker(&d->mutex);
if (fileName.endsWith(QLatin1Char('/')))
- return d->mimeTypeForName(QStringLiteral("inode/directory"));
+ return d->mimeTypeForName(directoryMimeType());
const bool openedByUs = !device->isOpen() && device->open(QIODevice::ReadOnly);
const QMimeType result = d->mimeTypeForFileNameAndData(fileName, device);
@@ -794,7 +803,7 @@ QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, con
QMutexLocker locker(&d->mutex);
if (fileName.endsWith(QLatin1Char('/')))
- return d->mimeTypeForName(QStringLiteral("inode/directory"));
+ return d->mimeTypeForName(directoryMimeType());
QBuffer buffer(const_cast<QByteArray *>(&data));
buffer.open(QIODevice::ReadOnly);
diff --git a/src/corelib/mimetypes/qmimedatabase_p.h b/src/corelib/mimetypes/qmimedatabase_p.h
index ba5997e943..4f19c9b9da 100644
--- a/src/corelib/mimetypes/qmimedatabase_p.h
+++ b/src/corelib/mimetypes/qmimedatabase_p.h
@@ -84,7 +84,7 @@ public:
static QMimeDatabasePrivate *instance();
- inline QString defaultMimeType() const { return m_defaultMimeType; }
+ const QString &defaultMimeType() const { return m_defaultMimeType; }
bool inherits(const QString &mime, const QString &parent);
@@ -114,12 +114,13 @@ private:
const Providers &providers();
bool shouldCheck();
void loadProviders();
+ QString fallbackParent(const QString &mimeTypeName) const;
+ const QString m_defaultMimeType;
mutable Providers m_providers;
QElapsedTimer m_lastCheck;
public:
- const QString m_defaultMimeType;
QMutex mutex;
};