summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qdiriterator.cpp
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2020-05-02 23:03:39 +0200
committerMarc Mutz <marc.mutz@kdab.com>2020-05-03 08:16:33 +0200
commit0f2869fcdc0932478c0745bda6e6c70a57b8ad47 (patch)
tree83cca7dd617772eed2306f28dae8e4d402468f8f /src/corelib/io/qdiriterator.cpp
parent1ba42c10bbd2ac1f9a7bb9be0278c41959d7a30b (diff)
QDirIterator: port visitedLinks from QSet to QDuplicateTracker
Apart from a more fitting, minimal, API, QDuplicateTracker also transparently uses C++17 pmr::monotonic_buffer_resource to avoid, or at least reduce, memory allocations. The old code performed the visitedLinks check unconditionally, but since we add entries to visitedLinks only when following symlinks (and this property cannot be changed under iteration, as `iteratorFlags` is a const member), the new code only performs the check conditionally, with unchanged semantics. Change-Id: Ia2c2dda16136ef5256e2c345b8ecba530883ee37 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/io/qdiriterator.cpp')
-rw-r--r--src/corelib/io/qdiriterator.cpp14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp
index f6d337bb74..7128435aa4 100644
--- a/src/corelib/io/qdiriterator.cpp
+++ b/src/corelib/io/qdiriterator.cpp
@@ -108,6 +108,7 @@
#include <QtCore/private/qfilesystemmetadata_p.h>
#include <QtCore/private/qfilesystemengine_p.h>
#include <QtCore/private/qfileinfo_p.h>
+#include <QtCore/private/qduplicatetracker_p.h>
#include <memory>
@@ -159,7 +160,7 @@ public:
QFileInfo nextFileInfo;
// Loop protection
- QSet<QString> visitedLinks;
+ QDuplicateTracker<QString> visitedLinks;
};
/*!
@@ -210,12 +211,11 @@ void QDirIteratorPrivate::pushDirectory(const QFileInfo &fileInfo)
path = fileInfo.canonicalFilePath();
#endif
- // Stop link loops
- if (visitedLinks.contains(fileInfo.canonicalFilePath()))
- return;
-
- if (iteratorFlags & QDirIterator::FollowSymlinks)
- visitedLinks << fileInfo.canonicalFilePath();
+ if ((iteratorFlags & QDirIterator::FollowSymlinks)) {
+ // Stop link loops
+ if (visitedLinks.hasSeen(fileInfo.canonicalFilePath()))
+ return;
+ }
if (engine) {
engine->setFileName(path);