X-Git-Url: https://git.chrismorgan.info/anymap/blobdiff_plain/82f41caeb9424c7111f670618f140a938c82604e..b3811cf0d1bdab6154534eda1903c930885749ec:/src/any.rs diff --git a/src/any.rs b/src/any.rs index 87028fb..976f768 100644 --- a/src/any.rs +++ b/src/any.rs @@ -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 CloneToAny for T { + #[inline] fn clone_to_any(&self) -> Box { Box::new(self.clone()) } + #[inline] fn clone_to_any_send(&self) -> Box where Self: Send { Box::new(self.clone()) } + #[inline] fn clone_to_any_sync(&self) -> Box where Self: Sync { Box::new(self.clone()) } + #[inline] fn clone_to_any_send_sync(&self) -> Box 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,17 +92,6 @@ macro_rules! impl_clone { } } -#[cfg(feature = "unstable")] -use std::raw::TraitObject; - -#[cfg(not(feature = "unstable"))] -#[repr(C)] -#[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(&self) -> &T; @@ -116,26 +109,31 @@ pub trait IntoBox: Any { macro_rules! implement { ($base:ident, $(+ $bounds:ident)*) => { impl fmt::Debug for $base $(+ $bounds)* { + #[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.pad(stringify!($base $(+ $bounds)*)) } } impl UncheckedAnyExt for $base $(+ $bounds)* { + #[inline] unsafe fn downcast_ref_unchecked(&self) -> &T { - mem::transmute(mem::transmute::<_, TraitObject>(self).data) + &*(self as *const Self as *const T) } + #[inline] unsafe fn downcast_mut_unchecked(&mut self) -> &mut T { - mem::transmute(mem::transmute::<_, TraitObject>(self).data) + &mut *(self as *mut Self as *mut T) } + #[inline] unsafe fn downcast_unchecked(self: Box) -> Box { - mem::transmute(mem::transmute::<_, TraitObject>(self).data) + Box::from_raw(Box::into_raw(self) as *mut T) } } impl IntoBox<$base $(+ $bounds)*> for T { + #[inline] fn into_box(self) -> Box<$base $(+ $bounds)*> { Box::new(self) }