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 
10 namespace armarx::core::time
11 {
12 
13  Duration::Duration() : _microSeconds{0}
14  {
15  ;
16  }
17 
18  Duration::Duration(std::int64_t microSeconds) : _microSeconds{microSeconds}
19  {
20  ;
21  }
22 
23  Duration
24  Duration::MicroSeconds(const std::int64_t microSeconds)
25  {
26  return Duration(microSeconds);
27  }
28 
29  Duration
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 
47  Duration
48  Duration::MilliSeconds(const std::int64_t milliSeconds)
49  {
50  return Duration::MicroSeconds(1'000 * milliSeconds);
51  }
52 
53  Duration
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 
71  Duration
72  Duration::Seconds(const std::int64_t seconds)
73  {
74  return Duration::MilliSeconds(1'000 * seconds);
75  }
76 
77  Duration
78  Duration::SecondsDouble(const double seconds)
79  {
80  return Duration::MilliSeconds(1'000 * seconds);
81  }
82 
83  std::int64_t
84  Duration::toSeconds() const
85  {
86  return static_cast<std::int64_t>(toSecondsDouble() + 0.5);
87  }
88 
89  double
90  Duration::toSecondsDouble() const
91  {
92  return toMilliSecondsDouble() / 1'000;
93  }
94 
95  Duration
96  Duration::Minutes(const std::int64_t minutes)
97  {
98  return Duration::Seconds(60 * minutes);
99  }
100 
101  Duration
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 
119  Duration
120  Duration::Hours(const std::int64_t hours)
121  {
122  return Duration::Minutes(60 * hours);
123  }
124 
125  Duration
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 
143  Duration
144  Duration::Days(const std::int64_t days)
145  {
146  return Duration::Hours(24 * days);
147  }
148 
149  Duration
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 
243  Duration
244  Duration::operator+(const Duration& rhs) const
245  {
246  return Duration(_microSeconds + rhs._microSeconds);
247  }
248 
249  Duration&
250  Duration::operator+=(const Duration& rhs)
251  {
252  _microSeconds += rhs._microSeconds;
253  return *this;
254  }
255 
256  Duration
257  Duration::operator-() const
258  {
259  return Duration(-_microSeconds);
260  }
261 
262  Duration
263  Duration::operator-(const Duration& rhs) const
264  {
265  return Duration(_microSeconds - rhs._microSeconds);
266  }
267 
268  Duration&
269  Duration::operator-=(const Duration& rhs)
270  {
271  _microSeconds -= rhs._microSeconds;
272  return *this;
273  }
274 
275  Duration
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 
283  Duration
284  Duration::operator*(const int rhs) const
285  {
286  return *this * static_cast<double>(rhs);
287  }
288 
289  Duration
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
315  Duration::operator/(const Duration& rhs) const
316  {
317  return static_cast<double>(_microSeconds) / static_cast<double>(rhs._microSeconds);
318  }
319 
320  Duration
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 
328  Duration
329  Duration::operator/(const int rhs) const
330  {
331  return *this / static_cast<double>(rhs);
332  }
333 
334  Duration
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
372  Duration::operator==(const Duration& rhs) const
373  {
374  return _microSeconds == rhs._microSeconds;
375  }
376 
377  bool
378  Duration::operator!=(const Duration& rhs) const
379  {
380  return _microSeconds != rhs._microSeconds;
381  }
382 
383  bool
384  Duration::operator>=(const Duration& rhs) const
385  {
386  return _microSeconds >= rhs._microSeconds;
387  }
388 
389  bool
390  Duration::operator>(const Duration& rhs) const
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
armarx::core::time::Duration::toMinutes
std::int64_t toMinutes() const
Returns the amount of minutes.
Definition: Duration.cpp:108
armarx::core::time::Duration::toDays
std::int64_t toDays() const
Returns the amount of days.
Definition: Duration.cpp:156
armarx::core::time::Duration::toSecondsDouble
double toSecondsDouble() const
Returns the amount of seconds.
Definition: Duration.cpp:90
Duration.h
armarx::core::time
Definition: Clock.cpp:13
armarx::core::time::Duration::toMilliSecondsDouble
double toMilliSecondsDouble() const
Returns the amount of milliseconds.
Definition: Duration.cpp:66
armarx::core::time::Duration::toHoursDouble
double toHoursDouble() const
Returns the amount of hours.
Definition: Duration.cpp:138
armarx::core::time::Duration::isPositive
bool isPositive() const
Tests whether the duration is positive (value in µs > 0).
Definition: Duration.cpp:168
armarx::core::time::Duration::MicroSecondsDouble
static Duration MicroSecondsDouble(double microSeconds)
Constructs a duration in microseconds.
Definition: Duration.cpp:30
Clock.h
armarx::core::time::Duration::Hours
static Duration Hours(std::int64_t hours)
Constructs a duration in hours.
Definition: Duration.cpp:120
armarx::core::time::Duration::DaysDouble
static Duration DaysDouble(double days)
Constructs a duration in days.
Definition: Duration.cpp:150
armarx::core::time::Duration::Seconds
static Duration Seconds(std::int64_t seconds)
Constructs a duration in seconds.
Definition: Duration.cpp:72
armarx::core::time::Duration::HoursDouble
static Duration HoursDouble(double hours)
Constructs a duration in hours.
Definition: Duration.cpp:126
armarx::core::time::Duration::SecondsDouble
static Duration SecondsDouble(double seconds)
Constructs a duration in seconds.
Definition: Duration.cpp:78
armarx::core::time::Duration::Minutes
static Duration Minutes(std::int64_t minutes)
Constructs a duration in minutes.
Definition: Duration.cpp:96
armarx::core::time::Duration::toMinutesDouble
double toMinutesDouble() const
Returns the amount of minutes.
Definition: Duration.cpp:114
armarx::core::time::Duration::toHours
std::int64_t toHours() const
Returns the amount of hours.
Definition: Duration.cpp:132
armarx::core::time::Duration::_microSeconds
std::int64_t _microSeconds
Current duration in microseconds.
Definition: Duration.h:270
armarx::core::time::Duration
Represents a duration.
Definition: Duration.h:16
armarx::core::time::Duration::toDurationString
std::string toDurationString() const
String representation of the current duration in minimal/default format.
Definition: Duration.cpp:180
armarx::core::time::Duration::MinutesDouble
static Duration MinutesDouble(double minutes)
Constructs a duration in minutes.
Definition: Duration.cpp:102
armarx::core::time::Duration::toMilliSeconds
std::int64_t toMilliSeconds() const
Returns the amount of milliseconds.
Definition: Duration.cpp:60
armarx::core::time::Duration::toMicroSeconds
std::int64_t toMicroSeconds() const
Returns the amount of microseconds.
Definition: Duration.cpp:36
armarx::core::time::Duration::Days
static Duration Days(std::int64_t days)
Constructs a duration in days.
Definition: Duration.cpp:144
armarx::core::time::Duration::MicroSeconds
static Duration MicroSeconds(std::int64_t microSeconds)
Constructs a duration in microseconds.
Definition: Duration.cpp:24
armarx::core::time::Duration::toDaysDouble
double toDaysDouble() const
Returns the amount of days.
Definition: Duration.cpp:162
armarx::core::time::Duration::MilliSeconds
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition: Duration.cpp:48
armarx::core::time::Duration::isZero
bool isZero() const
Definition: Duration.cpp:174
armarx::core::time::Duration::toMicroSecondsDouble
double toMicroSecondsDouble() const
Returns the amount of microseconds.
Definition: Duration.cpp:42
armarx::core::time::Duration::Duration
Duration()
Constructs a zero-duration.
Definition: Duration.cpp:13