#include <stdbool.h>
#include <stdint.h>
#include <time.h>
#include "time/timex.h"
const Duration Nanosecond = 1;
const Duration Microsecond = 1000 * Nanosecond;
const Duration Millisecond = 1000 * Microsecond;
const Duration Second = 1000 * Millisecond;
const Duration Minute = 60 * Second;
const Duration Hour = 60 * Minute;
#pragma region Conversion
int64_t dur_to_micro(Duration d) {
return d / Microsecond;
}
int64_t dur_to_milli(Duration d) {
return d / Millisecond;
}
double dur_to_seconds(Duration d) {
int64_t sec = d / Second;
int64_t nsec = d % Second;
return (double)sec + (double)nsec / 1e9;
}
double dur_to_minutes(Duration d) {
int64_t min = d / Minute;
int64_t nsec = d % Minute;
return (double)min + (double)nsec / (60 * 1e9);
}
double dur_to_hours(Duration d) {
int64_t hour = d / Hour;
int64_t nsec = d % Hour;
return (double)hour + (double)nsec / (60 * 60 * 1e9);
}
#pragma endregion
#pragma region Rounding
static bool dless_than_half(Duration x, Duration y) {
return (uint64_t)x + (uint64_t)x < (uint64_t)y;
}
Duration dur_truncate(Duration d, Duration m) {
if (m <= 0) {
return d;
}
return d - d % m;
}
Duration dur_round(Duration d, Duration m) {
if (m <= 0) {
return d;
}
int64_t r = d % m;
if (d < 0) {
r = -r;
if (dless_than_half(r, m)) {
return d + r;
}
int64_t d1 = d - m + r;
if (d1 < d) {
return d1;
}
return MIN_DURATION; }
if (dless_than_half(r, m)) {
return d - r;
}
int64_t d1 = d + m - r;
if (d1 > d) {
return d1;
}
return MAX_DURATION; }
Duration dur_abs(Duration d) {
if (d == MIN_DURATION) {
return MAX_DURATION;
}
return d < 0 ? -d : d;
}
#pragma endregion