From b75c82f6456edbc00646da15531cfb63f8957817 Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Tue, 7 Apr 2020 12:34:24 +0200 Subject: 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 --- src/concurrent/qtconcurrentmedian.h | 83 ++----------------------------------- 1 file changed, 3 insertions(+), 80 deletions(-) (limited to 'src/concurrent/qtconcurrentmedian.h') 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 -#if !defined(QT_NO_CONCURRENT) ||defined(Q_CLANG_QDOC) - -#include +#if !defined(QT_NO_CONCURRENT) || defined(Q_CLANG_QDOC) #include +#include QT_BEGIN_NAMESPACE - - namespace QtConcurrent { -template 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 sorted = values; - std::sort(sorted.begin(), sorted.end()); - currentMedian = sorted.at(bufferSize / 2); -#else - QVector copy = values; - typename QVector::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 values; - T currentMedian; - int bufferSize; - int currentIndex; - bool valid; - bool dirty; -}; - -// ### Qt6: Drop Median 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(BufferSize), 0.0); @@ -195,7 +119,6 @@ private: } // namespace QtConcurrent - QT_END_NAMESPACE #endif // QT_NO_CONCURRENT -- cgit v1.2.3