X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/c1bc83dfdb27b61dbd558ef21e81659f563dae81..b4800d794ce2f900f64decdf4974cd3edffe9b67:/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp diff --git a/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp b/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp index e0aac13de..63eaea557 100644 --- a/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp +++ b/src/kitemviews/private/kfileitemmodelsortalgorithm.cpp @@ -19,9 +19,20 @@ #include "kfileitemmodelsortalgorithm.h" +#include +#include + void KFileItemModelSortAlgorithm::sort(KFileItemModel* model, QList::iterator begin, QList::iterator end) +{ + static const int numberOfThreads = QThread::idealThreadCount(); + parallelSort(model, begin, end, numberOfThreads); +} + +void KFileItemModelSortAlgorithm::sequentialSort(KFileItemModel* model, + QList< KFileItemModel::ItemData* >::iterator begin, + QList< KFileItemModel::ItemData* >::iterator end) { // The implementation is based on qStableSortHelper() from qalgorithms.h // Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). @@ -37,6 +48,28 @@ void KFileItemModelSortAlgorithm::sort(KFileItemModel* model, merge(model, begin, middle, end); } +void KFileItemModelSortAlgorithm::parallelSort(KFileItemModel* model, + QList< KFileItemModel::ItemData* >::iterator begin, + QList< KFileItemModel::ItemData* >::iterator end, + const int numberOfThreads) +{ + const int span = end - begin; + + if (numberOfThreads > 1 && span > 100) { + const int newNumberOfThreads = numberOfThreads / 2; + const QList::iterator middle = begin + span / 2; + + QFuture future = QtConcurrent::run(parallelSort, model, begin, middle, newNumberOfThreads); + parallelSort(model, middle, end, newNumberOfThreads); + + future.waitForFinished(); + + merge(model, begin, middle, end); + } else { + sequentialSort(model, begin, end); + } +} + void KFileItemModelSortAlgorithm::merge(KFileItemModel* model, QList::iterator begin, QList::iterator pivot,