C++ Utilities  4.8.0
Common C++ classes and routines used by my applications such as argument parser, IO and conversion utilities
timespan.cpp
Go to the documentation of this file.
1 #include "./timespan.h"
2 
3 #include "../conversion/stringconversion.h"
4 
5 #include <cmath>
6 #include <iomanip>
7 #include <sstream>
8 #include <vector>
9 
10 using namespace std;
11 using namespace ChronoUtilities;
12 using namespace ConversionUtilities;
13 
23 TimeSpan TimeSpan::fromString(const char *str, char separator)
24 {
25  vector<double> parts;
26  size_t partsSize = 1;
27  for (const char *i = str; *i; ++i) {
28  *i == separator && ++partsSize;
29  }
30  parts.reserve(partsSize);
31 
32  for (const char *i = str;;) {
33  if (*i == separator) {
34  parts.emplace_back(stringToNumber<double>(string(str, i)));
35  str = ++i;
36  } else if (*i == '\0') {
37  parts.emplace_back(stringToNumber<double>(string(str, i)));
38  break;
39  } else {
40  ++i;
41  }
42  }
43 
44  switch (parts.size()) {
45  case 0:
46  return TimeSpan();
47  case 1:
48  return TimeSpan::fromSeconds(parts.front());
49  case 2:
50  return TimeSpan::fromMinutes(parts.front()) + TimeSpan::fromSeconds(parts[1]);
51  case 3:
52  return TimeSpan::fromHours(parts.front()) + TimeSpan::fromMinutes(parts[1]) + TimeSpan::fromSeconds(parts[2]);
53  default:
54  return TimeSpan::fromDays(parts.front()) + TimeSpan::fromHours(parts[1]) + TimeSpan::fromMinutes(parts[2]) + TimeSpan::fromSeconds(parts[3]);
55  }
56 }
57 
64 string TimeSpan::toString(TimeSpanOutputFormat format, bool noMilliseconds) const
65 {
66  string result;
67  toString(result, format, noMilliseconds);
68  return result;
69 }
70 
79 void TimeSpan::toString(string &result, TimeSpanOutputFormat format, bool noMilliseconds) const
80 {
81  stringstream s(stringstream::in | stringstream::out);
82  if (isNegative())
83  s << "- ";
84  switch (format) {
85  case TimeSpanOutputFormat::Normal:
86  s << setfill('0') << setw(2) << floor(fabs(totalHours())) << ":" << setw(2) << minutes() << ":" << setw(2) << seconds() << " ";
87  break;
88  case TimeSpanOutputFormat::WithMeasures:
89  if (isNull()) {
90  s << "0 s ";
91  } else if (totalMilliseconds() < 1.0) {
92  s << setprecision(2) << (m_ticks / 10.0) << " µs ";
93  } else {
94  if (days()) {
95  s << days() << " d ";
96  }
97  if (hours()) {
98  s << hours() << " h ";
99  }
100  if (minutes()) {
101  s << minutes() << " min ";
102  }
103  if (seconds()) {
104  s << seconds() << " s ";
105  }
106  if (!noMilliseconds && milliseconds()) {
107  s << milliseconds() << " ms ";
108  }
109  }
110  break;
111  }
112  result = s.str().substr(0, static_cast<string::size_type>(s.tellp()) - 1);
113 }
TimeSpanOutputFormat
Specifies the output format.
Definition: timespan.h:22
Contains classes providing a means for handling date and time information.
Definition: datetime.h:12
Represents a time interval.
Definition: timespan.h:27
STL namespace.
Contains several functions providing conversions between different data types.