#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct VirtualMethodTablePointer(NonNull<()>);
impl Into<*mut ()> for VirtualMethodTablePointer
{
#[inline(always)]
fn into(self) -> *mut ()
{
self.0.as_ptr()
}
}
impl VirtualMethodTablePointer
{
#[inline(always)]
pub fn from_any<T: 'static>() -> Self
{
let mut fake: T = unsafe { uninitialized() };
let this =
{
let fat_pointer: &mut dyn Any = &mut fake;
let trait_object: TraitObject = unsafe { transmute(fat_pointer) };
Self(unsafe { NonNull::new_unchecked(trait_object.vtable) })
};
forget(fake);
this
}
#[inline(always)]
pub fn drop_in_place_function_pointer(self) -> DropInPlaceFunctionPointer
{
let raw_pointer = unsafe { *(self.0.as_ptr() as *const () as *const usize)};
unsafe { transmute(raw_pointer) }
}
#[inline(always)]
pub fn size(self) -> usize
{
unsafe { *(self.0.as_ptr().add(1) as *mut usize) }
}
#[inline(always)]
pub fn alignment(self) -> usize
{
unsafe { *(self.0.as_ptr().add(2) as *mut usize) }
}
#[inline(always)]
pub fn first_trait_function_pointer(self) -> usize
{
let raw_pointer = unsafe { *(self.0.as_ptr().add(3) as *mut usize) };
raw_pointer
}
}