From 13f574bfb24e5e483d97254f78724a13a8076021 Mon Sep 17 00:00:00 2001 From: Maarten ter Huurne Date: Wed, 13 Aug 2014 07:35:29 +0200 Subject: [PATCH] Avoid moving around entries unless new ones were found When scanning multiple directories in succession, it's possible that in some of them no matches are found. Avoid moving all pre-existing entries back and forth in that case. Also use move instead of copy for transferring the pre-existing entries from the vector to the set. --- src/filelister.cpp | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/filelister.cpp b/src/filelister.cpp index d7f3e82..2ba6950 100644 --- a/src/filelister.cpp +++ b/src/filelister.cpp @@ -74,14 +74,10 @@ static void moveNames(set&& from, vector& to) void FileLister::browse(const string& path, bool clean) { - set directorySet; - set fileSet; - if (!clean) { - directorySet.insert(directories.begin(), directories.end()); - fileSet.insert(files.begin(), files.end()); + if (clean) { + directories.clear(); + files.clear(); } - directories.clear(); - files.clear(); string slashedPath = path; if (path[path.length() - 1] != '/') @@ -93,6 +89,9 @@ void FileLister::browse(const string& path, bool clean) return; } + set directorySet; + set fileSet; + while (struct dirent *dptr = readdir(dirp)) { string file = dptr->d_name; @@ -155,8 +154,21 @@ void FileLister::browse(const string& path, bool clean) closedir(dirp); - moveNames(move(directorySet), directories); - moveNames(move(fileSet), files); + if (!directorySet.empty()) { + for (string& dir : directories) { + directorySet.emplace(move(dir)); + } + directories.clear(); + moveNames(move(directorySet), directories); + } + + if (!fileSet.empty()) { + for (string& file : files) { + fileSet.emplace(move(file)); + } + files.clear(); + moveNames(move(fileSet), files); + } } unsigned int FileLister::size()