40 #ifndef QTCONCURRENT_MEDIAN_H 41 #define QTCONCURRENT_MEDIAN_H 43 #include <QtConcurrent/qtconcurrent_global.h> 45 #if !defined(QT_NO_CONCURRENT) ||defined(Q_CLANG_QDOC) 47 #include <QtCore/qvector.h> 62 : currentMedian(), bufferSize(_bufferSize), currentIndex(0), valid(false), dirty(true)
64 values.resize(bufferSize);
77 currentIndex = ((currentIndex + 1) % bufferSize);
78 if (valid ==
false && currentIndex % bufferSize == 0)
84 const T currentIndexValue = values[currentIndex];
85 if ((currentIndexValue > currentMedian && currentMedian > value)
86 || (currentMedian > currentIndexValue && value > currentMedian)) {
90 values[currentIndex] = value;
107 #if defined(__GLIBCXX__) && __GLIBCXX__ <= 20140107 108 QVector<T> sorted = values;
109 std::sort(sorted.begin(), sorted.end());
110 currentMedian = sorted.at(bufferSize / 2);
112 QVector<T> copy = values;
113 typename QVector<T>::iterator begin = copy.begin(), mid = copy.begin() + bufferSize/2, end = copy.end();
114 std::nth_element(begin, mid, end);
115 currentMedian = *mid;
118 return currentMedian;
133 enum { BufferSize = 7 };
136 : currentMedian(), currentIndex(0), valid(false), dirty(true)
138 std::fill_n(values, static_cast<int>(BufferSize), 0.0);
143 std::fill_n(values, static_cast<int>(BufferSize), 0.0);
152 if (currentIndex == BufferSize) {
160 const double currentIndexValue = values[currentIndex];
161 if ((currentIndexValue > currentMedian && currentMedian > value)
162 || (currentMedian > currentIndexValue && value > currentMedian)) {
166 values[currentIndex] = value;
179 double sorted[BufferSize];
180 ::memcpy(&sorted, &values,
sizeof(sorted));
181 std::sort(sorted, sorted + static_cast<int>(BufferSize));
182 currentMedian = sorted[BufferSize / 2];
185 return currentMedian;
189 double values[BufferSize];
190 double currentMedian;
201 #endif // QT_NO_CONCURRENT
The QtConcurrent namespace provides high-level APIs that make it possible to write multi-threaded pro...
Definition: qtconcurrentexception.h:51