OpenTTD Source 20241224-master-gee860a5c8e
timer.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#ifndef TIMER_H
11#define TIMER_H
12
13#include "timer_manager.h"
14
15
21template <typename TTimerType>
22class BaseTimer {
23public:
24 using TPeriod = typename TTimerType::TPeriod;
25 using TElapsed = typename TTimerType::TElapsed;
26 using TStorage = typename TTimerType::TStorage;
27
33 [[nodiscard]] BaseTimer(const TPeriod period) :
35 {
37 }
38
46
47 /* Although these variables are public, they are only public to make saveload easier; not for common use. */
48
49 TPeriod period;
50 TStorage storage = {};
51
52protected:
58 virtual void Elapsed(TElapsed delta) = 0;
59
60 /* To ensure only TimerManager can access Elapsed. */
61 friend class TimerManager<TTimerType>;
62};
63
75template <typename TTimerType>
76class IntervalTimer : public BaseTimer<TTimerType> {
77public:
78 using TPeriod = typename TTimerType::TPeriod;
79 using TElapsed = typename TTimerType::TElapsed;
80
87 [[nodiscard]] IntervalTimer(const TPeriod interval, std::function<void(uint)> callback) :
88 BaseTimer<TTimerType>(interval),
89 callback(callback)
90 {
91 }
92
99 void SetInterval(const TPeriod interval, bool reset = true)
100 {
102 if (reset) this->storage = {};
103 }
104
105private:
106 std::function<void(uint)> callback;
107
108 void Elapsed(TElapsed count) override;
109};
110
115template <typename TTimerType>
116class TimeoutTimer : public BaseTimer<TTimerType> {
117public:
118 using TPeriod = typename TTimerType::TPeriod;
119 using TElapsed = typename TTimerType::TElapsed;
120
130 [[nodiscard]] TimeoutTimer(const TPeriod timeout, std::function<void()> callback, bool start = false) :
131 BaseTimer<TTimerType>(timeout),
132 fired(!start),
133 callback(callback)
134 {
135 }
136
140 void Reset()
141 {
142 this->fired = false;
143 this->storage = {};
144 }
145
151 void Reset(const TPeriod timeout)
152 {
154 this->fired = false;
155 this->storage = {};
156 }
157
161 void Abort()
162 {
163 this->fired = true;
164 }
165
171 bool HasFired() const
172 {
173 return this->fired;
174 }
175
176 /* Although these variables are public, they are only public to make saveload easier; not for common use. */
177
178 bool fired;
179
180private:
181 std::function<void()> callback;
182
183 void Elapsed(TElapsed count) override;
184};
185
186#endif /* TIMER_H */
The base where every other type of timer is derived from.
Definition timer.h:22
TStorage storage
The storage of the timer.
Definition timer.h:50
virtual void Elapsed(TElapsed delta)=0
Called by the timer manager to notify the timer that the given amount of time has elapsed.
BaseTimer(const TPeriod period)
Create a new timer.
Definition timer.h:33
TPeriod period
The period of the timer.
Definition timer.h:49
virtual ~BaseTimer()
Delete the timer.
Definition timer.h:42
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
void Elapsed(TElapsed count) override
Called by the timer manager to notify the timer that the given amount of time has elapsed.
void SetInterval(const TPeriod interval, bool reset=true)
Set a new interval for the timer.
Definition timer.h:99
IntervalTimer(const TPeriod interval, std::function< void(uint)> callback)
Create a new interval timer.
Definition timer.h:87
A timeout timer will fire once after the interval.
Definition timer.h:116
void Reset()
Reset the timer, so it will fire again after the timeout.
Definition timer.h:140
bool HasFired() const
Check whether the timeout occurred.
Definition timer.h:171
bool fired
Whether the timeout has occurred.
Definition timer.h:178
TimeoutTimer(const TPeriod timeout, std::function< void()> callback, bool start=false)
Create a new timeout timer.
Definition timer.h:130
void Elapsed(TElapsed count) override
Called by the timer manager to notify the timer that the given amount of time has elapsed.
void Abort()
Abort the timer so it doesn't fire if it hasn't yet.
Definition timer.h:161
void Reset(const TPeriod timeout)
Reset the timer, so it will fire again after the timeout.
Definition timer.h:151
The TimerManager manages a single Timer-type.
static void UnregisterTimer(BaseTimer< TTimerType > &timer)
Unregister a timer.
static void RegisterTimer(BaseTimer< TTimerType > &timer)
Register a timer.
static void ChangeRegisteredTimerPeriod(BaseTimer< TTimerType > &timer, TPeriod new_period)
Change the period of a registered timer.
Definition of the TimerManager.