CallEvery.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #ifndef GUL_INTERVAL_EXECUTOR_H
  2. #define GUL_INTERVAL_EXECUTOR_H
  3. #include <chrono>
  4. namespace gul
  5. {
  6. /**
  7. * @brief The CallEvery class
  8. *
  9. * This class allows you to call a particular function at periodic
  10. * intervals.
  11. *
  12. * CallEvery C1(std::chrono::milliseconds(20));
  13. *
  14. * while(true)
  15. * {
  16. * auto execTime = C1([&](auto dt)
  17. * {
  18. * // this lambda is executed every 20 milliseconds
  19. *
  20. * });
  21. * }
  22. */
  23. class CallEvery
  24. {
  25. public:
  26. using _clock = std::chrono::system_clock;
  27. using time_point = _clock::time_point;
  28. using duration = _clock::duration;
  29. CallEvery(duration dt = std::chrono::milliseconds(20)) : m_interval(dt)
  30. {
  31. }
  32. void setInterval(std::chrono::system_clock::duration dr)
  33. {
  34. m_interval = dr;
  35. }
  36. bool operator()()
  37. {
  38. auto _start = _clock::now();
  39. auto nextExec = m_lastExec+m_interval;
  40. if( _start >= nextExec)
  41. {
  42. m_lastExec = _start;
  43. return true;
  44. }
  45. return false;
  46. }
  47. template<typename callable_t>
  48. std::chrono::system_clock::duration operator()(callable_t && c)
  49. {
  50. auto _start = _clock::now();
  51. auto nextExec = m_lastExec+m_interval;
  52. if( _start >= nextExec)
  53. {
  54. auto dt = _start - m_lastExec;
  55. m_lastExec = _start;
  56. c(dt);
  57. auto _end = _clock::now();
  58. return _end-_start;
  59. }
  60. return duration(0);
  61. }
  62. duration getInterval() const
  63. {
  64. return m_interval;
  65. }
  66. time_point getLastExecTime() const
  67. {
  68. return m_lastExec;
  69. }
  70. protected:
  71. duration m_interval = std::chrono::milliseconds(20);
  72. time_point m_lastExec = _clock::now();
  73. };
  74. }
  75. #endif