shredder/std_impls/
value_types.rs

1use std::collections::hash_map::RandomState;
2use std::ptr::drop_in_place;
3use std::time::{Duration, Instant};
4
5macro_rules! sync_value_type {
6    ($t: ty) => {
7        unsafe impl crate::marker::GcDeref for $t {}
8        unsafe impl crate::marker::GcDrop for $t {}
9        unsafe impl crate::marker::GcSafe for $t {}
10        unsafe impl crate::Scan for $t {
11            #[inline(always)]
12            fn scan(&self, _: &mut crate::Scanner<'_>) {}
13        }
14
15        unsafe impl crate::Finalize for $t {
16            unsafe fn finalize(&mut self) {
17                drop_in_place(self);
18            }
19        }
20    };
21}
22
23sync_value_type!(bool);
24
25sync_value_type!(u8);
26sync_value_type!(i8);
27sync_value_type!(u16);
28sync_value_type!(i16);
29sync_value_type!(u32);
30sync_value_type!(i32);
31sync_value_type!(u64);
32sync_value_type!(i64);
33sync_value_type!(u128);
34sync_value_type!(i128);
35sync_value_type!(usize);
36sync_value_type!(isize);
37sync_value_type!(f32);
38sync_value_type!(f64);
39
40sync_value_type!(String);
41sync_value_type!(Instant);
42sync_value_type!(Duration);
43
44sync_value_type!(RandomState);
45
46#[cfg(test)]
47mod test {
48    use std::mem::forget;
49    use std::time::Instant;
50
51    use crate::Finalize;
52
53    macro_rules! test_no_panic_finalize {
54        ($t:ident, $v:expr) => {
55            paste::item! {
56                #[test]
57                #[allow(non_snake_case, clippy::forget_copy)]
58                fn [<finalize_no_panic_ $t>]() {
59                    let mut v: $t = $v;
60                    unsafe {
61                        v.finalize();
62                    }
63                    forget(v);
64                }
65            }
66        };
67    }
68
69    test_no_panic_finalize!(isize, 1);
70    test_no_panic_finalize!(usize, 1);
71
72    test_no_panic_finalize!(i8, 1);
73    test_no_panic_finalize!(u8, 1);
74
75    test_no_panic_finalize!(i16, 1);
76    test_no_panic_finalize!(u16, 1);
77
78    test_no_panic_finalize!(i32, 1);
79    test_no_panic_finalize!(u32, 1);
80
81    test_no_panic_finalize!(i64, 1);
82    test_no_panic_finalize!(u64, 1);
83
84    test_no_panic_finalize!(i128, 1);
85    test_no_panic_finalize!(u128, 1);
86
87    test_no_panic_finalize!(f32, 1.0);
88    test_no_panic_finalize!(f64, 1.0);
89
90    test_no_panic_finalize!(String, String::from("hello"));
91    test_no_panic_finalize!(Instant, Instant::now());
92}