implement ref-level upcast and downcast

This commit is contained in:
numzero 2026-05-07 21:50:31 +03:00
parent f03e554181
commit 81ee71f73a

View File

@ -57,14 +57,28 @@ impl<T> OwnRef<'_, T> {
} }
} }
impl OwnRef<'_, dyn Any> { impl<'a, T: Any> OwnRef<'a, T> {
pub fn take<U: 'static>(mut self) -> Result<U, Self> { pub fn into_any(mut self) -> OwnRef<'a, dyn Any> {
let mut p = self.0.take().unwrap();
let p = unsafe { p.as_mut() } as &'a mut dyn Any;
OwnRef(Some(p.into()), PhantomData)
}
}
impl<'a> OwnRef<'a, dyn Any> {
pub fn downcast<U: 'static>(mut self) -> Result<OwnRef<'a, U>, Self> {
if !self.is::<U>() { if !self.is::<U>() {
return Err(self); return Err(self);
} }
let p = self.0.take().unwrap(); let p = self.0.take().unwrap();
let p = p.cast::<U>(); let p = p.cast::<U>();
Ok(unsafe { p.read() }) Ok(OwnRef(Some(p), PhantomData))
}
}
impl OwnRef<'_, dyn Any> {
pub fn take<U: 'static>(self) -> Result<U, Self> {
self.downcast::<U>().map(|r| r.take())
} }
} }