Coverage Report

Created: 2025-07-23 07:04

/rust/registry/src/index.crates.io-6f17d22bba15001f/time-0.3.41/src/ext/instant.rs
Line
Count
Source (jump to first uncovered line)
1
use std::time::Instant as StdInstant;
2
3
use crate::Duration;
4
5
/// Sealed trait to prevent downstream implementations.
6
mod sealed {
7
    /// A trait that cannot be implemented by downstream users.
8
    pub trait Sealed: Sized {}
9
    impl Sealed for std::time::Instant {}
10
}
11
12
/// An extension trait for [`std::time::Instant`] that adds methods for
13
/// [`time::Duration`](Duration)s.
14
pub trait InstantExt: sealed::Sealed {
15
    /// # Panics
16
    ///
17
    /// This function may panic if the resulting point in time cannot be represented by the
18
    /// underlying data structure. See [`InstantExt::checked_add_signed`] for a non-panicking
19
    /// version.
20
0
    fn add_signed(self, duration: Duration) -> Self {
21
0
        self.checked_add_signed(duration)
22
0
            .expect("overflow when adding duration to instant")
23
0
    }
24
25
    /// # Panics
26
    ///
27
    /// This function may panic if the resulting point in time cannot be represented by the
28
    /// underlying data structure. See [`InstantExt::checked_sub_signed`] for a non-panicking
29
    /// version.
30
0
    fn sub_signed(self, duration: Duration) -> Self {
31
0
        self.checked_sub_signed(duration)
32
0
            .expect("overflow when subtracting duration from instant")
33
0
    }
34
35
    /// Returns `Some(t)` where `t` is the time `self.checked_add_signed(duration)` if `t` can be
36
    /// represented as `Instant` (which means it's inside the bounds of the underlying data
37
    /// structure), `None` otherwise.
38
    fn checked_add_signed(&self, duration: Duration) -> Option<Self>;
39
40
    /// Returns `Some(t)` where `t` is the time `self.checked_sub_signed(duration)` if `t` can be
41
    /// represented as `Instant` (which means it's inside the bounds of the underlying data
42
    /// structure), `None` otherwise.
43
    fn checked_sub_signed(&self, duration: Duration) -> Option<Self>;
44
45
    /// Returns the amount of time elapsed from another instant to this one. This will be negative
46
    /// if `earlier` is later than `self`.
47
    ///
48
    /// # Example
49
    ///
50
    /// ```rust
51
    /// # use std::thread::sleep;
52
    /// # use std::time::{Duration, Instant};
53
    /// # use time::ext::InstantExt;
54
    /// let now = Instant::now();
55
    /// sleep(Duration::new(1, 0));
56
    /// let new_now = Instant::now();
57
    /// println!("{:?}", new_now.signed_duration_since(now)); // positive
58
    /// println!("{:?}", now.signed_duration_since(new_now)); // negative
59
    /// ```
60
    fn signed_duration_since(&self, earlier: Self) -> Duration;
61
}
62
63
impl InstantExt for StdInstant {
64
0
    fn checked_add_signed(&self, duration: Duration) -> Option<Self> {
65
0
        if duration.is_positive() {
66
0
            self.checked_add(duration.unsigned_abs())
67
0
        } else if duration.is_negative() {
68
0
            self.checked_sub(duration.unsigned_abs())
69
        } else {
70
0
            debug_assert!(duration.is_zero());
71
0
            Some(*self)
72
        }
73
0
    }
74
75
0
    fn checked_sub_signed(&self, duration: Duration) -> Option<Self> {
76
0
        if duration.is_positive() {
77
0
            self.checked_sub(duration.unsigned_abs())
78
0
        } else if duration.is_negative() {
79
0
            self.checked_add(duration.unsigned_abs())
80
        } else {
81
0
            debug_assert!(duration.is_zero());
82
0
            Some(*self)
83
        }
84
0
    }
85
86
0
    fn signed_duration_since(&self, earlier: Self) -> Duration {
87
0
        if *self > earlier {
88
0
            self.saturating_duration_since(earlier)
89
0
                .try_into()
90
0
                .unwrap_or(Duration::MAX)
91
        } else {
92
0
            earlier
93
0
                .saturating_duration_since(*self)
94
0
                .try_into()
95
0
                .map_or(Duration::MIN, |d: Duration| -d)
96
        }
97
0
    }
98
}