forked from hexne/NeLib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAverageQueue.cppm
65 lines (50 loc) · 1.31 KB
/
AverageQueue.cppm
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
/*******************************************************************************
* @Author : yongheng
* @Data : 2024/12/01 22:56
*******************************************************************************/
module;
#include <array>
#include <stdexcept>
#include "tools.h"
export module AverageQueue;
NAMESPACE_BEGIN(nl)
template <typename T, size_t MaxSize>
class AverageQueue {
std::array<T, MaxSize + 1> data_{};
size_t max_size_ = MaxSize + 1;
int front_{}, rear_{};
public:
AverageQueue() = default;
AverageQueue(const std::initializer_list<T> &init_list) {
if (init_list.size() > max_size_)
throw std::invalid_argument("AverageQueue is too many elements");
front_ = 0;
rear_ = init_list.size();
std::copy(init_list.begin(), init_list.end(), data_.begin());
}
void push_back(const T &val) {
int rear_back = rear_;
data_[rear_++] = val;
rear_ %= max_size_;
if ((rear_back + 1) % max_size_ == front_) {
front_++;
front_ %= max_size_;
}
}
T get_average() {
int size = this->size();
T ret{};
for (int i = 0; i < size; ++i) {
int pos = (front_ + i) % max_size_;
ret += data_[pos];
}
return ret / size;
}
size_t size() {
int size = rear_ - front_;
if (size > 0)
return size;
return size + max_size_;
}
};
NAMESPACE_END(nl)