1use crate::*;
2use core::marker::PhantomData;
3
4pub struct TickDelay<T> {
6 _t: PhantomData<T>,
7}
8
9impl<T> Default for TickDelay<T>
10where
11 T: TickInstant,
12{
13 fn default() -> Self {
14 Self { _t: PhantomData }
15 }
16}
17
18impl<T> DelayNs for TickDelay<T>
19where
20 T: TickInstant,
21{
22 #[inline]
23 fn delay_ns(&mut self, ns: u32) {
24 let mut t = T::now();
25 let dur = TickDuration::<T>::nanos(ns);
26 while !t.timeout(&dur) {
27 #[cfg(feature = "std")]
29 std::thread::sleep(std::time::Duration::from_nanos(1));
30 }
31 }
32}
33
34#[cfg(feature = "std")]
35pub use for_std::*;
36#[cfg(feature = "std")]
37mod for_std {
38 use super::*;
39 use std::time::Duration;
40
41 #[derive(Default)]
42 pub struct StdDelayNs {}
43
44 impl DelayNs for StdDelayNs {
45 #[inline]
46 fn delay_ns(&mut self, ns: u32) {
47 std::thread::sleep(Duration::from_nanos(ns.into()))
48 }
49 }
50
51 #[cfg(test)]
52 mod tests {
53 use super::*;
54 use crate::std_impls::StdTickInstant;
55 use std::time::{Duration, Instant};
56
57 fn test_delay(mut d: impl DelayNs) {
58 let t = Instant::now();
59 d.delay_ns(200_000_000);
60 let elapsed = t.elapsed();
61 assert!(elapsed - Duration::from_millis(200) < Duration::from_millis(100));
62
63 let t = Instant::now();
64 d.delay_us(200_000);
65 let elapsed = t.elapsed();
66 assert!(elapsed - Duration::from_millis(200) < Duration::from_millis(100));
67
68 let t = Instant::now();
69 d.delay_ms(500);
70 let elapsed = t.elapsed();
71 assert!(elapsed - Duration::from_millis(500) < Duration::from_millis(100));
72 }
73
74 #[test]
75 fn std_delay() {
76 let d = StdDelayNs::default();
77 test_delay(d);
78 }
79
80 #[test]
81 fn tick_delay() {
82 let d = TickDelay::<StdTickInstant>::default();
83 test_delay(d);
84 }
85 }
86}