Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qtconcurrentmedian.h
Go to the documentation of this file.
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
ifndef
QTCONCURRENT_MEDIAN_H
6
#
define
QTCONCURRENT_MEDIAN_H
7
8
#
include
<
QtConcurrent
/
qtconcurrent_global
.
h
>
9
10
#
if
!
defined
(
QT_NO_CONCURRENT
)
||
defined
(
Q_QDOC
)
11
12
#
include
<
algorithm
>
13
#
include
<
cstring
>
14
15
QT_BEGIN_NAMESPACE
16
17
namespace
QtConcurrent
{
18
19
class
Median
20
{
21
public
:
22
enum
{
BufferSize
= 7 };
23
24
Median
()
25
: currentMedian(), currentIndex(0), valid(
false
), dirty(
true
)
26
{
27
std
::fill_n(values,
static_cast
<
int
>(
BufferSize
), 0.0);
28
}
29
30
void
reset
()
31
{
32
std
::fill_n(values,
static_cast
<
int
>(
BufferSize
), 0.0);
33
currentIndex = 0;
34
valid =
false
;
35
dirty =
true
;
36
}
37
38
void
addValue
(
double
value)
39
{
40
++currentIndex;
41
if
(currentIndex ==
BufferSize
) {
42
currentIndex = 0;
43
valid =
true
;
44
}
45
46
// Only update the cached median value when we have to, that
47
// is when the new value is on then other side of the median
48
// compared to the current value at the index.
49
const
double
currentIndexValue = values[currentIndex];
50
if
((currentIndexValue > currentMedian && currentMedian > value)
51
|| (currentMedian > currentIndexValue && value > currentMedian)) {
52
dirty =
true
;
53
}
54
55
values[currentIndex] = value;
56
}
57
58
bool
isMedianValid
()
const
59
{
60
return
valid;
61
}
62
63
double
median
()
64
{
65
if
(dirty) {
66
dirty =
false
;
67
68
double
sorted[
BufferSize
];
69
::memcpy(&sorted, &values,
sizeof
(sorted));
70
std
::sort(sorted, sorted +
static_cast
<
int
>(
BufferSize
));
71
currentMedian = sorted[
BufferSize
/ 2];
72
}
73
74
return
currentMedian;
75
}
76
77
private
:
78
double
values[
BufferSize
];
79
double
currentMedian;
80
int
currentIndex;
81
bool
valid;
82
bool
dirty;
83
};
84
85
}
// namespace QtConcurrent
86
87
QT_END_NAMESPACE
88
89
#
endif
// QT_NO_CONCURRENT
90
91
#
endif
QtConcurrent::Median
\inmodule QtConcurrent
Definition
qtconcurrentmedian.h:20
QtConcurrent::Median::BufferSize
@ BufferSize
Definition
qtconcurrentmedian.h:22
QtConcurrent::Median::median
double median()
Definition
qtconcurrentmedian.h:63
QtConcurrent::Median::Median
Median()
Definition
qtconcurrentmedian.h:24
QtConcurrent::Median::isMedianValid
bool isMedianValid() const
Definition
qtconcurrentmedian.h:58
QtConcurrent::Median::addValue
void addValue(double value)
Definition
qtconcurrentmedian.h:38
QtConcurrent::Median::reset
void reset()
Definition
qtconcurrentmedian.h:30
QtConcurrent
\inmodule QtConcurrent
Definition
qtconcurrentiteratekernel.cpp:29
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
qtbase
src
concurrent
qtconcurrentmedian.h
Generated on
for Qt by
1.14.0