Time Shield Library
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_ELAPSED_TIMER_HPP_INCLUDED
4#define _TIME_SHIELD_ELAPSED_TIMER_HPP_INCLUDED
5
12
13#include "config.hpp"
14#include "types.hpp"
15
16#include <chrono>
17#include <cstdint>
18
19namespace time_shield {
20
26 public:
27 using clock = std::chrono::steady_clock;
28 using duration = clock::duration;
29 using time_point = clock::time_point;
30
32 ElapsedTimer() noexcept = default;
33
35 explicit ElapsedTimer(bool start_immediately) noexcept {
36 if (start_immediately) {
37 start();
38 }
39 }
40
42 void start() noexcept {
43 m_start_time = clock::now();
44 m_is_running = true;
45 }
46
48 TIME_SHIELD_NODISCARD duration restart() noexcept {
49 const time_point now = clock::now();
50 const duration delta = m_is_running ? now - m_start_time : duration::zero();
52 m_is_running = true;
53 return delta;
54 }
55
57 TIME_SHIELD_NODISCARD ts_ms_t restart_ms(ts_ms_t now_ms) noexcept {
58 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::milliseconds(now_ms));
59 const time_point now(since_epoch);
60 const duration delta = m_is_running ? now - m_start_time : duration::zero();
62 m_is_running = true;
63 return std::chrono::duration_cast<std::chrono::milliseconds>(delta).count();
64 }
65
67 TIME_SHIELD_NODISCARD ts_t restart_sec(ts_t now_sec) noexcept {
68 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::seconds(now_sec));
69 const time_point now(since_epoch);
70 const duration delta = m_is_running ? now - m_start_time : duration::zero();
72 m_is_running = true;
73 return std::chrono::duration_cast<std::chrono::seconds>(delta).count();
74 }
75
77 void invalidate() noexcept {
78 m_is_running = false;
79 }
80
82 TIME_SHIELD_NODISCARD bool is_running() const noexcept {
83 return m_is_running;
84 }
85
87 TIME_SHIELD_NODISCARD bool is_valid() const noexcept {
88 return m_is_running;
89 }
90
92 TIME_SHIELD_NODISCARD time_point start_time() const noexcept {
93 return m_start_time;
94 }
95
97 TIME_SHIELD_NODISCARD duration elapsed() const noexcept {
98 return elapsed(clock::now());
99 }
100
102 TIME_SHIELD_NODISCARD duration elapsed(time_point now) const noexcept {
103 if (!m_is_running) {
104 return duration::zero();
105 }
106 return now - m_start_time;
107 }
108
110 TIME_SHIELD_NODISCARD std::int64_t elapsed_ns() const noexcept {
112 }
113
115 TIME_SHIELD_NODISCARD std::int64_t elapsed_ns(std::int64_t now_ns) const noexcept {
116 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::nanoseconds(now_ns));
117 const time_point now(since_epoch);
118 return std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed(now)).count();
119 }
120
122 TIME_SHIELD_NODISCARD ts_ms_t elapsed_ms() const noexcept {
124 }
125
127 TIME_SHIELD_NODISCARD ts_ms_t elapsed_ms(ts_ms_t now_ms) const noexcept {
128 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::milliseconds(now_ms));
129 const time_point now(since_epoch);
130 return std::chrono::duration_cast<std::chrono::milliseconds>(elapsed(now)).count();
131 }
132
134 TIME_SHIELD_NODISCARD ts_t elapsed_sec() const noexcept {
136 }
137
139 TIME_SHIELD_NODISCARD ts_t elapsed_sec(ts_t now_sec) const noexcept {
140 const duration since_epoch = std::chrono::duration_cast<duration>(std::chrono::seconds(now_sec));
141 const time_point now(since_epoch);
142 return std::chrono::duration_cast<std::chrono::seconds>(elapsed(now)).count();
143 }
144
146 template <class Duration>
147 TIME_SHIELD_NODISCARD typename Duration::rep elapsed_count() const noexcept {
148 return std::chrono::duration_cast<Duration>(elapsed()).count();
149 }
150
152 TIME_SHIELD_NODISCARD bool has_expired(ts_ms_t timeout_ms) const noexcept {
153 if (!m_is_running) {
154 return false;
155 }
156 if (timeout_ms <= 0) {
157 return true;
158 }
159 return elapsed_ms() >= timeout_ms;
160 }
161
163 TIME_SHIELD_NODISCARD bool has_expired_sec(ts_t timeout_sec) const noexcept {
164 if (!m_is_running) {
165 return false;
166 }
167 if (timeout_sec <= 0) {
168 return true;
169 }
170 return elapsed() >= std::chrono::seconds(timeout_sec);
171 }
172
174 TIME_SHIELD_NODISCARD std::int64_t ms_since_reference() const noexcept {
175 if (!m_is_running) {
176 return 0;
177 }
178 return std::chrono::duration_cast<std::chrono::milliseconds>(m_start_time.time_since_epoch()).count();
179 }
180
181 private:
183 bool m_is_running{false};
184 };
185
186} // namespace time_shield
187
188#endif // _TIME_SHIELD_ELAPSED_TIMER_HPP_INCLUDED
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 currently 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.
Configuration macros for the library.
int64_t ts_t
Unix timestamp in seconds since 1970‑01‑01T00:00:00Z.
Definition types.hpp:46
int64_t ts_ms_t
Unix timestamp in milliseconds since epoch.
Definition types.hpp:47
ts_ms_t now() noexcept
Get the current UTC timestamp in milliseconds.
Main namespace for the Time Shield library.
Type definitions for time-related units and formats.