use std::alloc::Layout;
use std::mem;
use std::ptr::NonNull;
#[track_caller]
pub unsafe fn from_raw_parts<T: ?Sized>(data: *const (), vtable: *const ()) -> *const T {
let fat = FatPointer { data, vtable };
debug_assert_eq!(Layout::new::<*const T>(), Layout::new::<FatPointer>());
mem::transmute_copy::<FatPointer, *const T>(&fat)
}
#[track_caller]
pub unsafe fn from_raw_parts_mut<T: ?Sized>(data: *mut (), vtable: *const ()) -> *mut T {
let fat = FatPointer { data, vtable };
debug_assert_eq!(Layout::new::<*mut T>(), Layout::new::<FatPointer>());
mem::transmute_copy::<FatPointer, *mut T>(&fat)
}
#[track_caller]
pub unsafe fn vtable<T: ?Sized>(ptr: *const T) -> NonNull<()> {
debug_assert_eq!(Layout::new::<*const T>(), Layout::new::<FatPointer>());
NonNull::new_unchecked(
mem::transmute_copy::<*const T, FatPointer>(&ptr).vtable as *mut (),
)
}
#[repr(C)]
struct FatPointer {
data: *const (),
vtable: *const (),
}