From 61c9b8bb28bb6696279f22e9467631804262b94f Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Mon, 5 Feb 2024 00:54:31 +0200 Subject: [PATCH] QDirListing: minor code cleanup Change-Id: I37144958c67dd116972e2822868e29684c406757 Reviewed-by: Thiago Macieira --- src/corelib/io/qdirlisting.cpp | 63 +++++++++++++++++----------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/src/corelib/io/qdirlisting.cpp b/src/corelib/io/qdirlisting.cpp index f0eb2c4559..ae9d808abc 100644 --- a/src/corelib/io/qdirlisting.cpp +++ b/src/corelib/io/qdirlisting.cpp @@ -133,11 +133,10 @@ void QDirListingPrivate::init(bool resolveEngine = true) #if QT_CONFIG(regularexpression) nameRegExps.reserve(nameFilters.size()); - for (const auto &filter : nameFilters) { - auto re = QRegularExpression::fromWildcard(filter, (filters & QDir::CaseSensitive ? - Qt::CaseSensitive : Qt::CaseInsensitive)); - nameRegExps.append(re); - } + const auto cs = filters.testAnyFlags(QDir::CaseSensitive) ? Qt::CaseSensitive + : Qt::CaseInsensitive; + for (const auto &filter : nameFilters) + nameRegExps.emplace_back(QRegularExpression::fromWildcard(filter, cs)); #endif if (resolveEngine) @@ -149,12 +148,14 @@ void QDirListingPrivate::init(bool resolveEngine = true) void QDirListingPrivate::pushDirectory(QDirEntryInfo &entryInfo) { - QString path = entryInfo.filePath(); - + const QString path = [&entryInfo] { #ifdef Q_OS_WIN - if (entryInfo.isSymLink()) - path = entryInfo.canonicalFilePath(); + if (entryInfo.isSymLink()) + return entryInfo.canonicalFilePath(); #endif + return entryInfo.filePath(); + }(); + if (iteratorFlags.testAnyFlags(QDirListing::IteratorFlag::FollowSymlinks)) { // Stop link loops @@ -300,16 +301,12 @@ bool QDirListingPrivate::matchesFilters(QDirEntryInfo &entryInfo) const // name filter #if QT_CONFIG(regularexpression) - // Pass all entries through name filters, except dirs if the AllDirs - if (!nameFilters.isEmpty() && !(filters.testAnyFlags(QDir::AllDirs) && entryInfo.isDir())) { - bool matched = false; - for (const auto &re : nameRegExps) { - if (re.match(fileName).hasMatch()) { - matched = true; - break; - } - } - if (!matched) + // Pass all entries through name filters, except dirs if AllDirs is set + if (!nameRegExps.isEmpty() && !(filters.testAnyFlags(QDir::AllDirs) && entryInfo.isDir())) { + auto regexMatchesName = [&fileName](const auto &re) { + return re.match(fileName).hasMatch(); + }; + if (std::none_of(nameRegExps.cbegin(), nameRegExps.cend(), regexMatchesName)) return false; } #endif @@ -328,9 +325,12 @@ bool QDirListingPrivate::matchesFilters(QDirEntryInfo &entryInfo) const return false; // filter system files - if (!includeSystem && (!(entryInfo.isFile() || entryInfo.isDir() || entryInfo.isSymLink()) - || (!entryInfo.exists() && entryInfo.isSymLink()))) - return false; + if (!includeSystem) { + if (!entryInfo.isFile() && !entryInfo.isDir() && !entryInfo.isSymLink()) + return false; + if (entryInfo.isSymLink() && !entryInfo.exists()) + return false; + } // skip directories const bool skipDirs = !(filters & (QDir::Dirs | QDir::AllDirs)); @@ -344,16 +344,17 @@ bool QDirListingPrivate::matchesFilters(QDirEntryInfo &entryInfo) const return false; // filter permissions - const bool filterPermissions = ((filters & QDir::PermissionMask) - && (filters & QDir::PermissionMask) != QDir::PermissionMask); - const bool doWritable = !filterPermissions || (filters & QDir::Writable); - const bool doExecutable = !filterPermissions || (filters & QDir::Executable); - const bool doReadable = !filterPermissions || (filters & QDir::Readable); - if (filterPermissions - && ((doReadable && !entryInfo.isReadable()) + const auto perms = filters & QDir::PermissionMask; + const bool filterPermissions = perms != 0 && perms != QDir::PermissionMask; + if (filterPermissions) { + const bool doWritable = filters.testAnyFlags(QDir::Writable); + const bool doExecutable = filters.testAnyFlags(QDir::Executable); + const bool doReadable = filters.testAnyFlags(QDir::Readable); + if ((doReadable && !entryInfo.isReadable()) || (doWritable && !entryInfo.isWritable()) - || (doExecutable && !entryInfo.isExecutable()))) { - return false; + || (doExecutable && !entryInfo.isExecutable())) { + return false; + } } return true;