Skip to content

Commit 33881a5

Browse files
committed
Add RawRc methods for dyn Any type
1 parent 9184466 commit 33881a5

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

library/alloc/src/raw_rc/raw_rc.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use core::alloc::{AllocError, Allocator};
2+
use core::any::Any;
23
use core::cell::UnsafeCell;
34
#[cfg(not(no_global_oom_handling))]
45
use core::clone::CloneToUninit;
@@ -648,3 +649,23 @@ impl<T, A> RawRc<[MaybeUninit<T>], A> {
648649
unsafe { self.cast_with(|ptr| NonNull::new_unchecked(ptr.as_ptr() as _)) }
649650
}
650651
}
652+
653+
impl<A> RawRc<dyn Any, A> {
654+
pub(crate) fn downcast<T>(self) -> Result<RawRc<T, A>, Self>
655+
where
656+
T: Any,
657+
{
658+
if unsafe { self.as_ptr().as_ref() }.is::<T>() {
659+
Ok(unsafe { self.downcast_unchecked() })
660+
} else {
661+
Err(self)
662+
}
663+
}
664+
665+
pub(crate) unsafe fn downcast_unchecked<T>(self) -> RawRc<T, A>
666+
where
667+
T: Any,
668+
{
669+
unsafe { self.cast() }
670+
}
671+
}

0 commit comments

Comments
 (0)