use core::{any::type_name, fmt, marker::PhantomData, mem::MaybeUninit};
#[repr(transparent)]
pub struct Object<Ty, Tag> {
tag: PhantomData<Tag>,
object: MaybeUninit<Ty>,
}
impl<Ty: Copy, Tag> Copy for Object<Ty, Tag> {}
impl<Ty: Copy, Tag> Clone for Object<Ty, Tag> {
fn clone(&self) -> Self {
*self
}
}
impl<Ty, Tag> fmt::Debug for Object<Ty, Tag> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Object")
.field("object", &type_name::<Ty>())
.field("tag", &type_name::<Tag>())
.finish()
}
}
unsafe impl<Ty, Tag> Send for Object<Ty, Tag> {}
unsafe impl<Ty, Tag> Sync for Object<Ty, Tag> {}
impl<Ty, Tag> Object<Ty, Tag> {
pub unsafe fn new_unchecked(object: Ty) -> Self {
Self {
object: MaybeUninit::new(object),
tag: PhantomData,
}
}
pub unsafe fn into_inner_unchecked(self) -> Ty {
self.object.assume_init()
}
pub unsafe fn get_unchecked(&self) -> &Ty {
&*self.object.as_ptr()
}
}
pub unsafe trait Compatible {
fn representative(&self) -> usize;
}