use std::mem::ManuallyDrop;
pub unsafe trait NonInvalidatable<const SIZE: usize> {}
macro_rules! impls {
(unsafe { $($t:ty)* }) => {
$(
unsafe impl NonInvalidatable<{ size_of::<$t>() }> for $t {}
)*
};
}
impls!(
unsafe {
u8 u16 u32 u64 u128
i8 i16 i32 i64 i128
f32 f64
}
);
union Caster<T, U> {
t: ManuallyDrop<T>,
u: ManuallyDrop<U>,
}
pub const fn transmute<
Src: NonInvalidatable<SIZE>,
Dst: NonInvalidatable<SIZE>,
const SIZE: usize,
>(
src: Src,
) -> Dst {
unsafe {
ManuallyDrop::into_inner(
Caster {
t: ManuallyDrop::new(src),
}
.u,
)
}
}