use crate::callconv::DatumPass;
use crate::datum::BorrowDatum;
use crate::layout::PassBy;
use core::ptr;
pub unsafe trait Element {
unsafe fn point_from(ptr: ptr::NonNull<u8>) -> ptr::NonNull<Self>;
unsafe fn point_from_align4(ptr: ptr::NonNull<u32>) -> ptr::NonNull<Self> {
debug_assert!(ptr.is_aligned());
unsafe { Element::point_from(ptr.cast()) }
}
unsafe fn borrow_unchecked<'dat>(ptr: ptr::NonNull<u8>) -> &'dat Self {
unsafe { Element::point_from(ptr).as_ref() }
}
}
unsafe impl<T> BorrowDatum for T
where
T: ?Sized + Element + DatumPass,
{
const PASS: PassBy = <T as DatumPass>::PASS;
unsafe fn point_from(ptr: ptr::NonNull<u8>) -> std::ptr::NonNull<Self> {
unsafe { Element::point_from(ptr) }
}
unsafe fn point_from_align4(ptr: ptr::NonNull<u32>) -> ptr::NonNull<Self> {
unsafe { Element::point_from_align4(ptr.cast()) }
}
}