13 #ifndef __STOUT_DURATION_HPP__
14 #define __STOUT_DURATION_HPP__
39 while (index < s.size()) {
40 if (isdigit(s[index]) || s[
index] ==
'.') {
45 Try<double> value = numify<double>(s.substr(0, index));
51 const std::string unit = s.substr(index);
56 }
else if (unit ==
"us") {
58 }
else if (unit ==
"ms") {
60 }
else if (unit ==
"secs") {
62 }
else if (unit ==
"mins") {
64 }
else if (unit ==
"hrs") {
66 }
else if (unit ==
"days") {
68 }
else if (unit ==
"weeks") {
72 "Unknown duration unit '" + unit +
"'; supported units are"
73 " 'ns', 'us', 'ms', 'secs', 'mins', 'hrs', 'days', and 'weeks'");
76 double nanos = value.
get() * factor;
77 if (nanos >
max().nanos || nanos <
min().nanos) {
79 "Argument out of the range that a Duration can represent due"
80 " to int64_t's size limit");
86 return Error(
"Invalid duration '" + s +
"'");
98 int64_t
ns()
const {
return nanos; }
101 double secs()
const {
return static_cast<double>(nanos) /
SECONDS; }
102 double mins()
const {
return static_cast<double>(nanos) /
MINUTES; }
103 double hrs()
const {
return static_cast<double>(nanos) /
HOURS; }
104 double days()
const {
return static_cast<double>(nanos) /
DAYS; }
105 double weeks()
const {
return static_cast<double>(nanos) /
WEEKS; }
113 t.tv_sec =
static_cast<decltype(t.tv_sec)
>(
ns() /
SECONDS);
114 t.tv_usec =
static_cast<decltype(t.tv_usec)
>(
138 template <
typename T>
141 nanos =
static_cast<int64_t
>(nanos * multiplier);
145 template <
typename T>
148 nanos =
static_cast<int64_t
>(nanos / divisor);
166 template <
typename T>
170 product *= multiplier;
174 template <
typename T>
202 : nanos(value * unit) {}
206 constexpr
Duration(
double value, int64_t unit)
207 : nanos(static_cast<int64_t>(value * unit)) {}
212 std::ostream& stream,
225 double value()
const {
return static_cast<double>(this->
ns()); }
227 static std::string
units() {
return "ns"; }
241 static std::string
units() {
return "us"; }
255 static std::string
units() {
return "ms"; }
269 static std::string
units() {
return "secs"; }
283 static std::string
units() {
return "mins"; }
290 explicit constexpr
Hours(int64_t hours)
297 static std::string
units() {
return "hrs"; }
311 static std::string
units() {
return "days"; }
324 static std::string
units() {
return "weeks"; }
331 std::streamsize precision =
332 stream.precision(std::numeric_limits<double>::digits10);
343 duration = duration_ * -1;
353 int64_t nanoseconds = duration.
ns();
364 }
else if (duration <
Seconds(1)) {
371 }
else if (duration <
Minutes(1)) {
378 }
else if (duration <
Hours(1)) {
385 }
else if (duration <
Days(1)) {
392 }
else if (duration <
Weeks(1)) {
409 stream.precision(precision);
418 return Error(
"Argument out of the range that a Duration can represent due "
419 "to int64_t's size limit");
437 #endif // __STOUT_DURATION_HPP__
double value() const
Definition: duration.hpp:309
double weeks() const
Definition: duration.hpp:105
Duration operator/(T divisor) const
Definition: duration.hpp:175
Try< Diff > diff(const std::string &from, const std::string &to)
Definition: svn.hpp:72
static std::string units()
Definition: duration.hpp:241
double value() const
Definition: duration.hpp:253
Definition: errorbase.hpp:35
static constexpr int64_t MICROSECONDS
Definition: duration.hpp:192
double value() const
Definition: duration.hpp:225
Duration & operator-=(const Duration &that)
Definition: duration.hpp:132
bool operator!=(const Duration &d) const
Definition: duration.hpp:124
double value() const
Definition: duration.hpp:295
bool operator>=(const Duration &d) const
Definition: duration.hpp:122
static std::string units()
Definition: duration.hpp:283
Duration operator*(T multiplier) const
Definition: duration.hpp:167
Duration operator+(const Duration &that) const
Definition: duration.hpp:152
double value() const
Definition: duration.hpp:281
constexpr Hours(const Duration &d)
Definition: duration.hpp:293
bool operator>(const Duration &d) const
Definition: duration.hpp:121
constexpr Duration(int64_t value, int64_t unit)
Definition: duration.hpp:201
static constexpr int64_t HOURS
Definition: duration.hpp:196
static constexpr int64_t MINUTES
Definition: duration.hpp:195
static constexpr int64_t SECONDS
Definition: duration.hpp:194
constexpr Microseconds(const Duration &d)
Definition: duration.hpp:237
constexpr Days(int64_t days)
Definition: duration.hpp:304
static Try< Duration > create(double seconds)
Definition: duration.hpp:415
double ms() const
Definition: duration.hpp:100
constexpr Weeks(int64_t value)
Definition: duration.hpp:318
bool operator==(const Duration &d) const
Definition: duration.hpp:123
Definition: duration.hpp:32
Duration(const timeval &t)
Definition: duration.hpp:93
constexpr Milliseconds(const Duration &d)
Definition: duration.hpp:251
double mins() const
Definition: duration.hpp:102
Duration operator-(const Duration &that) const
Definition: duration.hpp:159
static constexpr int64_t DAYS
Definition: duration.hpp:197
static std::string units()
Definition: duration.hpp:297
Result< int > index(const std::string &link)
double days() const
Definition: duration.hpp:104
bool operator<=(const Duration &d) const
Definition: duration.hpp:120
static std::string units()
Definition: duration.hpp:311
Definition: duration.hpp:245
Duration & operator*=(T multiplier)
Definition: duration.hpp:139
constexpr Minutes(int64_t minutes)
Definition: duration.hpp:276
Definition: duration.hpp:273
Option< T > max(const Option< T > &left, const Option< T > &right)
Definition: option.hpp:199
Definition: duration.hpp:259
static constexpr int64_t MILLISECONDS
Definition: duration.hpp:193
constexpr Days(const Duration &d)
Definition: duration.hpp:307
constexpr Minutes(const Duration &d)
Definition: duration.hpp:279
int64_t ns() const
Definition: duration.hpp:98
Option< T > min(const Option< T > &left, const Option< T > &right)
Definition: option.hpp:170
constexpr Weeks(const Duration &d)
Definition: duration.hpp:320
double value() const
Definition: duration.hpp:267
Duration & operator+=(const Duration &that)
Definition: duration.hpp:126
Definition: duration.hpp:301
double secs() const
Definition: duration.hpp:101
bool operator<(const Duration &d) const
Definition: duration.hpp:119
static Try error(const E &e)
Definition: try.hpp:42
static constexpr int64_t NANOSECONDS
Definition: duration.hpp:191
Definition: duration.hpp:287
Duration & operator/=(T divisor)
Definition: duration.hpp:146
double hrs() const
Definition: duration.hpp:103
constexpr Seconds(const Duration &d)
Definition: duration.hpp:265
Definition: duration.hpp:231
bool isError() const
Definition: try.hpp:71
static std::string units()
Definition: duration.hpp:269
static constexpr Duration zero()
Definition: duration.hpp:188
std::ostream & operator<<(std::ostream &stream, const Call::Type &type)
Definition: agent.hpp:28
double value() const
Definition: duration.hpp:239
constexpr Hours(int64_t hours)
Definition: duration.hpp:290
double us() const
Definition: duration.hpp:99
struct timeval timeval() const
Definition: duration.hpp:107
friend std::ostream & operator<<(std::ostream &stream, const Duration &duration)
Definition: duration.hpp:328
constexpr Nanoseconds(const Duration &d)
Definition: duration.hpp:223
static std::string units()
Definition: duration.hpp:324
Definition: duration.hpp:217
double value() const
Definition: duration.hpp:322
static constexpr int64_t WEEKS
Definition: duration.hpp:198
constexpr Duration()
Definition: duration.hpp:91
constexpr Milliseconds(int64_t milliseconds)
Definition: duration.hpp:248
static Try< Duration > parse(const std::string &s)
Definition: duration.hpp:35
Definition: duration.hpp:315
const T & get() const
Definition: try.hpp:73
static constexpr Duration min()
Definition: duration.hpp:432
static std::string units()
Definition: duration.hpp:227
static constexpr Duration max()
Definition: duration.hpp:426
static std::string units()
Definition: duration.hpp:255
constexpr Seconds(int64_t seconds)
Definition: duration.hpp:262
constexpr Microseconds(int64_t microseconds)
Definition: duration.hpp:234
constexpr Nanoseconds(int64_t nanoseconds)
Definition: duration.hpp:220