Duration.cpp
Go to the documentation of this file.
1#include "Duration.h"
2
3#include <iomanip>
4#include <sstream>
5
6#include <SimoxUtility/algorithm/string/string_tools.h>
7
9
10namespace armarx::core::time
11{
12
14 {
15 ;
16 }
17
18 Duration::Duration(std::int64_t microSeconds) : _microSeconds{microSeconds}
19 {
20 ;
21 }
22
24 Duration::MicroSeconds(const std::int64_t microSeconds)
25 {
26 return Duration(microSeconds);
27 }
28
30 Duration::MicroSecondsDouble(const double microSeconds)
31 {
32 return Duration(microSeconds);
33 }
34
35 std::int64_t
37 {
38 return _microSeconds;
39 }
40
41 double
43 {
44 return static_cast<double>(_microSeconds);
45 }
46
48 Duration::MilliSeconds(const std::int64_t milliSeconds)
49 {
50 return Duration::MicroSeconds(1'000 * milliSeconds);
51 }
52
54 Duration::MilliSecondsDouble(const double milliSeconds)
55 {
56 return Duration::MicroSeconds(1'000 * milliSeconds);
57 }
58
59 std::int64_t
61 {
62 return static_cast<std::int64_t>(toMilliSecondsDouble() + 0.5);
63 }
64
65 double
67 {
68 return static_cast<double>(_microSeconds) / 1'000;
69 }
70
72 Duration::Seconds(const std::int64_t seconds)
73 {
74 return Duration::MilliSeconds(1'000 * seconds);
75 }
76
78 Duration::SecondsDouble(const double seconds)
79 {
80 return Duration::MilliSeconds(1'000 * seconds);
81 }
82
83 std::int64_t
85 {
86 return static_cast<std::int64_t>(toSecondsDouble() + 0.5);
87 }
88
89 double
91 {
92 return toMilliSecondsDouble() / 1'000;
93 }
94
96 Duration::Minutes(const std::int64_t minutes)
97 {
98 return Duration::Seconds(60 * minutes);
99 }
100
102 Duration::MinutesDouble(const double minutes)
103 {
104 return Duration::Seconds(60 * minutes);
105 }
106
107 std::int64_t
109 {
110 return static_cast<std::int64_t>(toMinutesDouble() + 0.5);
111 }
112
113 double
115 {
116 return toSecondsDouble() / 60;
117 }
118
120 Duration::Hours(const std::int64_t hours)
121 {
122 return Duration::Minutes(60 * hours);
123 }
124
126 Duration::HoursDouble(const double hours)
127 {
128 return Duration::Minutes(60 * hours);
129 }
130
131 std::int64_t
133 {
134 return static_cast<std::int64_t>(toHoursDouble() + 0.5);
135 }
136
137 double
139 {
140 return toMinutesDouble() / 60;
141 }
142
144 Duration::Days(const std::int64_t days)
145 {
146 return Duration::Hours(24 * days);
147 }
148
150 Duration::DaysDouble(const double days)
151 {
152 return Duration::Hours(24 * days);
153 }
154
155 std::int64_t
157 {
158 return static_cast<std::int64_t>(toDaysDouble() + 0.5);
159 }
160
161 double
163 {
164 return toHoursDouble() / 24;
165 }
166
167 bool
169 {
170 return _microSeconds > 0;
171 }
172
173 bool
175 {
176 return _microSeconds == 0;
177 }
178
179 std::string
181 {
182 double time_count = toMicroSecondsDouble();
183 std::string unit = "µs";
184
185 if (time_count >= 1000)
186 {
187 time_count /= 1000;
188 unit = "ms";
189
190 if (time_count >= 1000)
191 {
192 time_count /= 1000;
193 unit = "s";
194
195 if (time_count >= 60)
196 {
197 time_count /= 60;
198 unit = "min";
199
200 if (time_count >= 60)
201 {
202 time_count /= 60;
203 unit = "h";
204
205 if (time_count >= 24)
206 {
207 time_count /= 24;
208 unit = "d";
209 }
210 }
211 }
212 }
213 }
214
215 std::stringstream ss;
216 ss << std::setprecision(3) << time_count;
217 return ss.str() + unit;
218 }
219
220 std::string
221 Duration::toDurationString(const std::string& format) const
222 {
223 const std::int64_t usec = _microSeconds % 1'000'000;
224 const std::int64_t msec =
225 (static_cast<double>(usec) / 1'000) + 0.5; // Rounding towards next integer.
226 const time_t time = static_cast<time_t>(static_cast<double>(_microSeconds) / 1'000'000);
227
228 struct tm tr;
229 localtime_r(&time, &tr);
230
231 char buf[32];
232 if (strftime(buf, sizeof(buf), format.c_str(), &tr) == 0)
233 {
234 return std::string();
235 }
236
237 std::string postformat(buf);
238 postformat = simox::alg::replace_all(postformat, "%msec", std::to_string(msec));
239 postformat = simox::alg::replace_all(postformat, "%usec", std::to_string(usec));
240 return postformat;
241 }
242
245 {
247 }
248
249 Duration&
251 {
253 return *this;
254 }
255
258 {
259 return Duration(-_microSeconds);
260 }
261
264 {
266 }
267
268 Duration&
270 {
272 return *this;
273 }
274
276 Duration::operator*(const double rhs) const
277 {
278 Duration t;
279 t._microSeconds = static_cast<std::int64_t>(static_cast<double>(_microSeconds) * rhs + 0.5);
280 return t;
281 }
282
284 Duration::operator*(const int rhs) const
285 {
286 return *this * static_cast<double>(rhs);
287 }
288
290 Duration::operator*(const std::int64_t rhs) const
291 {
292 return *this * static_cast<double>(rhs);
293 }
294
295 Duration&
296 Duration::operator*=(const double rhs)
297 {
298 _microSeconds = static_cast<std::int64_t>(static_cast<double>(_microSeconds) * rhs);
299 return *this;
300 }
301
302 Duration&
303 Duration::operator*=(const int rhs)
304 {
305 return *this *= static_cast<double>(rhs);
306 }
307
308 Duration&
309 Duration::operator*=(const std::int64_t rhs)
310 {
311 return *this *= static_cast<double>(rhs);
312 }
313
314 double
316 {
317 return static_cast<double>(_microSeconds) / static_cast<double>(rhs._microSeconds);
318 }
319
321 Duration::operator/(const double rhs) const
322 {
323 Duration t;
324 t._microSeconds = static_cast<std::int64_t>(static_cast<double>(_microSeconds) / rhs);
325 return t;
326 }
327
329 Duration::operator/(const int rhs) const
330 {
331 return *this / static_cast<double>(rhs);
332 }
333
335 Duration::operator/(const std::int64_t rhs) const
336 {
337 return *this / static_cast<double>(rhs);
338 }
339
340 Duration&
341 Duration::operator/=(const double rhs)
342 {
343 _microSeconds = static_cast<std::int64_t>(static_cast<double>(_microSeconds) / rhs);
344 return *this;
345 }
346
347 Duration&
348 Duration::operator/=(const int rhs)
349 {
350 return *this /= static_cast<double>(rhs);
351 }
352
353 Duration&
354 Duration::operator/=(const std::int64_t rhs)
355 {
356 return *this /= static_cast<double>(rhs);
357 }
358
359 bool
360 Duration::operator<(const Duration& rhs) const
361 {
362 return _microSeconds < rhs._microSeconds;
363 }
364
365 bool
366 Duration::operator<=(const Duration& rhs) const
367 {
368 return _microSeconds <= rhs._microSeconds;
369 }
370
371 bool
373 {
374 return _microSeconds == rhs._microSeconds;
375 }
376
377 bool
379 {
380 return _microSeconds != rhs._microSeconds;
381 }
382
383 bool
385 {
386 return _microSeconds >= rhs._microSeconds;
387 }
388
389 bool
391 {
392 return _microSeconds > rhs._microSeconds;
393 }
394
395 std::ostream&
396 operator<<(std::ostream& out, const Duration& rhs)
397 {
398 out << rhs.toDurationString();
399 return out;
400 }
401
402} // namespace armarx::core::time
Represents a duration.
Definition Duration.h:17
Duration & operator/=(double rhs)
Definition Duration.cpp:341
bool operator<=(const Duration &rhs) const
Definition Duration.cpp:366
Duration & operator*=(double rhs)
Definition Duration.cpp:296
static Duration DaysDouble(double days)
Constructs a duration in days.
Definition Duration.cpp:150
static Duration MicroSeconds(std::int64_t microSeconds)
Constructs a duration in microseconds.
Definition Duration.cpp:24
static Duration MicroSecondsDouble(double microSeconds)
Constructs a duration in microseconds.
Definition Duration.cpp:30
static Duration Minutes(std::int64_t minutes)
Constructs a duration in minutes.
Definition Duration.cpp:96
double operator/(const Duration &rhs) const
Definition Duration.cpp:315
Duration & operator+=(const Duration &rhs)
Definition Duration.cpp:250
static Duration Hours(std::int64_t hours)
Constructs a duration in hours.
Definition Duration.cpp:120
std::int64_t toHours() const
Returns the amount of hours.
Definition Duration.cpp:132
Duration operator+(const Duration &rhs) const
Definition Duration.cpp:244
static Duration Seconds(std::int64_t seconds)
Constructs a duration in seconds.
Definition Duration.cpp:72
bool operator>(const Duration &rhs) const
Definition Duration.cpp:390
static Duration MinutesDouble(double minutes)
Constructs a duration in minutes.
Definition Duration.cpp:102
std::int64_t toMinutes() const
Returns the amount of minutes.
Definition Duration.cpp:108
static Duration SecondsDouble(double seconds)
Constructs a duration in seconds.
Definition Duration.cpp:78
std::int64_t toDays() const
Returns the amount of days.
Definition Duration.cpp:156
double toHoursDouble() const
Returns the amount of hours.
Definition Duration.cpp:138
bool operator>=(const Duration &rhs) const
Definition Duration.cpp:384
std::int64_t toMilliSeconds() const
Returns the amount of milliseconds.
Definition Duration.cpp:60
double toSecondsDouble() const
Returns the amount of seconds.
Definition Duration.cpp:90
static Duration HoursDouble(double hours)
Constructs a duration in hours.
Definition Duration.cpp:126
std::int64_t toMicroSeconds() const
Returns the amount of microseconds.
Definition Duration.cpp:36
bool operator!=(const Duration &rhs) const
Definition Duration.cpp:378
double toMilliSecondsDouble() const
Returns the amount of milliseconds.
Definition Duration.cpp:66
Duration & operator-=(const Duration &rhs)
Definition Duration.cpp:269
double toDaysDouble() const
Returns the amount of days.
Definition Duration.cpp:162
bool operator==(const Duration &rhs) const
Definition Duration.cpp:372
Duration operator*(double rhs) const
Definition Duration.cpp:276
std::int64_t _microSeconds
Current duration in microseconds.
Definition Duration.h:270
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition Duration.cpp:48
bool isPositive() const
Tests whether the duration is positive (value in µs > 0).
Definition Duration.cpp:168
double toMinutesDouble() const
Returns the amount of minutes.
Definition Duration.cpp:114
static Duration Days(std::int64_t days)
Constructs a duration in days.
Definition Duration.cpp:144
Duration operator-() const
Definition Duration.cpp:257
double toMicroSecondsDouble() const
Returns the amount of microseconds.
Definition Duration.cpp:42
static Duration MilliSecondsDouble(double milliSeconds)
Constructs a duration in milliseconds.
Definition Duration.cpp:54
bool operator<(const Duration &rhs) const
Definition Duration.cpp:360
std::int64_t toSeconds() const
Returns the amount of seconds.
Definition Duration.cpp:84
Duration()
Constructs a zero-duration.
Definition Duration.cpp:13
std::string toDurationString() const
String representation of the current duration in minimal/default format.
Definition Duration.cpp:180
std::ostream & operator<<(std::ostream &out, const DateTime &rhs)
Definition DateTime.cpp:203