timeout_trait/
std_impls.rs1use 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}