timeout_trait/
std_impls.rs

1use crate::{
2    fugit::{KilohertzU32, RateExtU32},
3    *,
4};
5use std::time::{Duration, Instant};
6
7#[derive(Clone)]
8pub struct StdTickInstant(Instant);
9
10impl TickInstant for StdTickInstant {
11    #[inline]
12    fn frequency() -> KilohertzU32 {
13        1.MHz()
14    }
15
16    #[inline]
17    fn now() -> Self {
18        StdTickInstant(Instant::now())
19    }
20
21    #[inline]
22    fn elapsed(&mut self) -> TickDuration<Self> {
23        let ticks = Instant::now().duration_since(self.0).as_micros() as u64;
24        TickDuration::from_ticks(ticks)
25    }
26
27    #[inline]
28    fn move_forward(&mut self, dur: &TickDuration<Self>) {
29        self.0 = self
30            .0
31            .checked_add(Duration::from_micros(dur.as_ticks()))
32            .unwrap();
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use crate::TickTimeout;
39
40    use super::*;
41    use std::{thread::sleep, time::Duration};
42
43    struct UseTimeout<T: TickInstant> {
44        interval: TickTimeout<T>,
45    }
46
47    fn test_timeout<T: TickInstant>() {
48        let mut t = TickTimeout::<T>::millis(500);
49        assert!(!t.timeout());
50        sleep(Duration::from_millis(260));
51        assert!(!t.timeout());
52        sleep(Duration::from_millis(260));
53        assert!(t.timeout());
54        assert!(!t.timeout());
55
56        t.restart();
57        assert!(!t.timeout());
58        sleep(Duration::from_millis(260));
59        assert!(!t.timeout());
60        sleep(Duration::from_millis(260));
61        assert!(t.timeout());
62        assert!(!t.timeout());
63
64        let dur = TickDuration::<T>::nanos(100);
65        assert!(T::now().timeout_with(&dur, || {
66            sleep(Duration::from_nanos(1));
67            true
68        }));
69
70        let mut u = UseTimeout {
71            interval: TickTimeout::<T>::millis(1),
72        };
73        u.interval.timeout();
74    }
75
76    #[test]
77    fn tick_timeout() {
78        test_timeout::<StdTickInstant>();
79    }
80
81    #[test]
82    fn tick_instant() {
83        let mut now = StdTickInstant::now();
84        sleep(Duration::from_millis(200));
85        assert!(now.elapsed().as_ticks() - 200_000 < 1000);
86    }
87}