1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
use std::mem; use std::ptr::NonNull; pub use eraserhead_derive::*; pub unsafe trait Erase { type Erased: ?Sized; fn erase(&self) -> NonNull<Self::Erased>; unsafe fn unerase<'a>(erased: NonNull<Self::Erased>) -> &'a Self; } unsafe impl<T: Erase> Erase for [T] where T::Erased: Sized { type Erased = [T::Erased]; fn erase(&self) -> NonNull<Self::Erased> { unsafe { mem::transmute(self) } } unsafe fn unerase<'a>(erased: NonNull<Self::Erased>) -> &'a Self { mem::transmute(erased) } }