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());
}