use core::marker::PhantomData;
pub(super) struct Origin<'a> {
address: usize,
size: usize,
kind: &'static str,
borrow: PhantomData<&'a ()>,
}
impl<'a> Origin<'a> {
pub(super) fn of<T>(value: &'a T) -> Self {
const {
assert!(core::mem::size_of::<T>() > 0);
}
Self {
address: core::ptr::from_ref(value).addr(),
size: core::mem::size_of::<T>(),
kind: core::any::type_name::<T>(),
borrow: PhantomData,
}
}
pub(super) fn matches<T>(&self, value: &T) -> bool {
const {
assert!(core::mem::size_of::<T>() > 0);
}
let kind = core::any::type_name::<T>();
self.address == core::ptr::from_ref(value).addr()
&& self.size == core::mem::size_of::<T>()
&& (core::ptr::eq(self.kind, kind) || self.kind == kind)
}
}
#[cfg(test)]
mod tests;