diff --git a/src/file/fileindexscheduler.cpp b/src/file/fileindexscheduler.cpp --- a/src/file/fileindexscheduler.cpp +++ b/src/file/fileindexscheduler.cpp @@ -29,6 +29,8 @@ #include "fileindexerconfig.h" +#include + #include #include #include @@ -141,13 +143,11 @@ static void removeStartsWith(QStringList& list, const QString& dir) { - QMutableListIterator it(list); - while (it.hasNext()) { - const QString& file = it.next(); - if (file.startsWith(dir)) { - it.remove(); - } - } + const auto tail = std::remove_if(list.begin(), list.end(), + [&dir](const QString& file) { + return file.startsWith(dir); + }); + list.erase(tail, list.end()); } void FileIndexScheduler::handleFileRemoved(const QString& file) diff --git a/src/file/pendingfilequeue.cpp b/src/file/pendingfilequeue.cpp --- a/src/file/pendingfilequeue.cpp +++ b/src/file/pendingfilequeue.cpp @@ -22,6 +22,8 @@ #include "pendingfilequeue.h" +#include + #include #include @@ -56,17 +58,19 @@ void PendingFileQueue::enqueue(const PendingFile& file) { // If we get an event to remove /home/A, remove all events for everything under /home/A/ + if (file.shouldRemoveIndex() && file.path().endsWith('/')) { - QMutableVectorIterator it(m_cache); - while (it.hasNext()) { - const PendingFile &pf = it.next(); - if (pf.path().startsWith(file.path())) { - m_pendingFiles.remove(pf.path()); - m_recentlyEmitted.remove(pf.path()); - - it.remove(); - } + const auto keepFile = [&file](const PendingFile& pending) { + return !pending.path().startsWith(file.path()); + }; + const auto end = m_cache.end(); + // std::partition moves all matching entries to the first partition + const auto droppedFilesBegin = std::partition(m_cache.begin(), end, keepFile); + for (auto it = droppedFilesBegin; it != end; it++) { + m_pendingFiles.remove(it->path()); + m_recentlyEmitted.remove(it->path()); } + m_cache.erase(droppedFilesBegin, end); } int i = m_cache.indexOf(file);