Utils: Use QStringView in FilePath implementations when it makes sense

Change-Id: I7346d873008f8ff1ab88f298a8d90e41f8c6d0b9
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
hjk
2022-11-16 18:20:45 +01:00
parent fb4e22ff7c
commit e202138fb0
2 changed files with 24 additions and 15 deletions

View File

@@ -242,9 +242,8 @@ QString FilePath::nativePath() const
QString FilePath::fileName() const QString FilePath::fileName() const
{ {
// FIXME: Performance const QStringView fp = pathView();
QString fp = path(); return fp.mid(fp.lastIndexOf('/') + 1).toString();
return fp.mid(fp.lastIndexOf('/') + 1);
} }
QString FilePath::fileNameWithPathComponents(int pathComponents) const QString FilePath::fileNameWithPathComponents(int pathComponents) const
@@ -341,12 +340,17 @@ QStringView FilePath::host() const
return QStringView{m_data}.mid(m_pathLen + m_schemeLen, m_hostLen); return QStringView{m_data}.mid(m_pathLen + m_schemeLen, m_hostLen);
} }
QString FilePath::path() const QStringView FilePath::pathView() const
{ {
QTC_ASSERT(!m_data.startsWith(u"/./"), return m_data.mid(3, m_pathLen - 3)); QTC_ASSERT(!m_data.startsWith(u"/./"), return m_data.mid(3, m_pathLen - 3));
return m_data.left(m_pathLen); return m_data.left(m_pathLen);
} }
QString FilePath::path() const
{
return pathView().toString();
}
void FilePath::setParts(const QStringView scheme, const QStringView host, QStringView path) void FilePath::setParts(const QStringView scheme, const QStringView host, QStringView path)
{ {
QTC_CHECK(!scheme.contains('/')); QTC_CHECK(!scheme.contains('/'));
@@ -913,21 +917,23 @@ bool FilePath::isChildOf(const FilePath &s) const
return false; return false;
if (s.isEmpty()) if (s.isEmpty())
return false; return false;
if (!path().startsWith(s.path(), caseSensitivity())) const QStringView p = pathView();
const QStringView sp = s.pathView();
if (!p.startsWith(sp, caseSensitivity()))
return false; return false;
if (path().size() <= s.path().size()) if (p.size() <= sp.size())
return false; return false;
// s is root, '/' was already tested in startsWith // s is root, '/' was already tested in startsWith
if (s.path().endsWith(QLatin1Char('/'))) if (sp.endsWith(QLatin1Char('/')))
return true; return true;
// s is a directory, next character should be '/' (/tmpdir is NOT a child of /tmp) // s is a directory, next character should be '/' (/tmpdir is NOT a child of /tmp)
return s.path().isEmpty() || path().at(s.path().size()) == QLatin1Char('/'); return sp.isEmpty() || p.at(sp.size()) == QLatin1Char('/');
} }
/// \returns whether path() startsWith \a s /// \returns whether path() startsWith \a s
bool FilePath::startsWith(const QString &s) const bool FilePath::startsWith(const QString &s) const
{ {
return path().startsWith(s, caseSensitivity()); return pathView().startsWith(s, caseSensitivity());
} }
/*! /*!
@@ -936,7 +942,7 @@ bool FilePath::startsWith(const QString &s) const
*/ */
bool FilePath::endsWith(const QString &s) const bool FilePath::endsWith(const QString &s) const
{ {
return path().endsWith(s, caseSensitivity()); return pathView().endsWith(s, caseSensitivity());
} }
/*! /*!
@@ -946,7 +952,8 @@ bool FilePath::endsWith(const QString &s) const
*/ */
bool FilePath::startsWithDriveLetter() const bool FilePath::startsWithDriveLetter() const
{ {
return !needsDevice() && path().size() >= 2 && isWindowsDriveLetter(path()[0]) && path().at(1) == ':'; const QStringView p = pathView();
return !needsDevice() && p.size() >= 2 && isWindowsDriveLetter(p[0]) && p.at(1) == ':';
} }
/*! /*!
@@ -960,7 +967,7 @@ FilePath FilePath::relativeChildPath(const FilePath &parent) const
{ {
FilePath res; FilePath res;
if (isChildOf(parent)) { if (isChildOf(parent)) {
QString p = path().mid(parent.path().size()); QStringView p = pathView().mid(parent.pathView().size());
if (p.startsWith('/')) if (p.startsWith('/'))
p = p.mid(1); p = p.mid(1);
res.setParts(scheme(), host(), p); res.setParts(scheme(), host(), p);
@@ -1462,11 +1469,12 @@ QString FilePath::shortNativePath() const
*/ */
bool FilePath::isRelativePath() const bool FilePath::isRelativePath() const
{ {
if (path().startsWith('/')) const QStringView p = pathView();
if (p.startsWith('/'))
return false; return false;
if (path().size() > 1 && isWindowsDriveLetter(path()[0]) && path().at(1) == ':') if (p.size() > 1 && isWindowsDriveLetter(p[0]) && p.at(1) == ':')
return false; return false;
if (path().startsWith(":/")) // QRC if (p.startsWith(u":/")) // QRC
return false; return false;
return true; return true;
} }

View File

@@ -74,6 +74,7 @@ public:
QStringView scheme() const; QStringView scheme() const;
QStringView host() const; QStringView host() const;
QStringView pathView() const;
QString path() const; QString path() const;
void setParts(const QStringView scheme, const QStringView host, const QStringView path); void setParts(const QStringView scheme, const QStringView host, const QStringView path);