From 6951f0e4afb03870f069465f8016e76e4ef1ba41 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 12 Oct 2015 13:38:32 +0200 Subject: [PATCH] QCompleter::splitPath(): don't get tangled up in strings - Don't store "\\" as a QString just for passing it to QString:.startsWith() and prepend(). Keep it a QLatin1String. -> one allocation less - Don't use said QString as a flag, use a bool - Don't store QDir::separator() in a QString -> one allocation less -> two indexing operations less - Don't retrieve QDir::separator() from said QString as QString(sep[0]) -> one more allocation less - Don't look for a QChar in a string by using QRegExp; use the QChar overload instead -> one more allocation (at _least_) less - Don't convert QDir::separator() with QDir::fromNativeSeparators(); it will _always_ be '/'... -> one expensive function call less -> two QString allocations less -> one QString(QChar) introduced -> one allocation more -> could be removed with QStringLiteral/QString::fromLatin1Char() Change-Id: I802e66685a95b08cfc557defc63e5f16a7e6306b Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/widgets/util/qcompleter.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/widgets/util/qcompleter.cpp b/src/widgets/util/qcompleter.cpp index 559f024e5f..ba56f004b7 100644 --- a/src/widgets/util/qcompleter.cpp +++ b/src/widgets/util/qcompleter.cpp @@ -1820,26 +1820,23 @@ QStringList QCompleter::splitPath(const QString& path) const return QStringList(completionPrefix()); QString pathCopy = QDir::toNativeSeparators(path); - QString sep = QDir::separator(); #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) if (pathCopy == QLatin1String("\\") || pathCopy == QLatin1String("\\\\")) return QStringList(pathCopy); - QString doubleSlash(QLatin1String("\\\\")); - if (pathCopy.startsWith(doubleSlash)) + const bool startsWithDoubleSlash = pathCopy.startsWith(QLatin1String("\\\\")); + if (startsWithDoubleSlash) pathCopy = pathCopy.mid(2); - else - doubleSlash.clear(); #endif - QRegExp re(QLatin1Char('[') + QRegExp::escape(sep) + QLatin1Char(']')); - QStringList parts = pathCopy.split(re); + const QChar sep = QDir::separator(); + QStringList parts = pathCopy.split(sep); #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) - if (!doubleSlash.isEmpty()) - parts[0].prepend(doubleSlash); + if (startsWithDoubleSlash) + parts[0].prepend(QLatin1String("\\\\")); #else - if (pathCopy[0] == sep[0]) // readd the "/" at the beginning as the split removed it - parts[0] = QDir::fromNativeSeparators(QString(sep[0])); + if (pathCopy[0] == sep) // readd the "/" at the beginning as the split removed it + parts[0] = QLatin1Char('/'); #endif return parts;