UFO 1.0.0
An Efficient Probabilistic 3D Mapping Framework That Embraces the Unknown
Loading...
Searching...
No Matches
timer.hpp
1
42#ifndef UFO_TIME_TIMER_HPP
43#define UFO_TIME_TIMER_HPP
44
45// STL
46#include <chrono>
47#include <cmath>
48
49namespace ufo
50{
51class Timer
52{
53 public:
54 void start();
55
56 void pause();
57
58 void resume();
59
60 void reset();
61
62 void resetCurrent();
63
64 void stop();
65
75
85 friend Timer operator+(Timer lhs, Timer rhs);
86
97
107 friend Timer operator-(Timer lhs, Timer rhs);
108
109 [[nodiscard]] bool running() const;
110
111 [[nodiscard]] bool paused() const;
112
113 template <class Period = std::chrono::seconds::period>
114 [[nodiscard]] double current() const
115 {
116 return toDouble<Period>(
117 running() ? current_ + (std::chrono::high_resolution_clock::now() - start_)
118 : current_);
119 }
120
121 [[nodiscard]] double currentSeconds() const;
122
123 [[nodiscard]] double currentMilliseconds() const;
124
125 [[nodiscard]] double currentMicroseconds() const;
126
127 [[nodiscard]] double currentNanoseconds() const;
128
129 template <class Period = std::chrono::seconds::period>
130 [[nodiscard]] double last() const
131 {
132 return toDouble<Period>(last_);
133 }
134
135 [[nodiscard]] double lastSeconds() const;
136
137 [[nodiscard]] double lastMilliseconds() const;
138
139 [[nodiscard]] double lastMicroseconds() const;
140
141 [[nodiscard]] double lastNanoseconds() const;
142
143 template <class Period = std::chrono::seconds::period>
144 [[nodiscard]] double total() const
145 {
146 return current<Period>() + toDouble<Period>(total_);
147 }
148
149 [[nodiscard]] double totalSeconds() const;
150
151 [[nodiscard]] double totalMilliseconds() const;
152
153 [[nodiscard]] double totalMicroseconds() const;
154
155 [[nodiscard]] double totalNanoseconds() const;
156
157 template <class Period = std::chrono::seconds::period>
158 [[nodiscard]] double min() const
159 {
160 return 0 < numSamples() ? toDouble<Period>(min_)
161 : std::numeric_limits<double>::quiet_NaN();
162 }
163
164 [[nodiscard]] double minSeconds() const;
165
166 [[nodiscard]] double minMilliseconds() const;
167
168 [[nodiscard]] double minMicroseconds() const;
169
170 [[nodiscard]] double minNanoseconds() const;
171
172 template <class Period = std::chrono::seconds::period>
173 [[nodiscard]] double max() const
174 {
175 return 0 < numSamples() ? toDouble<Period>(max_)
176 : std::numeric_limits<double>::quiet_NaN();
177 }
178
179 [[nodiscard]] double maxSeconds() const;
180
181 [[nodiscard]] double maxMilliseconds() const;
182
183 [[nodiscard]] double maxMicroseconds() const;
184
185 [[nodiscard]] double maxNanoseconds() const;
186
187 template <class Period = std::chrono::seconds::period>
188 [[nodiscard]] double mean() const
189 {
190 return toDouble<Period>(mean_);
191 }
192
193 [[nodiscard]] double meanSeconds() const;
194
195 [[nodiscard]] double meanMilliseconds() const;
196
197 [[nodiscard]] double meanMicroseconds() const;
198
199 [[nodiscard]] double meanNanoseconds() const;
200
201 template <class Period = std::chrono::seconds::period>
202 [[nodiscard]] double variance() const
203 {
204 return populationVariance<Period>();
205 }
206
207 [[nodiscard]] double varianceSeconds() const;
208
209 [[nodiscard]] double varianceMilliseconds() const;
210
211 [[nodiscard]] double varianceMicroseconds() const;
212
213 [[nodiscard]] double varianceNanoseconds() const;
214
215 template <class Period = std::chrono::seconds::period>
216 [[nodiscard]] double std() const
217 {
218 return std::sqrt(variance<Period>());
219 }
220
221 [[nodiscard]] double stdSeconds() const;
222
223 [[nodiscard]] double stdMilliseconds() const;
224
225 [[nodiscard]] double stdMicroseconds() const;
226
227 [[nodiscard]] double stdNanoseconds() const;
228
229 template <class Period = std::chrono::seconds::period>
230 [[nodiscard]] double sampleVariance() const
231 {
232 constexpr long double s =
233 static_cast<long double>(Period::den) / static_cast<long double>(Period::num);
234 return 1 < numSamples()
235 ? static_cast<double>(s * s * (sum_squares_diffs_ / (numSamples() - 1)))
236 : std::numeric_limits<double>::quiet_NaN();
237 }
238
239 [[nodiscard]] double sampleVarianceSeconds() const;
240
241 [[nodiscard]] double sampleVarianceMilliseconds() const;
242
243 [[nodiscard]] double sampleVarianceMicroseconds() const;
244
245 [[nodiscard]] double sampleVarianceNanoseconds() const;
246
247 template <class Period = std::chrono::seconds::period>
248 [[nodiscard]] double populationVariance() const
249 {
250 constexpr long double s =
251 static_cast<long double>(Period::den) / static_cast<long double>(Period::num);
252 return 0 < numSamples()
253 ? static_cast<double>(s * s * (sum_squares_diffs_ / numSamples()))
254 : std::numeric_limits<double>::quiet_NaN();
255 }
256
257 [[nodiscard]] double populationVarianceSeconds() const;
258
259 [[nodiscard]] double populationVarianceMilliseconds() const;
260
261 [[nodiscard]] double populationVarianceMicroseconds() const;
262
263 [[nodiscard]] double populationVarianceNanoseconds() const;
264
265 [[nodiscard]] int numSamples() const;
266
267 protected:
268 void start(std::chrono::time_point<std::chrono::high_resolution_clock> time);
269
270 void stop(std::chrono::time_point<std::chrono::high_resolution_clock> time);
271
272 void addSample(std::chrono::time_point<std::chrono::high_resolution_clock> start,
273 std::chrono::time_point<std::chrono::high_resolution_clock> stop);
274
275 private:
276 template <class Period, class Duration>
277 [[nodiscard]] static constexpr double toDouble(Duration dur)
278 {
279 return std::chrono::duration<double, Period>(dur).count();
280 }
281
282 protected:
283 std::chrono::time_point<std::chrono::high_resolution_clock> start_ = {};
284 // Used for pause/resume
285 std::chrono::high_resolution_clock::duration current_ =
286 std::chrono::high_resolution_clock::duration::zero();
287
288 private:
289 int samples_ = 0;
290 std::chrono::time_point<std::chrono::high_resolution_clock> last_time_point_ = {};
291 std::chrono::high_resolution_clock::duration last_ =
292 std::chrono::high_resolution_clock::duration::zero();
293 std::chrono::high_resolution_clock::duration total_ =
294 std::chrono::high_resolution_clock::duration::zero();
295 std::chrono::duration<double, std::chrono::high_resolution_clock::period> mean_ =
296 std::chrono::duration<double, std::chrono::high_resolution_clock::period>::zero();
297 double sum_squares_diffs_ = 0.0;
298 std::chrono::high_resolution_clock::duration min_ =
299 std::chrono::high_resolution_clock::duration::max();
300 std::chrono::high_resolution_clock::duration max_ =
301 std::chrono::high_resolution_clock::duration::min();
302
303 friend class Timing;
304};
305} // namespace ufo
306
307#endif // UFO_TIME_TIMER_HPP
friend Timer operator-(Timer lhs, Timer rhs)
Definition timer.cpp:100
Timer & operator-=(Timer rhs)
Definition timer.cpp:83
Timer & operator+=(Timer rhs)
Definition timer.cpp:43
friend Timer operator+(Timer lhs, Timer rhs)
Definition timer.cpp:69
STL namespace.
All vision-related classes and functions.
Definition cloud.hpp:49