use crate::{
core::optional::{gen_optional, NSTDOptional},
NSTDFloat64, NSTDInt64, NSTDUInt32,
};
use core::time::Duration;
use nstdapi::nstdapi;
#[nstdapi]
#[derive(Clone, Copy, PartialEq)]
pub struct NSTDDuration {
seconds: NSTDFloat64,
}
impl NSTDDuration {
#[inline]
#[allow(dead_code)]
pub(crate) fn into_duration(self) -> Duration {
Duration::from_secs_f64(self.seconds)
}
}
gen_optional!(NSTDOptionalDuration, NSTDDuration);
#[inline]
#[nstdapi]
pub const fn nstd_core_time_duration_new(seconds: NSTDFloat64) -> NSTDDuration {
NSTDDuration { seconds }
}
#[inline]
#[nstdapi]
pub const fn nstd_core_time_duration_get(duration: NSTDDuration) -> NSTDFloat64 {
duration.seconds
}
#[inline]
#[nstdapi]
#[allow(clippy::cast_possible_truncation)]
pub const fn nstd_core_time_duration_seconds(duration: NSTDDuration) -> NSTDInt64 {
duration.seconds as _
}
#[nstdapi]
pub fn nstd_core_time_duration_nanoseconds(duration: NSTDDuration) -> NSTDUInt32 {
const NANOS_IN_SEC: NSTDFloat64 = 1_000_000_000.0;
#[allow(
clippy::cast_possible_truncation,
clippy::cast_precision_loss,
clippy::cast_sign_loss
)]
{
let nanos = duration.seconds - duration.seconds as NSTDInt64 as NSTDFloat64;
match nanos >= 0.0 {
true => (nanos * NANOS_IN_SEC) as _,
false => (nanos * -NANOS_IN_SEC) as _,
}
}
}
#[inline]
#[nstdapi]
pub fn nstd_core_time_duration_add(lhs: NSTDDuration, rhs: NSTDDuration) -> NSTDDuration {
nstd_core_time_duration_new(lhs.seconds + rhs.seconds)
}
#[inline]
#[nstdapi]
pub fn nstd_core_time_duration_sub(lhs: NSTDDuration, rhs: NSTDDuration) -> NSTDDuration {
nstd_core_time_duration_new(lhs.seconds - rhs.seconds)
}