pub struct ExactDuration { /* private fields */ }Expand description
Exact-precision signed duration.
Internally an i128 of nanoseconds. Range ≈ ±5.4 × 10²¹ yr at 1 ns
resolution (i128::MAX ≈ 1.7 × 10³⁸ ns ÷ 3.156 × 10¹⁶ ns/yr ≈ 5.4 × 10²¹ yr).
Construction:
ExactDuration::ZEROExactDuration::from_nanosExactDuration::from_seconds_and_nanosExactDuration::from_canonical_seconds_nanos(strict canonical form)ExactDuration::from_quantity/ExactDuration::try_from_quantityExactDuration::from_seconds_f64_lossy(explicit lossy boundary)
Accessors:
ExactDuration::as_nanos_i128ExactDuration::as_seconds_i64_nanos(panics if seconds outside i64 range)ExactDuration::as_seconds_i64_nanos_checked(returns Err on overflow)ExactDuration::as_seconds_i64_nanos_saturating(saturates; lossy for extreme values)ExactDuration::as_seconds_f64ExactDuration::as_quantity
Implementations§
Source§impl ExactDuration
impl ExactDuration
Sourcepub const NANOSECOND: Self
pub const NANOSECOND: Self
Smallest representable positive duration (1 ns).
Sourcepub const fn from_nanos(nanos: i128) -> Self
pub const fn from_nanos(nanos: i128) -> Self
Build from a raw nanosecond count.
Sourcepub const fn from_seconds_and_nanos(
seconds: i64,
nanos: i32,
) -> Result<Self, DurationError>
pub const fn from_seconds_and_nanos( seconds: i64, nanos: i32, ) -> Result<Self, DurationError>
Build from (seconds, nanos) boundary projection.
The fractional nanos is interpreted with the same sign as seconds
when seconds != 0; when seconds == 0, nanos carries the sign
directly. This matches the unambiguous total
result_nanos = seconds * 1e9 + nanos.
Returns DurationError::Overflow if the multiplication overflows.
Sourcepub const fn from_canonical_seconds_nanos(
seconds: i64,
nanos: i32,
) -> Result<Self, DurationError>
pub const fn from_canonical_seconds_nanos( seconds: i64, nanos: i32, ) -> Result<Self, DurationError>
Strict canonical constructor: requires nanos ∈ (-1_000_000_000, 1_000_000_000) and
that seconds and nanos share the same sign (or nanos == 0).
The full invariant:
|nanos| < 1_000_000_000- if
seconds > 0, thennanos >= 0 - if
seconds < 0, thennanos <= 0 - if
seconds == 0, either sign ofnanosis valid
Returns DurationError::Overflow if |nanos| >= 1_000_000_000 or if the
multiplication overflows, and DurationError::NonCanonical if the sign
invariant is violated.
Sourcepub fn try_from_quantity<U: TimeUnit>(
q: Quantity<U>,
) -> Result<Self, DurationError>
pub fn try_from_quantity<U: TimeUnit>( q: Quantity<U>, ) -> Result<Self, DurationError>
Build from a qtty::Quantity<U> of any time unit. Returns
DurationError::NonFinite for NaN/inf inputs and
DurationError::Overflow if the value does not fit in i128 ns.
Sourcepub fn from_quantity<U: TimeUnit>(q: Quantity<U>) -> Self
pub fn from_quantity<U: TimeUnit>(q: Quantity<U>) -> Self
Infallible variant for callers that already know the input is finite
and in-range. Panics on non-finite or overflowing input.
For fallible conversion, use try_from_quantity.
Sourcepub fn from_seconds_f64_lossy(seconds: f64) -> Option<Self>
pub fn from_seconds_f64_lossy(seconds: f64) -> Option<Self>
Explicit lossy f64 → ExactDuration boundary. Named so the lossy
step is visible in code review. Returns None on non-finite input or
when the value does not fit in i128 ns.
Sourcepub const fn as_nanos_i128(self) -> i128
pub const fn as_nanos_i128(self) -> i128
Raw signed nanosecond count.
Sourcepub const fn as_seconds_i64_nanos_checked(
self,
) -> Result<(i64, i32), DurationError>
pub const fn as_seconds_i64_nanos_checked( self, ) -> Result<(i64, i32), DurationError>
Exact boundary projection (seconds, nanos) such that
seconds * 1_000_000_000 + nanos == self.as_nanos_i128() and
nanos ∈ (-1_000_000_000, 1_000_000_000).
Returns DurationError::Overflow when the seconds component does not
fit in i64 (i.e. |self| > i64::MAX * 1e9 ns ≈ ±292 billion years).
Use this as the canonical API when the invariant must be preserved.
For guaranteed-small durations you may use
as_seconds_i64_nanos (panics on overflow).
Sourcepub const fn as_seconds_i64_nanos_saturating(self) -> (i64, i32)
pub const fn as_seconds_i64_nanos_saturating(self) -> (i64, i32)
Boundary projection (seconds, nanos) that saturates the seconds
component to i64::MAX / i64::MIN for extreme values.
Lossy / non-canonical for durations outside the i64 seconds range
(≈ ±292 billion years). The invariant
seconds * 1_000_000_000 + nanos == as_nanos_i128() is not preserved
when saturation occurs. Use as_seconds_i64_nanos_checked
for exact behaviour.
Sourcepub const fn as_seconds_i64_nanos(self) -> (i64, i32)
pub const fn as_seconds_i64_nanos(self) -> (i64, i32)
Boundary projection (seconds, nanos). Panics if the seconds component
does not fit in i64.
For durations within ≈ ±292 billion years this never panics in practice. Use
as_seconds_i64_nanos_checked to
handle the overflow case explicitly.
Sourcepub fn as_seconds_f64(self) -> f64
pub fn as_seconds_f64(self) -> f64
Explicit lossy ExactDuration → f64 seconds boundary.
Sourcepub fn from_nanoseconds_i(nanos: Nanosecond) -> Self
pub fn from_nanoseconds_i(nanos: Nanosecond) -> Self
Build from a typed qtty::i64::Nanosecond integer quantity.
The i64 value is widened to i128 without loss; this conversion is
always exact. For the low-level raw interface, see from_nanos.
Sourcepub fn from_seconds_i(seconds: Second) -> Self
pub fn from_seconds_i(seconds: Second) -> Self
Build from a typed qtty::i64::Second integer quantity (whole-second precision).
The second value is multiplied by 1 × 10⁹ and widened to i128 without
loss for any i64 input. For sub-second precision use
from_canonical_seconds_nanos or
from_nanoseconds_i.
Sourcepub fn as_nanoseconds_i(self) -> Result<Nanosecond, DurationError>
pub fn as_nanoseconds_i(self) -> Result<Nanosecond, DurationError>
Project to a typed qtty::i64::Nanosecond integer quantity.
Returns DurationError::Overflow when the stored nanosecond count does
not fit in i64 (durations outside ≈ ±292 billion years at 1 ns resolution).
Sourcepub fn as_quantity<U: TimeUnit>(self) -> Quantity<U>
pub fn as_quantity<U: TimeUnit>(self) -> Quantity<U>
Project back into a qtty::Quantity<U>. Lossy in general (f64).
Sourcepub const fn is_negative(self) -> bool
pub const fn is_negative(self) -> bool
True iff strictly negative.
Sourcepub const fn checked_abs(self) -> Result<Self, DurationError>
pub const fn checked_abs(self) -> Result<Self, DurationError>
Absolute value. Returns DurationError::Overflow on
ExactDuration::MIN (i128::MIN has no representable positive).
Sourcepub const fn checked_add(self, rhs: Self) -> Result<Self, DurationError>
pub const fn checked_add(self, rhs: Self) -> Result<Self, DurationError>
Checked addition.
Sourcepub const fn checked_sub(self, rhs: Self) -> Result<Self, DurationError>
pub const fn checked_sub(self, rhs: Self) -> Result<Self, DurationError>
Checked subtraction.
Sourcepub const fn checked_neg(self) -> Result<Self, DurationError>
pub const fn checked_neg(self) -> Result<Self, DurationError>
Checked negation.
Sourcepub const fn saturating_add(self, rhs: Self) -> Self
pub const fn saturating_add(self, rhs: Self) -> Self
Saturating addition.
Sourcepub const fn saturating_sub(self, rhs: Self) -> Self
pub const fn saturating_sub(self, rhs: Self) -> Self
Saturating subtraction.
Sourcepub const fn round_to(self, quantum: ExactDuration) -> Self
pub const fn round_to(self, quantum: ExactDuration) -> Self
Round this duration to the nearest multiple of quantum (banker’s
rounding / half-to-even). quantum must be strictly positive; a
non-positive quantum returns self unchanged to avoid surprising
errors in formatting paths.
Sourcepub const fn floor_to(self, quantum: ExactDuration) -> Self
pub const fn floor_to(self, quantum: ExactDuration) -> Self
Floor this duration toward negative infinity at quantum.
Sourcepub const fn ceil_to(self, quantum: ExactDuration) -> Self
pub const fn ceil_to(self, quantum: ExactDuration) -> Self
Ceil this duration toward positive infinity at quantum.
Trait Implementations§
Source§impl Add for ExactDuration
impl Add for ExactDuration
Source§impl AddAssign for ExactDuration
impl AddAssign for ExactDuration
Source§fn add_assign(&mut self, rhs: Self)
fn add_assign(&mut self, rhs: Self)
+= operation. Read moreSource§impl Clone for ExactDuration
impl Clone for ExactDuration
Source§fn clone(&self) -> ExactDuration
fn clone(&self) -> ExactDuration
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ExactDuration
impl Debug for ExactDuration
Source§impl Default for ExactDuration
impl Default for ExactDuration
Source§impl Display for ExactDuration
impl Display for ExactDuration
Source§impl Hash for ExactDuration
impl Hash for ExactDuration
Source§impl Neg for ExactDuration
impl Neg for ExactDuration
Source§impl Ord for ExactDuration
impl Ord for ExactDuration
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialEq for ExactDuration
impl PartialEq for ExactDuration
Source§fn eq(&self, other: &ExactDuration) -> bool
fn eq(&self, other: &ExactDuration) -> bool
self and other values to be equal, and is used by ==.Source§impl PartialOrd for ExactDuration
impl PartialOrd for ExactDuration
Source§impl Sub for ExactDuration
impl Sub for ExactDuration
Source§impl SubAssign for ExactDuration
impl SubAssign for ExactDuration
Source§fn sub_assign(&mut self, rhs: Self)
fn sub_assign(&mut self, rhs: Self)
-= operation. Read moreimpl Copy for ExactDuration
impl Eq for ExactDuration
impl StructuralPartialEq for ExactDuration
Auto Trait Implementations§
impl Freeze for ExactDuration
impl RefUnwindSafe for ExactDuration
impl Send for ExactDuration
impl Sync for ExactDuration
impl Unpin for ExactDuration
impl UnsafeUnpin for ExactDuration
impl UnwindSafe for ExactDuration
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.