Time Shield Library 2.0.0
C++ library for working with time
Loading...
Searching...
No Matches
ElapsedTimer.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2#pragma once
3#ifndef TIME_SHIELD_HEADER_TIMERS_ELAPSEDTIMER_HPP_INCLUDED
4#define TIME_SHIELD_HEADER_TIMERS_ELAPSEDTIMER_HPP_INCLUDED
5
12
13#include <time_shield/core.hpp>
14
15#include <chrono>
16#include <cstdint>
17
18namespace time_shield {
19
25 public:
26 using clock = std::chrono::steady_clock;
27 using duration = clock::duration;
28 using time_point = clock::time_point;
29
31 ElapsedTimer() noexcept = default;
32
34 explicit ElapsedTimer(bool start_immediately) noexcept {
35 if (start_immediately) {
36 start();
37 }
38 }
39
41 void start() noexcept {
42 m_start_time = clock::now();
43 m_is_running = true;
44 }
45
47 TIME_SHIELD_NODISCARD duration restart() noexcept {
48 const time_point now = clock::now();
49 const duration delta = m_is_running ? now - m_start_time : duration::zero();
51 m_is_running = true;
52 return delta;
53 }
54
56 TIME_SHIELD_NODISCARD ts_ms_t restart_ms(ts_ms_t now_ms) noexcept {
57 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::milliseconds(now_ms));
58 const time_point now(since_epoch);
59 const duration delta = m_is_running ? now - m_start_time : duration::zero();
61 m_is_running = true;
62 return std::chrono::duration_cast<std::chrono::milliseconds>(delta).count();
63 }
64
66 TIME_SHIELD_NODISCARD ts_t restart_sec(ts_t now_sec) noexcept {
67 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::seconds(now_sec));
68 const time_point now(since_epoch);
69 const duration delta = m_is_running ? now - m_start_time : duration::zero();
71 m_is_running = true;
72 return std::chrono::duration_cast<std::chrono::seconds>(delta).count();
73 }
74
76 void invalidate() noexcept {
77 m_is_running = false;
78 }
79
81 TIME_SHIELD_NODISCARD bool is_running() const noexcept {
82 return m_is_running;
83 }
84
86 TIME_SHIELD_NODISCARD bool is_valid() const noexcept {
87 return m_is_running;
88 }
89
91 TIME_SHIELD_NODISCARD time_point start_time() const noexcept {
92 return m_start_time;
93 }
94
96 TIME_SHIELD_NODISCARD duration elapsed() const noexcept {
97 return elapsed(clock::now());
98 }
99
101 TIME_SHIELD_NODISCARD duration elapsed(time_point now) const noexcept {
102 if (!m_is_running) {
103 return duration::zero();
104 }
105 return now - m_start_time;
106 }
107
109 TIME_SHIELD_NODISCARD std::int64_t elapsed_ns() const noexcept {
111 }
112
114 TIME_SHIELD_NODISCARD std::int64_t elapsed_ns(std::int64_t now_ns) const noexcept {
115 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::nanoseconds(now_ns));
116 const time_point now(since_epoch);
117 return std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed(now)).count();
118 }
119
121 TIME_SHIELD_NODISCARD ts_ms_t elapsed_ms() const noexcept {
123 }
124
126 TIME_SHIELD_NODISCARD ts_ms_t elapsed_ms(ts_ms_t now_ms) const noexcept {
127 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::milliseconds(now_ms));
128 const time_point now(since_epoch);
129 return std::chrono::duration_cast<std::chrono::milliseconds>(elapsed(now)).count();
130 }
131
133 TIME_SHIELD_NODISCARD ts_t elapsed_sec() const noexcept {
135 }
136
138 TIME_SHIELD_NODISCARD ts_t elapsed_sec(ts_t now_sec) const noexcept {
139 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::seconds(now_sec));
140 const time_point now(since_epoch);
141 return std::chrono::duration_cast<std::chrono::seconds>(elapsed(now)).count();
142 }
143
145 template <class Duration>
146 TIME_SHIELD_NODISCARD typename Duration::rep elapsed_count() const noexcept {
147 return std::chrono::duration_cast<Duration>(elapsed()).count();
148 }
149
151 TIME_SHIELD_NODISCARD bool has_expired(ts_ms_t timeout_ms) const noexcept {
152 if (!m_is_running) {
153 return false;
154 }
155 if (timeout_ms <= 0) {
156 return true;
157 }
158 return elapsed_ms() >= timeout_ms;
159 }
160
162 TIME_SHIELD_NODISCARD bool has_expired_sec(ts_t timeout_sec) const noexcept {
163 if (!m_is_running) {
164 return false;
165 }
166 if (timeout_sec <= 0) {
167 return true;
168 }
169 return elapsed() >= std::chrono::seconds(timeout_sec);
170 }
171
173 TIME_SHIELD_NODISCARD std::int64_t ms_since_reference() const noexcept {
174 if (!m_is_running) {
175 return 0;
176 }
177 return std::chrono::duration_cast<std::chrono::milliseconds>(m_start_time.time_since_epoch()).count();
178 }
179
180 private:
182 bool m_is_running{false};
183 };
184
185} // namespace time_shield
186
187#endif // TIME_SHIELD_HEADER_TIMERS_ELAPSEDTIMER_HPP_INCLUDED
Helper that measures elapsed monotonic time spans.
clock::time_point time_point
TIME_SHIELD_NODISCARD ts_ms_t elapsed_ms() const noexcept
Returns elapsed milliseconds since the timer was started.
TIME_SHIELD_NODISCARD ts_t elapsed_sec(ts_t now_sec) const noexcept
Returns elapsed seconds relative to the provided timestamp in seconds.
TIME_SHIELD_NODISCARD duration elapsed() const noexcept
Returns elapsed duration since the timer was started.
TIME_SHIELD_NODISCARD bool is_running() const noexcept
Checks whether the timer measures elapsed time.
TIME_SHIELD_NODISCARD std::int64_t elapsed_ns(std::int64_t now_ns) const noexcept
Returns elapsed nanoseconds relative to the provided timestamp in nanoseconds.
TIME_SHIELD_NODISCARD ts_ms_t elapsed_ms(ts_ms_t now_ms) const noexcept
Returns elapsed milliseconds relative to the provided timestamp in milliseconds.
TIME_SHIELD_NODISCARD ts_t elapsed_sec() const noexcept
Returns elapsed seconds since the timer was started.
TIME_SHIELD_NODISCARD time_point start_time() const noexcept
Returns start time stored by the timer.
void invalidate() noexcept
Invalidates the timer so subsequent elapsed() calls return zero.
TIME_SHIELD_NODISCARD duration elapsed(time_point now) const noexcept
Returns elapsed duration relative to the provided time point.
TIME_SHIELD_NODISCARD bool is_valid() const noexcept
Alias for is_running() to match Qt naming conventions.
std::chrono::steady_clock clock
TIME_SHIELD_NODISCARD std::int64_t elapsed_ns() const noexcept
Returns elapsed nanoseconds since the timer was started.
TIME_SHIELD_NODISCARD Duration::rep elapsed_count() const noexcept
Returns elapsed duration in the desired chrono duration type.
TIME_SHIELD_NODISCARD ts_ms_t restart_ms(ts_ms_t now_ms) noexcept
Restarts the timer using a millisecond timestamp and returns elapsed milliseconds.
void start() noexcept
Starts the timer using the current steady clock time.
TIME_SHIELD_NODISCARD duration restart() noexcept
Restarts the timer and returns the elapsed duration so far.
TIME_SHIELD_NODISCARD ts_t restart_sec(ts_t now_sec) noexcept
Restarts the timer using a second timestamp and returns elapsed seconds.
TIME_SHIELD_NODISCARD bool has_expired(ts_ms_t timeout_ms) const noexcept
Checks if the given timeout in milliseconds has expired.
TIME_SHIELD_NODISCARD std::int64_t ms_since_reference() const noexcept
Returns milliseconds since the internal clock reference.
TIME_SHIELD_NODISCARD bool has_expired_sec(ts_t timeout_sec) const noexcept
Checks if the given timeout in seconds has expired.
ElapsedTimer() noexcept=default
Constructs an invalid timer.
int64_t ts_t
Unix timestamp in seconds since 1970‑01‑01T00:00:00Z.
Definition types.hpp:48
int64_t ts_ms_t
Unix timestamp in milliseconds since epoch.
Definition types.hpp:49
ts_ms_t now() noexcept
Get the current UTC timestamp in milliseconds.
Main namespace for the Time Shield library.