-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwindowhistory.hpp
39 lines (33 loc) · 933 Bytes
/
windowhistory.hpp
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
#include <array>
#include <ostream>
template <typename T, size_t size> class WindowHistory {
public:
WindowHistory() : _beg(0), _end(0), window(), _curr_size(0) {}
void push(const T &item) {
window[_end] = item;
update_indices();
}
template <typename... Args> void emplace(const Args &... args) {
new (&window[_end]) T(args...);
update_indices();
}
T &operator[](size_t idx) { return window[idx]; }
const T &operator[](size_t idx) const { return window[idx]; }
T beg() const { return window[_beg]; }
T end() const { return window[(size + _end - 1) % size]; }
size_t curr_size() const { return _curr_size; }
const size_t win_size = size;
private:
std::array<T, size> window;
size_t _beg;
size_t _end;
size_t _curr_size;
void update_indices() {
if (_curr_size < size) {
++_curr_size;
} else {
_beg = (_beg + 1) % size;
}
_end = (_end + 1) % size;
}
};