OGLplus  (0.59.0) a C++ wrapper for rendering APIs

timeout.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_TIMEOUT_HPP
10 #define EAGINE_TIMEOUT_HPP
11 
12 #include "nothing.hpp"
13 #include <chrono>
14 
15 namespace eagine {
16 //------------------------------------------------------------------------------
20 class time_measure {
21  using _clock = std::chrono::steady_clock;
22 
23 public:
25  time_measure() noexcept
26  : _start{_clock::now()} {}
27 
29  auto elapsed_time() const noexcept {
30  return _clock::now() - _start;
31  }
32 
34  auto seconds() const noexcept {
35  return std::chrono::duration_cast<std::chrono::duration<float>>(
36  elapsed_time());
37  }
38 
39 private:
40  _clock::time_point _start{};
41 };
42 //------------------------------------------------------------------------------
47 class timeout {
48  using _clock = std::chrono::steady_clock;
49 
50 public:
53  timeout() noexcept
54  : _timeout{_clock::now()} {}
55 
59  timeout(_clock::duration duration, _clock::duration initial) noexcept
60  : _duration{duration}
61  , _timeout{_clock::now() + initial} {}
62 
66  timeout(_clock::duration duration, nothing_t) noexcept
67  : timeout{duration, _clock::duration::zero()} {}
68 
72  timeout(_clock::duration duration) noexcept
73  : timeout{duration, duration} {}
74 
78  template <typename R, typename P>
79  timeout(std::chrono::duration<R, P> duration) noexcept
80  : timeout{std::chrono::duration_cast<_clock::duration>(duration)} {}
81 
83  auto reset() noexcept -> auto& {
84  _timeout = std::chrono::steady_clock::now() + _duration;
85  return *this;
86  }
87 
89  auto reset(_clock::duration duration, _clock::duration initial) noexcept
90  -> auto& {
91  _duration = duration;
92  _timeout = std::chrono::steady_clock::now() + initial;
93  return *this;
94  }
95 
98  auto reset(_clock::duration duration, nothing_t) noexcept -> auto& {
99  return reset(duration, _clock::duration::zero());
100  }
101 
104  auto reset(_clock::duration duration) noexcept -> auto& {
105  return reset(duration, duration);
106  }
107 
109  auto elapsed_time() const noexcept {
110  return _clock::now() - _timeout + _duration;
111  }
112 
116  auto is_expired() const noexcept -> bool {
117  return _clock::now() >= _timeout;
118  }
119 
122  explicit operator bool() const noexcept {
123  return is_expired();
124  }
125 
129  auto period() const noexcept -> auto& {
130  return _duration;
131  }
132 
133 private:
134  _clock::duration _duration{};
135  _clock::time_point _timeout{};
136 };
137 //------------------------------------------------------------------------------
142 class resetting_timeout : public timeout {
143 public:
144  using timeout::timeout;
145 
147  explicit operator bool() noexcept {
148  const auto result = is_expired();
149  if(result) {
150  reset();
151  }
152  return result;
153  }
154 };
155 
156 } // namespace eagine
157 
158 #endif // EAGINE_TIMEOUT_HPP
timeout(std::chrono::duration< R, P > duration) noexcept
Construction from the default duration.
Definition: timeout.hpp:79
timeout(_clock::duration duration, nothing_t) noexcept
Construction from the default and zero initial timeout duration.
Definition: timeout.hpp:66
timeout(_clock::duration duration, _clock::duration initial) noexcept
Construction from the default and initial timeout duration.
Definition: timeout.hpp:59
Common code is placed in this namespace.
Definition: eagine.hpp:21
Class that measures elapsed time since instance construction.
Definition: timeout.hpp:20
Class representing "none" / "nothing" values.
Definition: nothing.hpp:17
auto reset() noexcept -> auto &
Resets the timeout using the previously specified duration.
Definition: timeout.hpp:83
time_measure() noexcept
Default constructor. Saves the current time.
Definition: timeout.hpp:25
auto is_expired() const noexcept -> bool
Indicates if the timeout is expired.
Definition: timeout.hpp:116
timeout(_clock::duration duration) noexcept
Construction from the default duration.
Definition: timeout.hpp:72
timeout() noexcept
Default construction. Saves current time. Immediately expires.
Definition: timeout.hpp:53
auto seconds() const noexcept
Returns the time since construction in seconds.
Definition: timeout.hpp:34
auto reset(_clock::duration duration) noexcept -> auto &
Resets the timeout using the specified duration value.
Definition: timeout.hpp:104
auto elapsed_time() const noexcept
Returns the time since construction using clock's representation.
Definition: timeout.hpp:29
auto period() const noexcept -> auto &
Returns the timeout period.
Definition: timeout.hpp:129
static auto zero(basic_span< T, P, S > spn) -> std::enable_if_t< std::is_integral_v< T >||std::is_floating_point_v< T >, basic_span< T, P, S >>
Fills a span with zero value of type T.
Definition: span_algo.hpp:548
Class representing a timeout since construction or reset.
Definition: timeout.hpp:47
auto reset(_clock::duration duration, _clock::duration initial) noexcept -> auto &
Resets the timeout using the specified duration values.
Definition: timeout.hpp:89
auto elapsed_time() const noexcept
Returns the time since reset as clocks duration type.
Definition: timeout.hpp:109
auto reset(_clock::duration duration, nothing_t) noexcept -> auto &
Resets the timeout using the specified duration values.
Definition: timeout.hpp:98
Specialization of timeout that resets when tested for expiration.
Definition: timeout.hpp:142

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).