#![no_std]
use core::{any::TypeId, fmt};
#[doc(hidden)]
pub trait HasVtid {
fn vtid() -> Vtid
where
Self: Sized;
}
#[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct Vtid {
tid: TypeId,
base_id: u64,
}
impl Vtid {
pub fn of<T>() -> Self
where
T: HasVtid,
{
T::vtid()
}
}
impl fmt::Debug for Vtid {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Vtid({:#016x}, {:?})", self.base_id, self.tid)
}
}
#[cfg(feature = "derive")]
#[doc(hidden)]
pub mod private {
use core::any::TypeId;
pub fn vtid<T: 'static>(base_id: u64) -> super::Vtid {
super::Vtid {
tid: TypeId::of::<T>(),
base_id,
}
}
}
#[cfg(feature = "derive")]
pub use vtid_proc::HasVtid;