Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-02-21 10:09:51

0001 // Copyright (C) 2016 The Qt Company Ltd.
0002 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
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         // Only update the cached median value when we have to, that
0046         // is when the new value is on then other side of the median
0047         // compared to the current value at the index.
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 } // namespace QtConcurrent
0085 
0086 QT_END_NAMESPACE
0087 
0088 #endif // QT_NO_CONCURRENT
0089 
0090 #endif