// // Created by erki on 24/10/23. // #pragma once #include #include #include "cpptick/argstore.hpp" namespace cpptick { struct BaseScheduler; struct Timer { enum Type { ONE_SHOT, PERIODIC }; Timer(BaseScheduler* scheduler, const std::uint32_t timeout_ms, const Type type) : scheduler_(scheduler), period_ms(timeout_ms), type(type) {} Timer() = delete; Timer(const Timer&) = delete; Timer(Timer&&) = delete; Timer& operator=(const Timer&) = delete; Timer& operator=(Timer&&) = delete; void start(); template void setSlot(T& slot) { setSlot(&slot.invoke_ptr); } void setSlot(Utility::IFunction* slot) { slot_ = slot; } Utility::IFunction* getSlot() { return slot_; } std::uint32_t expirationTime(const std::uint32_t current_time) const { return period_ms + current_time; } std::uint32_t period_ms; Type type; private: BaseScheduler* scheduler_; Utility::IFunction* slot_ = nullptr; }; }// namespace cpptick