X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e348bc58267b3dc06f2fc044f9e5ce5a5dfcd087..c652807a195d82e85df7b3aafc924a5f83ca590e:/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp diff --git a/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp b/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp index 9588d19bf..a09d0cd80 100644 --- a/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp +++ b/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp @@ -22,12 +22,23 @@ #include #include +#include + void KFileItemModelSortAlgorithm::sort(KFileItemModel* model, QList::iterator begin, QList::iterator end) { - static const int numberOfThreads = QThread::idealThreadCount(); - parallelSort(model, begin, end, numberOfThreads); + if (model->sortRole() == model->roleForType(KFileItemModel::NameRole)) { + // Sorting by name can be expensive, in particular if natural sorting is + // enabled. Use all CPU cores to speed up the sorting process. + static const int numberOfThreads = QThread::idealThreadCount(); + parallelSort(model, begin, end, numberOfThreads); + } else { + // Sorting by other roles is quite fast. Use only one thread to prevent + // problems caused by non-reentrant comparison functions, see + // https://bugs.kde.org/show_bug.cgi?id=312679 + sequentialSort(model, begin, end); + } } void KFileItemModelSortAlgorithm::sequentialSort(KFileItemModel* model, @@ -106,9 +117,7 @@ void KFileItemModelSortAlgorithm::merge(KFileItemModel* model, firstCut = upperBound(model, begin, pivot, *secondCut); } - reverse(firstCut, pivot); - reverse(pivot, secondCut); - reverse(firstCut, secondCut); + std::rotate(firstCut, pivot, secondCut); const QList::iterator newPivot = firstCut + len2Half; merge(model, begin, firstCut, newPivot); @@ -167,15 +176,3 @@ KFileItemModelSortAlgorithm::upperBound(KFileItemModel* model, } return begin; } - -void KFileItemModelSortAlgorithm::reverse(QList::iterator begin, - QList::iterator end) -{ - // The implementation is based on qReverse() from qalgorithms.h - // Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). - - --end; - while (begin < end) { - qSwap(*begin++, *end--); - } -}