#![allow(trivial_numeric_casts, clippy::use_self)]
use core::time::Duration as StdDuration;
use crate::Duration;
pub trait NumericalDuration {
fn nanoseconds(self) -> Duration;
fn microseconds(self) -> Duration;
fn milliseconds(self) -> Duration;
fn seconds(self) -> Duration;
fn minutes(self) -> Duration;
fn hours(self) -> Duration;
fn days(self) -> Duration;
fn weeks(self) -> Duration;
}
macro_rules! impl_numerical_duration {
($($type:ty),+ $(,)?) => {$(
impl NumericalDuration for $type {
fn nanoseconds(self) -> Duration {
Duration::nanoseconds(self as _)
}
fn microseconds(self) -> Duration {
Duration::microseconds(self as _)
}
fn milliseconds(self) -> Duration {
Duration::milliseconds(self as _)
}
fn seconds(self) -> Duration {
Duration::seconds(self as _)
}
fn minutes(self) -> Duration {
Duration::minutes(self as _)
}
fn hours(self) -> Duration {
Duration::hours(self as _)
}
fn days(self) -> Duration {
Duration::days(self as _)
}
fn weeks(self) -> Duration {
Duration::weeks(self as _)
}
}
)+};
}
macro_rules! impl_numerical_duration_nonzero {
($($type:ty),+ $(,)?) => {$(
impl NumericalDuration for $type {
fn nanoseconds(self) -> Duration {
Duration::nanoseconds(self.get() as _)
}
fn microseconds(self) -> Duration {
Duration::microseconds(self.get() as _)
}
fn milliseconds(self) -> Duration {
Duration::milliseconds(self.get() as _)
}
fn seconds(self) -> Duration {
Duration::seconds(self.get() as _)
}
fn minutes(self) -> Duration {
Duration::minutes(self.get() as _)
}
fn hours(self) -> Duration {
Duration::hours(self.get() as _)
}
fn days(self) -> Duration {
Duration::days(self.get() as _)
}
fn weeks(self) -> Duration {
Duration::weeks(self.get() as _)
}
}
)+};
}
macro_rules! impl_numerical_duration_float {
($($type:ty),+ $(,)?) => {$(
impl NumericalDuration for $type {
fn nanoseconds(self) -> Duration {
Duration::nanoseconds(self as _)
}
fn microseconds(self) -> Duration {
Duration::nanoseconds((self * 1_000.) as _)
}
fn milliseconds(self) -> Duration {
Duration::nanoseconds((self * 1_000_000.) as _)
}
fn seconds(self) -> Duration {
Duration::nanoseconds((self * 1_000_000_000.) as _)
}
fn minutes(self) -> Duration {
Duration::nanoseconds((self * 60_000_000_000.) as _)
}
fn hours(self) -> Duration {
Duration::nanoseconds((self * 3_600_000_000_000.) as _)
}
fn days(self) -> Duration {
Duration::nanoseconds((self * 86_400_000_000_000.) as _)
}
fn weeks(self) -> Duration {
Duration::nanoseconds((self * 604_800_000_000_000.) as _)
}
}
)+};
}
impl_numerical_duration![u8, u16, u32, i8, i16, i32, i64];
impl_numerical_duration_nonzero![
core::num::NonZeroU8,
core::num::NonZeroU16,
core::num::NonZeroU32,
core::num::NonZeroI8,
core::num::NonZeroI16,
core::num::NonZeroI32,
core::num::NonZeroI64,
];
impl_numerical_duration_float![f32, f64];
pub trait NumericalStdDuration {
fn std_nanoseconds(self) -> StdDuration;
fn std_microseconds(self) -> StdDuration;
fn std_milliseconds(self) -> StdDuration;
fn std_seconds(self) -> StdDuration;
fn std_minutes(self) -> StdDuration;
fn std_hours(self) -> StdDuration;
fn std_days(self) -> StdDuration;
fn std_weeks(self) -> StdDuration;
}
macro_rules! impl_numerical_std_duration {
($($type:ty),+ $(,)?) => {$(
impl NumericalStdDuration for $type {
fn std_nanoseconds(self) -> StdDuration {
StdDuration::from_nanos(self as _)
}
fn std_microseconds(self) -> StdDuration {
StdDuration::from_micros(self as _)
}
fn std_milliseconds(self) -> StdDuration {
StdDuration::from_millis(self as _)
}
fn std_seconds(self) -> StdDuration {
StdDuration::from_secs(self as _)
}
fn std_minutes(self) -> StdDuration {
StdDuration::from_secs(self as u64 * 60)
}
fn std_hours(self) -> StdDuration {
StdDuration::from_secs(self as u64 * 3_600)
}
fn std_days(self) -> StdDuration {
StdDuration::from_secs(self as u64 * 86_400)
}
fn std_weeks(self) -> StdDuration {
StdDuration::from_secs(self as u64 * 604_800)
}
}
)+};
}
macro_rules! impl_numerical_std_duration_nonzero {
($($type:ty),+ $(,)?) => {$(
impl NumericalStdDuration for $type {
fn std_nanoseconds(self) -> StdDuration {
StdDuration::from_nanos(self.get() as _)
}
fn std_microseconds(self) -> StdDuration {
StdDuration::from_micros(self.get() as _)
}
fn std_milliseconds(self) -> StdDuration {
StdDuration::from_millis(self.get() as _)
}
fn std_seconds(self) -> StdDuration {
StdDuration::from_secs(self.get() as _)
}
fn std_minutes(self) -> StdDuration {
StdDuration::from_secs(self.get() as u64 * 60)
}
fn std_hours(self) -> StdDuration {
StdDuration::from_secs(self.get() as u64 * 3_600)
}
fn std_days(self) -> StdDuration {
StdDuration::from_secs(self.get() as u64 * 86_400)
}
fn std_weeks(self) -> StdDuration {
StdDuration::from_secs(self.get() as u64 * 604_800)
}
}
)+};
}
impl_numerical_std_duration![u8, u16, u32, u64];
impl_numerical_std_duration_nonzero![
core::num::NonZeroU8,
core::num::NonZeroU16,
core::num::NonZeroU32,
core::num::NonZeroU64,
];
impl NumericalStdDuration for i32 {
fn std_nanoseconds(self) -> StdDuration {
assert!(self >= 0);
StdDuration::from_nanos(self as _)
}
fn std_microseconds(self) -> StdDuration {
assert!(self >= 0);
StdDuration::from_micros(self as _)
}
fn std_milliseconds(self) -> StdDuration {
assert!(self >= 0);
StdDuration::from_millis(self as _)
}
fn std_seconds(self) -> StdDuration {
assert!(self >= 0);
StdDuration::from_secs(self as _)
}
fn std_minutes(self) -> StdDuration {
assert!(self >= 0);
StdDuration::from_secs(self as u64 * 60)
}
fn std_hours(self) -> StdDuration {
assert!(self >= 0);
StdDuration::from_secs(self as u64 * 3_600)
}
fn std_days(self) -> StdDuration {
assert!(self >= 0);
StdDuration::from_secs(self as u64 * 86_400)
}
fn std_weeks(self) -> StdDuration {
assert!(self >= 0);
StdDuration::from_secs(self as u64 * 604_800)
}
}
impl NumericalStdDuration for f64 {
fn std_nanoseconds(self) -> StdDuration {
assert!(self >= 0.);
StdDuration::from_nanos(self as _)
}
fn std_microseconds(self) -> StdDuration {
assert!(self >= 0.);
StdDuration::from_nanos((self * 1_000.) as _)
}
fn std_milliseconds(self) -> StdDuration {
assert!(self >= 0.);
StdDuration::from_nanos((self * 1_000_000.) as _)
}
fn std_seconds(self) -> StdDuration {
assert!(self >= 0.);
StdDuration::from_nanos((self * 1_000_000_000.) as _)
}
fn std_minutes(self) -> StdDuration {
assert!(self >= 0.);
StdDuration::from_nanos((self * 60_000_000_000.) as _)
}
fn std_hours(self) -> StdDuration {
assert!(self >= 0.);
StdDuration::from_nanos((self * 3_600_000_000_000.) as _)
}
fn std_days(self) -> StdDuration {
assert!(self >= 0.);
StdDuration::from_nanos((self * 86_400_000_000_000.) as _)
}
fn std_weeks(self) -> StdDuration {
assert!(self >= 0.);
StdDuration::from_nanos((self * 604_800_000_000_000.) as _)
}
}