Substantial refactoring, exposing a raw interface.
[anymap] / src / unchecked_any.rs
diff --git a/src/unchecked_any.rs b/src/unchecked_any.rs
new file mode 100644 (file)
index 0000000..d34f8fe
--- /dev/null
@@ -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<T: 'static>(&self) -> &T;
+    unsafe fn downcast_mut_unchecked<T: 'static>(&mut self) -> &mut T;
+    unsafe fn downcast_unchecked<T: 'static>(self: Box<Self>) -> Box<T>;
+}
+
+impl UncheckedAnyExt for Any {
+    unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
+        mem::transmute(mem::transmute::<_, TraitObject>(self).data)
+    }
+
+    unsafe fn downcast_mut_unchecked<T: 'static>(&mut self) -> &mut T {
+        mem::transmute(mem::transmute::<_, TraitObject>(self).data)
+    }
+
+    unsafe fn downcast_unchecked<T: 'static>(self: Box<Any>) -> Box<T> {
+        mem::transmute(mem::transmute::<_, TraitObject>(self).data)
+    }
+}