From b0a6caf84b0a674aaeb4dd5308d980911a8b1ff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Fri, 5 Aug 2011 10:40:46 +0200 Subject: [PATCH] Avoid spurious detaching in QDir::to/fromNativeSeparators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new code avoids non-const detaching operations until needed and uses a pointer into the "raw" QChar data from then on, thus skipping unneeded checks on the reference count for further detaching. These functions are used all the time by the file system classes so this small optimization won't hurt. In particular, it will help users who already use '/' when passing paths into Qt. Reviewed-by: Peter Hartmann (cherry picked from commit 773a6df46243831dee7559f90e33d7eff3c5c71e) Change-Id: I27787e787b544a63c9ea1e4138bd548500104dff Reviewed-by: João Abecasis --- src/corelib/io/qdir.cpp | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index 60a3d78fc4..68da6283cf 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -794,14 +794,23 @@ QString QDir::convertSeparators(const QString &pathName) */ QString QDir::toNativeSeparators(const QString &pathName) { - QString n(pathName); #if defined(Q_FS_FAT) || defined(Q_OS_OS2EMX) || defined(Q_OS_SYMBIAN) - for (int i = 0; i < (int)n.length(); ++i) { - if (n[i] == QLatin1Char('/')) - n[i] = QLatin1Char('\\'); + int i = pathName.indexOf(QLatin1Char('/')); + if (i != -1) { + QString n(pathName); + + QChar * const data = n.data(); + data[i++] = QLatin1Char('\\'); + + for (; i < n.length(); ++i) { + if (data[i] == QLatin1Char('/')) + data[i] = QLatin1Char('\\'); + } + + return n; } #endif - return n; + return pathName; } /*! @@ -818,14 +827,23 @@ QString QDir::toNativeSeparators(const QString &pathName) */ QString QDir::fromNativeSeparators(const QString &pathName) { - QString n(pathName); #if defined(Q_FS_FAT) || defined(Q_OS_OS2EMX) || defined(Q_OS_SYMBIAN) - for (int i = 0; i < (int)n.length(); ++i) { - if (n[i] == QLatin1Char('\\')) - n[i] = QLatin1Char('/'); + int i = pathName.indexOf(QLatin1Char('\\')); + if (i != -1) { + QString n(pathName); + + QChar * const data = n.data(); + data[i++] = QLatin1Char('/'); + + for (; i < n.length(); ++i) { + if (data[i] == QLatin1Char('\\')) + data[i] = QLatin1Char('/'); + } + + return n; } #endif - return n; + return pathName; } /*!