timer_handler.hpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #pragma once
  2. //
  3. // Copyright (c) 2019-2020 Ivan Baidakou (basiliscos) (the dot dmol at gmail dot com)
  4. //
  5. // Distributed under the MIT Software License
  6. //
  7. #include "forward.hpp"
  8. #include <memory>
  9. namespace rotor {
  10. /** \struct timer_handler_base_t
  11. * \brief Base class for timer handler
  12. */
  13. struct timer_handler_base_t {
  14. /** \brief actor, which "owns" timer, i.e. where "start_timer" was invoked" */
  15. actor_base_t *owner;
  16. /** \brief timer identity (aka timer request id) */
  17. request_id_t request_id;
  18. /** \brief constructs timer handler from non-owning pointer to timer and timer request id */
  19. timer_handler_base_t(actor_base_t *owner_, request_id_t request_id_) noexcept
  20. : owner{owner_}, request_id{request_id_} {}
  21. /** \brief an action when timer was triggered or cancelled */
  22. virtual void trigger(bool cancelled) noexcept = 0;
  23. virtual ~timer_handler_base_t() = default;
  24. };
  25. /** \brief alias for timer smart pointer */
  26. using timer_handler_ptr_t = std::unique_ptr<timer_handler_base_t>;
  27. /** \struct timer_handler_t
  28. * \brief templated implementation of timer handler
  29. *
  30. */
  31. template <typename Object, typename Method> struct timer_handler_t : timer_handler_base_t {
  32. /** \brief delegate object, i.e. that one on which the callback (method) will be invoked*/
  33. Object *object;
  34. /** \brief timer callback */
  35. Method method;
  36. /** \brief constructs timer handler from non-owning pointer to timer, timer request id, delegate and callback
  37. * (object method) */
  38. timer_handler_t(actor_base_t *owner_, request_id_t request_id_, Object *object_, Method method_) noexcept
  39. : timer_handler_base_t{owner_, request_id_}, object{object_}, method{std::forward<Method>(method_)} {}
  40. void trigger(bool cancelled) noexcept override { std::invoke(method, object, request_id, cancelled); }
  41. };
  42. } // namespace rotor