diff --git a/src/timer/timer_manager.h b/src/timer/timer_manager.h new file mode 100644 --- /dev/null +++ b/src/timer/timer_manager.h @@ -0,0 +1,86 @@ +/* + * This file is part of OpenTTD. + * 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. + * 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. + * 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 . + */ + +/** @file timer_manager.h Definition of the TimerManager */ +/** @note don't include this file; include "timer.h". */ + +#ifndef TIMER_MANAGER_H +#define TIMER_MANAGER_H + +#include "stdafx.h" + +#include + +template +class BaseTimer; + +/** + * The TimerManager manages a single Timer-type. + * + * It allows for automatic registration and unregistration of timers like Interval and OneShot. + * + * Each Timer-type needs to implement the Elapsed() method, and distribute that to the timers if needed. + */ +template +class TimerManager { +public: + using TElapsed = typename TTimerType::TElapsed; + + /* Avoid copying this object; it is a singleton object. */ + TimerManager(TimerManager const &) = delete; + TimerManager &operator=(TimerManager const &) = delete; + + /** + * Register a timer. + * + * @param timer The timer to register. + */ + static void RegisterTimer(BaseTimer &timer) { + GetTimers().insert(&timer); + } + + /** + * Unregister a timer. + * + * @param timer The timer to unregister. + */ + static void UnregisterTimer(BaseTimer &timer) { + GetTimers().erase(&timer); + } + + /** + * Called when time for this timer elapsed. + * + * The implementation per type is different, but they all share a similar goal: + * Call the Elapsed() method of all active timers. + * + * @param value The amount of time that has elapsed. + */ + static void Elapsed(TElapsed value); + +private: + /** + * Sorter for timers. + * + * It will sort based on the period, smaller first. If the period is the + * same, it will sort based on the pointer value. + */ + struct base_timer_sorter { + bool operator() (BaseTimer *a, BaseTimer *b) const { + if (a->period == b->period) return a < b; + return a->period < b->period; + } + }; + + /** Singleton list, to store all the active timers. */ + static std::set *, base_timer_sorter> &GetTimers() { + static std::set *, base_timer_sorter> timers; + return timers; + } +}; + +#endif /* TIMER_MANAGER_H */