File indexing completed on 2025-02-21 10:09:51
0001
0002
0003
0004 #ifndef QTCONCURRENT_MEDIAN_H
0005 #define QTCONCURRENT_MEDIAN_H
0006
0007 #include <QtConcurrent/qtconcurrent_global.h>
0008
0009 #if !defined(QT_NO_CONCURRENT) || defined(Q_QDOC)
0010
0011 #include <algorithm>
0012 #include <cstring>
0013
0014 QT_BEGIN_NAMESPACE
0015
0016 namespace QtConcurrent {
0017
0018 class Median
0019 {
0020 public:
0021 enum { BufferSize = 7 };
0022
0023 Median()
0024 : currentMedian(), currentIndex(0), valid(false), dirty(true)
0025 {
0026 std::fill_n(values, static_cast<int>(BufferSize), 0.0);
0027 }
0028
0029 void reset()
0030 {
0031 std::fill_n(values, static_cast<int>(BufferSize), 0.0);
0032 currentIndex = 0;
0033 valid = false;
0034 dirty = true;
0035 }
0036
0037 void addValue(double value)
0038 {
0039 ++currentIndex;
0040 if (currentIndex == BufferSize) {
0041 currentIndex = 0;
0042 valid = true;
0043 }
0044
0045
0046
0047
0048 const double currentIndexValue = values[currentIndex];
0049 if ((currentIndexValue > currentMedian && currentMedian > value)
0050 || (currentMedian > currentIndexValue && value > currentMedian)) {
0051 dirty = true;
0052 }
0053
0054 values[currentIndex] = value;
0055 }
0056
0057 bool isMedianValid() const
0058 {
0059 return valid;
0060 }
0061
0062 double median()
0063 {
0064 if (dirty) {
0065 dirty = false;
0066
0067 double sorted[BufferSize];
0068 ::memcpy(&sorted, &values, sizeof(sorted));
0069 std::sort(sorted, sorted + static_cast<int>(BufferSize));
0070 currentMedian = sorted[BufferSize / 2];
0071 }
0072
0073 return currentMedian;
0074 }
0075
0076 private:
0077 double values[BufferSize];
0078 double currentMedian;
0079 int currentIndex;
0080 bool valid;
0081 bool dirty;
0082 };
0083
0084 }
0085
0086 QT_END_NAMESPACE
0087
0088 #endif
0089
0090 #endif