-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathRingBuffer.h
executable file
·153 lines (134 loc) · 2.85 KB
/
RingBuffer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
* @file RingBuffer.h
*
* Declaration of class RingBuffer
*
* @author Max Risler
*
* ===> from B-Human
*/
#pragma once
/**
* @class RingBuffer
*
* template class for cyclic buffering of the last n values of Type V
*/
template <class C, int n = 30>
class RingBuffer {
public:
/** Constructor */
RingBuffer() {
init();
}
/**
* initializes the RingBufferWithSum
*/
void init() {
current = n - 1;
numberOfEntries = 0;
sum = C();
}
/**
* adds an entry to the buffer
* \param value value to be added
*/
void add(C value) {
if (numberOfEntries == n)
sum -= getEntry(numberOfEntries - 1);
sum += value;
current++;
if (current == n)
current = 0;
if (++numberOfEntries >= n)
numberOfEntries = n;
buffer[current] = value;
}
/**
* returns an entry
* \param i index of entry counting from last added (last=0,...)
* \return a reference to the buffer entry
*/
C getEntry(int i) {
int j = current - i;
j %= n;
if (j < 0)
j += n;
return buffer[j];
}
C getSum() {
return sum;
}
C getMinimum() const {
// Return 0 if buffer is empty
if (0 == numberOfEntries)
return C();
C min = buffer[0];
for (int i = 0; i < numberOfEntries; i++) {
if (buffer[i] < min)
min = buffer[i];
}
return min;
}
C getMaximum() const {
// Return 0 if buffer is empty
if (0 == numberOfEntries)
return C();
C max = buffer[0];
for (int i = 0; i < numberOfEntries; i++) {
if (buffer[i] > max)
max = buffer[i];
}
return max;
}
/**
* returns the average value of all entries
* \return the average value
*/
C getAverage() const {
// Return 0 if buffer is empty
if (0 == numberOfEntries)
return C();
return (sum / numberOfEntries);
}
/**
* returns the reciprocal of the average value of all entries
* \return reciprocal of the average value
*/
C getReciprocal() const {
// Return 0 if buffer is empty
if (0 == numberOfEntries)
return C();
return 1.0 / (double)(sum / numberOfEntries);
}
/**
* returns an entry
* \param i index of entry counting from last added (last=0,...)
* \return a reference to the buffer entry
*/
C operator[](int i) {
return getEntry(i);
}
/**
* returns a constant entry.
* \param i index of entry counting from last added (last=0,...)
* \return a reference to the buffer entry
*/
C operator[](int i) const {
return buffer[i > current ? n + current - i : current - i];
}
inline int getNumberOfEntries() const {
return numberOfEntries;
}
/**
* Returns the maximum entry count.
* \return The maximum entry count.
*/
inline int getMaxEntries() const {
return n;
}
private:
int current;
int numberOfEntries;
C buffer[n];
C sum;
};