Coverage Report

Created: 2025-10-10 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/time-0.3.44/src/ext/instant.rs
Line
Count
Source
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
    #[inline]
21
    #[track_caller]
22
0
    fn add_signed(self, duration: Duration) -> Self {
23
0
        self.checked_add_signed(duration)
24
0
            .expect("overflow when adding duration to instant")
25
0
    }
26
27
    /// # Panics
28
    ///
29
    /// This function may panic if the resulting point in time cannot be represented by the
30
    /// underlying data structure. See [`InstantExt::checked_sub_signed`] for a non-panicking
31
    /// version.
32
    #[inline]
33
    #[track_caller]
34
0
    fn sub_signed(self, duration: Duration) -> Self {
35
0
        self.checked_sub_signed(duration)
36
0
            .expect("overflow when subtracting duration from instant")
37
0
    }
38
39
    /// Returns `Some(t)` where `t` is the time `self.checked_add_signed(duration)` if `t` can be
40
    /// represented as `Instant` (which means it's inside the bounds of the underlying data
41
    /// structure), `None` otherwise.
42
    fn checked_add_signed(&self, duration: Duration) -> Option<Self>;
43
44
    /// Returns `Some(t)` where `t` is the time `self.checked_sub_signed(duration)` if `t` can be
45
    /// represented as `Instant` (which means it's inside the bounds of the underlying data
46
    /// structure), `None` otherwise.
47
    fn checked_sub_signed(&self, duration: Duration) -> Option<Self>;
48
49
    /// Returns the amount of time elapsed from another instant to this one. This will be negative
50
    /// if `earlier` is later than `self`.
51
    ///
52
    /// # Example
53
    ///
54
    /// ```rust
55
    /// # use std::thread::sleep;
56
    /// # use std::time::{Duration, Instant};
57
    /// # use time::ext::InstantExt;
58
    /// let now = Instant::now();
59
    /// sleep(Duration::new(1, 0));
60
    /// let new_now = Instant::now();
61
    /// println!("{:?}", new_now.signed_duration_since(now)); // positive
62
    /// println!("{:?}", now.signed_duration_since(new_now)); // negative
63
    /// ```
64
    fn signed_duration_since(&self, earlier: Self) -> Duration;
65
}
66
67
impl InstantExt for StdInstant {
68
    #[inline]
69
0
    fn checked_add_signed(&self, duration: Duration) -> Option<Self> {
70
0
        if duration.is_positive() {
71
0
            self.checked_add(duration.unsigned_abs())
72
0
        } else if duration.is_negative() {
73
0
            self.checked_sub(duration.unsigned_abs())
74
        } else {
75
0
            debug_assert!(duration.is_zero());
76
0
            Some(*self)
77
        }
78
0
    }
79
80
    #[inline]
81
0
    fn checked_sub_signed(&self, duration: Duration) -> Option<Self> {
82
0
        if duration.is_positive() {
83
0
            self.checked_sub(duration.unsigned_abs())
84
0
        } else if duration.is_negative() {
85
0
            self.checked_add(duration.unsigned_abs())
86
        } else {
87
0
            debug_assert!(duration.is_zero());
88
0
            Some(*self)
89
        }
90
0
    }
91
92
    #[inline]
93
0
    fn signed_duration_since(&self, earlier: Self) -> Duration {
94
0
        if *self > earlier {
95
0
            self.saturating_duration_since(earlier)
96
0
                .try_into()
97
0
                .unwrap_or(Duration::MAX)
98
        } else {
99
0
            earlier
100
0
                .saturating_duration_since(*self)
101
0
                .try_into()
102
0
                .map_or(Duration::MIN, |d: Duration| -d)
103
        }
104
0
    }
105
}