bitcode/derive/
duration.rs1use 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}