bitcode/derive/
duration.rs

1use super::convert::{impl_convert, ConvertFrom};
2use crate::int::ranged_int;
3use core::time::Duration;
4
5ranged_int!(Nanosecond, u32, 0, 999_999_999);
6
7type DurationEncode = (u64, u32);
8type DurationDecode = (u64, Nanosecond);
9
10impl ConvertFrom<&Duration> for DurationEncode {
11    #[inline(always)]
12    fn convert_from(value: &Duration) -> Self {
13        (value.as_secs(), value.subsec_nanos())
14    }
15}
16
17impl ConvertFrom<DurationDecode> for Duration {
18    #[inline(always)]
19    fn convert_from(value: DurationDecode) -> Self {
20        Duration::new(value.0, value.1.into_inner())
21    }
22}
23
24impl_convert!(Duration, DurationEncode, DurationDecode);
25
26#[cfg(test)]
27mod tests {
28    #[test]
29    fn test() {
30        assert!(crate::decode::<Duration>(&crate::encode(&(u64::MAX, 999_999_999))).is_ok());
31        assert!(crate::decode::<Duration>(&crate::encode(&(u64::MAX, 1_000_000_000))).is_err());
32    }
33
34    use alloc::vec::Vec;
35    use core::time::Duration;
36    fn bench_data() -> Vec<Duration> {
37        crate::random_data(1000)
38            .into_iter()
39            .map(|(s, n): (_, u32)| Duration::new(s, n % 1_000_000_000))
40            .collect()
41    }
42    crate::bench_encode_decode!(duration_vec: Vec<Duration>);
43}