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