Remove the `bench` Cargo feature as superfluous
[anymap] / src / any.rs
index 45ad5cccc98dd59ba7309fcde048469e062d261d..976f768ec1a68b61646c18718a2f23671ad1d4a6 100644 (file)
@@ -3,7 +3,6 @@
 //! This stuff is all based on `std::any`, but goes a little further, with `CloneAny` being a
 //! cloneable `Any` and with the `Send` and `Sync` bounds possible on both `Any` and `CloneAny`.
 
-use std::mem;
 use std::fmt;
 use std::any::Any as StdAny;
 
@@ -23,18 +22,22 @@ pub trait CloneToAny {
 }
 
 impl<T: Any + Clone> CloneToAny for T {
+    #[inline]
     fn clone_to_any(&self) -> Box<CloneAny> {
         Box::new(self.clone())
     }
 
+    #[inline]
     fn clone_to_any_send(&self) -> Box<CloneAny + Send> where Self: Send {
         Box::new(self.clone())
     }
 
+    #[inline]
     fn clone_to_any_sync(&self) -> Box<CloneAny + Sync> where Self: Sync {
         Box::new(self.clone())
     }
 
+    #[inline]
     fn clone_to_any_send_sync(&self) -> Box<CloneAny + Send + Sync> where Self: Send + Sync {
         Box::new(self.clone())
     }
@@ -81,6 +84,7 @@ macro_rules! define {
 macro_rules! impl_clone {
     ($t:ty, $method:ident) => {
         impl Clone for Box<$t> {
+            #[inline]
             fn clone(&self) -> Box<$t> {
                 (**self).$method()
             }
@@ -88,18 +92,6 @@ macro_rules! impl_clone {
     }
 }
 
-#[cfg(feature = "nightly")]
-use std::raw::TraitObject;
-
-#[cfg(not(feature = "nightly"))]
-#[repr(C)]
-#[allow(raw_pointer_derive)]
-#[derive(Copy, Clone)]
-struct TraitObject {
-    pub data: *mut (),
-    pub vtable: *mut (),
-}
-
 #[allow(missing_docs)]  // Bogus warning (it’s not public outside the crate), ☹
 pub trait UncheckedAnyExt: Any {
     unsafe fn downcast_ref_unchecked<T: Any>(&self) -> &T;
@@ -116,33 +108,32 @@ pub trait IntoBox<A: ?Sized + UncheckedAnyExt>: Any {
 
 macro_rules! implement {
     ($base:ident, $(+ $bounds:ident)*) => {
-        impl<'a> fmt::Debug for &'a ($base $(+ $bounds)*) {
-            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.pad(stringify!(&($base $(+ $bounds)*)))
-            }
-        }
-
-        impl<'a> fmt::Debug for Box<$base $(+ $bounds)*> {
+        impl fmt::Debug for $base $(+ $bounds)* {
+            #[inline]
             fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-                f.pad(stringify!(Box<$base $(+ $bounds)*>))
+                f.pad(stringify!($base $(+ $bounds)*))
             }
         }
 
         impl UncheckedAnyExt for $base $(+ $bounds)* {
+            #[inline]
             unsafe fn downcast_ref_unchecked<T: 'static>(&self) -> &T {
-                mem::transmute(mem::transmute::<_, TraitObject>(self).data)
+                &*(self as *const Self as *const T)
             }
 
+            #[inline]
             unsafe fn downcast_mut_unchecked<T: 'static>(&mut self) -> &mut T {
-                mem::transmute(mem::transmute::<_, TraitObject>(self).data)
+                &mut *(self as *mut Self as *mut T)
             }
 
+            #[inline]
             unsafe fn downcast_unchecked<T: 'static>(self: Box<Self>) -> Box<T> {
-                mem::transmute(mem::transmute::<_, TraitObject>(self).data)
+                Box::from_raw(Box::into_raw(self) as *mut T)
             }
         }
 
         impl<T: $base $(+ $bounds)*> IntoBox<$base $(+ $bounds)*> for T {
+            #[inline]
             fn into_box(self) -> Box<$base $(+ $bounds)*> {
                 Box::new(self)
             }