]> cloud.milkyroute.net Git - dolphin.git/commitdiff
[FileItemRolesUpdater] Use STL-style iterator instead of iterating a copy
authorStefan Brüns <stefan.bruens@rwth-aachen.de>
Mon, 15 Feb 2021 16:40:17 +0000 (17:40 +0100)
committerStefan Brüns <stefan.bruens@rwth-aachen.de>
Mon, 15 Feb 2021 16:40:17 +0000 (17:40 +0100)
QSet<T>::erase(it) is the save way of erasing from a QSet while iterating
it. This saves creating a copy of the QSet, lookup of a node by value in
`QSet<T>::remove(item)`, and repeated rehashing caused by `remove`.

src/kitemviews/kfileitemmodelrolesupdater.cpp

index d18387f512d6e8a3b253d47f6163ebd942489eaa..46176638e9114fe642d142000f7c9d0d426c7427 100644 (file)
@@ -957,15 +957,17 @@ void KFileItemModelRolesUpdater::updateChangedItems()
     visibleChangedIndexes.reserve(m_changedItems.size());
     invisibleChangedIndexes.reserve(m_changedItems.size());
 
-    // Iterate over a const copy because items are deleted within the loop
-    const auto changedItems = m_changedItems;
-    for (const KFileItem &item : changedItems) {
+    auto oldsize = m_changedItems.size();
+    auto changedItemsIt = m_changedItems.begin();
+    while (changedItemsIt != m_changedItems.end()) {
+        const auto& item = *changedItemsIt;
         const int index = m_model->index(item);
 
         if (index < 0) {
-            m_changedItems.remove(item);
+            changedItemsIt = m_changedItems.erase(changedItemsIt);
             continue;
         }
+        ++changedItemsIt;
 
         if (index >= m_firstVisibleIndex && index <= m_lastVisibleIndex) {
             visibleChangedIndexes.append(index);