-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodulo_counter.cppm
More file actions
37 lines (29 loc) · 945 Bytes
/
Copy pathmodulo_counter.cppm
File metadata and controls
37 lines (29 loc) · 945 Bytes
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
export module modulo_counter;
import <algorithm>;
import <cstdint>;
import <functional>;
import counter;
export class Modulo_counter : public Counter {
private:
const std::uint64_t modulo;
virtual void perform_inner_ticks(std::uint64_t ticks,
const std::function<void(std::uint64_t)>
&report_ov) noexcept override {
std::uint64_t initial_ticks = ticks;
while (ticks != 0) {
// add ticks up to next fibbonaci number
std::uint64_t how_many = std::min(ticks, modulo - inner_value);
ticks -= how_many;
inner_value += how_many;
// check if modulo is achieved and ticks remain
if (ticks) {
--ticks;
inner_value = 0;
report_ov(initial_ticks - ticks);
}
}
}
public:
Modulo_counter(std::uint64_t ignored2, std::uint64_t modulo2) noexcept
: Counter(ignored2), modulo{modulo2} {}
};