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