tin  1.5.9
chrono_ticks.h
Go to the documentation of this file.
1 // Copyright (c) 2026 Tinverse LLC. All rights reserved.
2 // SPDX-License-Identifier: LicenseRef-Tinverse-Commercial
3 
13 
14 #pragma once
15 
16 #include <chrono>
17 #include <cstdint>
18 #include <limits>
19 
20 #include "tsm/runtime/coroutine.h"
21 #include "tsm/ticks.h"
22 
23 namespace tsm::chrono_ticks {
24 
34 template<typename Duration, typename TickPeriod>
35 [[nodiscard]] constexpr tsm::tick_rep
36 duration_to_ticks(Duration duration, TickPeriod tick_period)
37 {
38  if (tick_period <= TickPeriod::zero()) {
39  return tick_rep{};
40  }
41  if (duration <= Duration::zero()) {
42  return tick_rep{};
43  }
44 
45  const auto whole = duration / tick_period;
46  const auto remainder = duration % tick_period;
47  const auto elapsed_ticks = whole + (remainder.count() == 0 ? 0 : 1);
48  constexpr auto max_ticks = static_cast<decltype(elapsed_ticks)>(
49  std::numeric_limits<tsm::tick_rep>::max());
50  if (elapsed_ticks >= max_ticks) {
51  return std::numeric_limits<tsm::tick_rep>::max();
52  }
53  return static_cast<tsm::tick_rep>(elapsed_ticks);
54 }
55 
61 template<typename TickPeriod>
63 {
64  public:
65  using tick_period = TickPeriod;
66 
67  explicit constexpr tick_domain(TickPeriod period = TickPeriod{ 1 })
68  : period_(period)
69  {
70  }
71 
72  template<typename Duration>
73  [[nodiscard]] constexpr tsm::tick_count to_ticks(
74  Duration duration) const noexcept
75  {
76  return tsm::ticks(duration_to_ticks(duration, period_));
77  }
78 
79  [[nodiscard]] constexpr TickPeriod period() const noexcept
80  {
81  return period_;
82  }
83 
84  private:
85  TickPeriod period_;
86 };
87 
90 
91 [[nodiscard]] constexpr millisecond_domain
93 {
94  return millisecond_domain{ std::chrono::milliseconds{ 1 } };
95 }
96 
97 [[nodiscard]] constexpr second_domain
99 {
100  return second_domain{ std::chrono::seconds{ 1 } };
101 }
102 
103 template<typename TickPeriod, typename Duration>
104 [[nodiscard]] tsm::sleep_ticks_awaitable
105 sleep_for(tick_domain<TickPeriod> domain, Duration duration) noexcept
106 {
107  return tsm::sleep_ticks(domain.to_ticks(duration));
108 }
109 
110 template<typename TickPeriod, typename Duration>
111 [[nodiscard]] tsm::sleep_ticks_awaitable
112 after(tick_domain<TickPeriod> domain, Duration duration) noexcept
113 {
114  return sleep_for(domain, duration);
115 }
116 
117 template<typename TickPeriod, typename Duration>
118 [[nodiscard]] tsm::timeout_ticks_awaitable
119 timeout(tick_domain<TickPeriod> domain, Duration duration) noexcept
120 {
121  return tsm::timeout_ticks(domain.to_ticks(duration));
122 }
123 
124 template<typename TickPeriod, typename Duration>
125 [[nodiscard]] tsm::periodic_ticks
126 every(tick_domain<TickPeriod> domain, Duration duration) noexcept
127 {
128  return tsm::periodic_ticks{ domain.to_ticks(duration) };
129 }
130 
135 template<typename Clock, typename TickPeriod>
137 {
138  public:
139  using clock_type = Clock;
140  using tick_period = TickPeriod;
141  using time_point = typename Clock::time_point;
142 
143  explicit elapsed_tick_source(TickPeriod period)
144  : period_(period)
145  , origin_(Clock::now())
146  , last_(origin_)
147  {
148  }
149 
151  : elapsed_tick_source(domain.period())
152  {
153  }
154 
155  [[nodiscard]] tsm::tick_rep ticks() const
156  {
157  return duration_to_ticks(Clock::now() - origin_, period_);
158  }
159 
160  [[nodiscard]] tsm::tick_rep poll()
161  {
162  const auto now = Clock::now();
163  const auto elapsed = duration_to_ticks(now - last_, period_);
164  if (elapsed != 0U) {
165  last_ += period_ * elapsed;
166  }
167  return elapsed;
168  }
169 
170  void reset()
171  {
172  origin_ = Clock::now();
173  last_ = origin_;
174  }
175 
176  private:
177  TickPeriod period_;
178  time_point origin_;
179  time_point last_;
180 };
181 
182 } // namespace tsm::chrono_ticks
Definition: chrono_ticks.h:137
TickPeriod tick_period
Definition: chrono_ticks.h:140
tsm::tick_rep poll()
Definition: chrono_ticks.h:160
typename Clock::time_point time_point
Definition: chrono_ticks.h:141
tsm::tick_rep ticks() const
Definition: chrono_ticks.h:155
void reset()
Definition: chrono_ticks.h:170
elapsed_tick_source(TickPeriod period)
Definition: chrono_ticks.h:143
elapsed_tick_source(tick_domain< TickPeriod > domain)
Definition: chrono_ticks.h:150
Clock clock_type
Definition: chrono_ticks.h:139
Definition: chrono_ticks.h:63
constexpr tick_domain(TickPeriod period=TickPeriod{ 1 })
Definition: chrono_ticks.h:67
TickPeriod tick_period
Definition: chrono_ticks.h:65
constexpr TickPeriod period() const noexcept
Definition: chrono_ticks.h:79
constexpr tsm::tick_count to_ticks(Duration duration) const noexcept
Definition: chrono_ticks.h:73
Definition: coroutine.h:656
Static coroutine tasks for tsm runtime executors.
Definition: chrono_ticks.h:23
constexpr millisecond_domain one_tick_per_millisecond() noexcept
Definition: chrono_ticks.h:92
tsm::periodic_ticks every(tick_domain< TickPeriod > domain, Duration duration) noexcept
Definition: chrono_ticks.h:126
tsm::sleep_ticks_awaitable sleep_for(tick_domain< TickPeriod > domain, Duration duration) noexcept
Definition: chrono_ticks.h:105
constexpr second_domain one_tick_per_second() noexcept
Definition: chrono_ticks.h:98
tsm::sleep_ticks_awaitable after(tick_domain< TickPeriod > domain, Duration duration) noexcept
Definition: chrono_ticks.h:112
tick_domain< std::chrono::seconds > second_domain
Definition: chrono_ticks.h:89
constexpr tsm::tick_rep duration_to_ticks(Duration duration, TickPeriod tick_period)
Definition: chrono_ticks.h:36
tsm::timeout_ticks_awaitable timeout(tick_domain< TickPeriod > domain, Duration duration) noexcept
Definition: chrono_ticks.h:119
constexpr tick_count ticks(tick_rep value) noexcept
Definition: ticks.h:85
sleep_ticks_awaitable sleep_ticks(tsm::tick_rep ticks) noexcept
Definition: coroutine.h:622
timeout_ticks_awaitable timeout_ticks(tsm::tick_rep ticks) noexcept
Definition: coroutine.h:710
TSM_TICK_PERIOD tick_period
Definition: ticks.h:42
TSM_TICK_REP tick_rep
Definition: ticks.h:35
Definition: coroutine.h:603
Strong value type for semantic scheduler ticks.
Definition: ticks.h:54
Definition: coroutine.h:691
Target-neutral tick value type.