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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
use core::cell::{Cell, RefCell, UnsafeCell};
use core::sync::atomic::{
AtomicBool, AtomicI16, AtomicI32, AtomicI64, AtomicI8, AtomicIsize, AtomicU16, AtomicU32,
AtomicU64, AtomicU8, AtomicUsize,
};
macro_rules! impl_marker_for {
($traitname:ident, $($ty:ty)*) => {
$(
impl $traitname for $ty { }
)*
}
}
macro_rules! impl_marker_for_array {
($traitname:ident, $($N:expr)+) => {
$(
impl<T: $traitname> $traitname for [T; $N] { }
)+
}
}
macro_rules! impl_unsafe_marker_for {
($traitname:ident, $($ty:ty)*) => {
$(
unsafe impl $traitname for $ty { }
)*
}
}
macro_rules! impl_unsafe_marker_for_array {
($traitname:ident, $($N:expr)+) => {
$(
unsafe impl<T: $traitname> $traitname for [T; $N] { }
)+
}
}
pub unsafe trait BytewiseEquality {}
impl_unsafe_marker_for!(BytewiseEquality,
u8 i8 u16 i16 u32 i32 u64 i64 usize isize char bool);
unsafe impl<T: BytewiseEquality> BytewiseEquality for [T] {}
unsafe impl<T: BytewiseEquality, const N: usize> BytewiseEquality for [T; N] {}
pub unsafe trait ContiguousMemory {}
impl_unsafe_marker_for!(ContiguousMemory,
u8 i8 u16 i16 u32 i32 u64 i64 usize isize char bool);
impl_unsafe_marker_for!(ContiguousMemory, f32 f64);
impl_unsafe_marker_for!(ContiguousMemory,
AtomicI16 AtomicI32 AtomicI64 AtomicI8 AtomicIsize AtomicU16 AtomicU32 AtomicU64 AtomicU8 AtomicUsize AtomicBool);
unsafe impl<T: ContiguousMemory> ContiguousMemory for [T] {}
unsafe impl<T: ContiguousMemory, const N: usize> ContiguousMemory for [T; N] {}
unsafe impl<T: ContiguousMemory> ContiguousMemory for Option<T> {}
unsafe impl<T: ContiguousMemory, E: ContiguousMemory> ContiguousMemory for Result<T, E> {}
unsafe impl<T: ContiguousMemory> ContiguousMemory for Cell<T> {}
unsafe impl<T: ContiguousMemory> ContiguousMemory for RefCell<T> {}
unsafe impl<T: ContiguousMemory> ContiguousMemory for UnsafeCell<T> {}
macro_rules! peel {
($name:ident, $($other:ident,)*) => (tuple! { $($other,)* })
}
macro_rules! tuple {
() => ();
( $($name:ident,)+ ) => (
unsafe impl<$($name: ContiguousMemory),+> ContiguousMemory for ($($name,)+) {}
peel! { $($name,)+ }
)
}
tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, }