diff options
Diffstat (limited to 'src/timer.hpp')
-rw-r--r-- | src/timer.hpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/timer.hpp b/src/timer.hpp new file mode 100644 index 00000000..5d6e8b71 --- /dev/null +++ b/src/timer.hpp @@ -0,0 +1,58 @@ +#pragma once + + +#include "system_headers.hpp" +#include <map> +#include <chrono> +#include <functional> +#include <optional> + +#include "base.hpp" + +namespace cru +{ + using TimerAction = std::function<void()>; + + class TimerManager : public Object + { + public: + TimerManager() = default; + TimerManager(const TimerManager& other) = delete; + TimerManager(TimerManager&& other) = delete; + TimerManager& operator=(const TimerManager& other) = delete; + TimerManager& operator=(TimerManager&& other) = delete; + ~TimerManager() override = default; + + UINT_PTR CreateTimer(UINT milliseconds, bool loop, const TimerAction& action); + void KillTimer(UINT_PTR id); + std::optional<std::pair<bool, TimerAction>> GetAction(UINT_PTR id); + + private: + std::map<UINT_PTR, std::pair<bool, TimerAction>> map_{}; + UINT_PTR current_count_ = 0; + }; + + class TimerTask + { + friend TimerTask SetTimeout(std::chrono::milliseconds milliseconds, const TimerAction& action); + friend TimerTask SetInterval(std::chrono::milliseconds milliseconds, const TimerAction& action); + + private: + explicit TimerTask(UINT_PTR id); + + public: + TimerTask(const TimerTask& other) = default; + TimerTask(TimerTask&& other) = default; + TimerTask& operator=(const TimerTask& other) = default; + TimerTask& operator=(TimerTask&& other) = default; + ~TimerTask() = default; + + void Cancel(); + + private: + UINT_PTR id_; + }; + + TimerTask SetTimeout(std::chrono::milliseconds milliseconds, const TimerAction& action); + TimerTask SetInterval(std::chrono::milliseconds milliseconds, const TimerAction& action); +} |