X-Git-Url: https://git.chrismorgan.info/anymap/blobdiff_plain/9a3d4ae73bfe2e6826657f61779ac5a14874ac06..143ee062680311ca9c2ed5b7089bb0d741bc17c0:/src/unchecked_any.rs diff --git a/src/unchecked_any.rs b/src/unchecked_any.rs new file mode 100644 index 0000000..d34f8fe --- /dev/null +++ b/src/unchecked_any.rs @@ -0,0 +1,24 @@ +use std::any::Any; +use std::mem; +use std::raw::TraitObject; + +#[allow(missing_docs)] // Bogus warning (it’s not public outside the crate), ☹ +pub trait UncheckedAnyExt { + unsafe fn downcast_ref_unchecked(&self) -> &T; + unsafe fn downcast_mut_unchecked(&mut self) -> &mut T; + unsafe fn downcast_unchecked(self: Box) -> Box; +} + +impl UncheckedAnyExt for Any { + unsafe fn downcast_ref_unchecked(&self) -> &T { + mem::transmute(mem::transmute::<_, TraitObject>(self).data) + } + + unsafe fn downcast_mut_unchecked(&mut self) -> &mut T { + mem::transmute(mem::transmute::<_, TraitObject>(self).data) + } + + unsafe fn downcast_unchecked(self: Box) -> Box { + mem::transmute(mem::transmute::<_, TraitObject>(self).data) + } +}