HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
Trigger.hpp
1
2#include <type_traits>
3
4#pragma once
5
6namespace tt {
7
10template<typename Clock>
11class Trigger {
12 using clock = Clock;
13 using rep = typename clock::rep;
14 using time_point = typename clock::time_point;
15
16 struct trigger_t {
17 rep time_point;
18 int level;
19 };
20
21 Trigger *parent;
22
25
26public:
27 Trigger(Trigger *parent=nullptr) noexcept :
28 parent(parent), event({std::numeric_limits<rep>::max(), 0}) {}
29
30 Trigger(Trigger const &) noexcept = delete;
31 Trigger(Trigger &&) noexcept = delete;
32 Trigger &operator=(Trigger const &) noexcept = delete;
33 Trigger &operator=(Trigger &&) noexcept = delete;
34 ~Trigger() = default;
35
48 Trigger &add(time_point time_point, int level) noexcept {
49 tt_assume(level > 0);
50
51 auto old_event = event.load();
52 trigger_t new_event;
53 do {
54 new_event = trigger_t{
55 std::min(old_event.time_point, time_point.time_since_epoch().count()),
56 std::max(old_event.level, level)
57 };
58
59 } while (!event.compare_exchange_strong(old_event, new_event));
60
61 if (parent) {
62 parent->add(time_point, level);
63 }
64 return *this;
65 }
66
73 int check(time_point current_time) noexcept {
74 auto old_event = event.load();
75 trigger_t new_event;
76 do {
77 if (old_event.time_point > current_time.time_since_epoch().count()) {
78 return 0;
79 }
80
81 // Set next trigger to the far future.
82 new_event = trigger_t{std::numeric_limits<rep>::max(), 0};
83 } while (!event.compare_exchange_strong(old_event, new_event));
84
85 return old_event.level;
86 }
87
90 Trigger &operator++() noexcept {
91 return add(time_point::min(), 1);
92 }
93
96 Trigger &operator+=(time_point time_point) noexcept {
97 return add(time_point, 1);
98 }
99
102 template<typename T, std::enable_if_t<std::is_arithmetic_v<T>,int> = 0>
103 Trigger &operator+=(T level) noexcept {
104 return add(time_point::min(), static_cast<int>(level));
105 }
106
107};
108
109}
Information on when to trigger.
Definition Trigger.hpp:11
int check(time_point current_time) noexcept
Retrieve the trigger level at the current time.
Definition Trigger.hpp:73
Trigger & operator++() noexcept
Set to immediately trigger at level 1.
Definition Trigger.hpp:90
Trigger & add(time_point time_point, int level) noexcept
Add a time_point to the trigger.
Definition Trigger.hpp:48
Trigger & operator+=(time_point time_point) noexcept
Set to trigger at a specified time at level 1.
Definition Trigger.hpp:96
Trigger & operator+=(T level) noexcept
Set to immediately trigger with a specified level.
Definition Trigger.hpp:103
T compare_exchange_strong(T... args)
T max(T... args)
T min(T... args)