From 81ee71f73acd5f301ef1b3c9867fe299a23bae4a Mon Sep 17 00:00:00 2001 From: numzero Date: Thu, 7 May 2026 21:50:31 +0300 Subject: [PATCH] implement ref-level upcast and downcast --- src/ptr.rs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/ptr.rs b/src/ptr.rs index 55705ff..e522fcd 100644 --- a/src/ptr.rs +++ b/src/ptr.rs @@ -57,14 +57,28 @@ impl OwnRef<'_, T> { } } -impl OwnRef<'_, dyn Any> { - pub fn take(mut self) -> Result { +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(mut self) -> Result, Self> { if !self.is::() { return Err(self); } let p = self.0.take().unwrap(); let p = p.cast::(); - Ok(unsafe { p.read() }) + Ok(OwnRef(Some(p), PhantomData)) + } +} + +impl OwnRef<'_, dyn Any> { + pub fn take(self) -> Result { + self.downcast::().map(|r| r.take()) } }