diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2020-04-07 12:34:24 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2020-04-09 02:49:18 +0200 |
commit | b75c82f6456edbc00646da15531cfb63f8957817 (patch) | |
tree | a11709410f3e2e8f7787eaef8fe1e7f6500ab12f /src/concurrent/qtconcurrentmedian.h | |
parent | 9ad8b80fb970cfe96c7c7bae781b20528b2ce334 (diff) |
Resolve Qt6 TODO items, replace Median and BlockSizeManager
* Replaces the, only internaly used, implementation of template
class Median with a fixed size none templated version.
* Replaces BlockSizeManager with an updated BlockSizeManager V2,
but keeping the original name.
* adapt the auto-test to take the fixed size array into account
Change-Id: If76cb944676c4a06a7566ad0bc37ded25b81c70c
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Diffstat (limited to 'src/concurrent/qtconcurrentmedian.h')
-rw-r--r-- | src/concurrent/qtconcurrentmedian.h | 83 |
1 files changed, 3 insertions, 80 deletions
diff --git a/src/concurrent/qtconcurrentmedian.h b/src/concurrent/qtconcurrentmedian.h index cec2431d6f..aab80794d9 100644 --- a/src/concurrent/qtconcurrentmedian.h +++ b/src/concurrent/qtconcurrentmedian.h @@ -42,97 +42,21 @@ #include <QtConcurrent/qtconcurrent_global.h> -#if !defined(QT_NO_CONCURRENT) ||defined(Q_CLANG_QDOC) - -#include <QtCore/qvector.h> +#if !defined(QT_NO_CONCURRENT) || defined(Q_CLANG_QDOC) #include <algorithm> +#include <cstring> QT_BEGIN_NAMESPACE - - namespace QtConcurrent { -template <typename T> class Median { public: - Median(int _bufferSize) - : currentMedian(), bufferSize(_bufferSize), currentIndex(0), valid(false), dirty(true) - { - values.resize(bufferSize); - } - - void reset() - { - values.fill(0); - currentIndex = 0; - valid = false; - dirty = true; - } - - void addValue(T value) - { - currentIndex = ((currentIndex + 1) % bufferSize); - if (valid == false && currentIndex % bufferSize == 0) - valid = true; - - // Only update the cached median value when we have to, that - // is when the new value is on then other side of the median - // compared to the current value at the index. - const T currentIndexValue = values[currentIndex]; - if ((currentIndexValue > currentMedian && currentMedian > value) - || (currentMedian > currentIndexValue && value > currentMedian)) { - dirty = true; - } - - values[currentIndex] = value; - } - - bool isMedianValid() const - { - return valid; - } - - T median() - { - if (dirty) { - dirty = false; - -// This is a workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58800 -// Avoid using std::nth_element for the affected stdlibc++ releases 4.7.3 and 4.8.2. -// Note that the official __GLIBCXX__ value of the releases is not used since that -// one might be patched on some GNU/Linux distributions. -#if defined(__GLIBCXX__) && __GLIBCXX__ <= 20140107 - QVector<T> sorted = values; - std::sort(sorted.begin(), sorted.end()); - currentMedian = sorted.at(bufferSize / 2); -#else - QVector<T> copy = values; - typename QVector<T>::iterator begin = copy.begin(), mid = copy.begin() + bufferSize/2, end = copy.end(); - std::nth_element(begin, mid, end); - currentMedian = *mid; -#endif - } - return currentMedian; - } -private: - QVector<T> values; - T currentMedian; - int bufferSize; - int currentIndex; - bool valid; - bool dirty; -}; - -// ### Qt6: Drop Median<double> in favor of this faster MedianDouble -class MedianDouble -{ -public: enum { BufferSize = 7 }; - MedianDouble() + Median() : currentMedian(), currentIndex(0), valid(false), dirty(true) { std::fill_n(values, static_cast<int>(BufferSize), 0.0); @@ -195,7 +119,6 @@ private: } // namespace QtConcurrent - QT_END_NAMESPACE #endif // QT_NO_CONCURRENT |