implement ref-level upcast and downcast
This commit is contained in:
parent
f03e554181
commit
81ee71f73a
20
src/ptr.rs
20
src/ptr.rs
|
|
@ -57,14 +57,28 @@ impl<T> OwnRef<'_, T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl OwnRef<'_, dyn Any> {
|
||||
pub fn take<U: 'static>(mut self) -> Result<U, Self> {
|
||||
impl<'a, T: Any> OwnRef<'a, T> {
|
||||
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>() {
|
||||
return Err(self);
|
||||
}
|
||||
let p = self.0.take().unwrap();
|
||||
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())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user