summaryrefslogtreecommitdiffstats
path: root/src/concurrent/qtconcurrentmedian.h
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2020-04-07 12:34:24 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2020-04-09 02:49:18 +0200
commitb75c82f6456edbc00646da15531cfb63f8957817 (patch)
treea11709410f3e2e8f7787eaef8fe1e7f6500ab12f /src/concurrent/qtconcurrentmedian.h
parent9ad8b80fb970cfe96c7c7bae781b20528b2ce334 (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.h83
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