/// Macro to create a new trait bound typemap #[doc(hidden)] #[macro_export] macro_rules! impl_typemap { ($( #[$outer:meta] )* $map:ident, $key:ident, $($trt:ident), +) => { $( #[$outer] )* pub struct $map($crate::base::TypeMapBase); $crate::impl_typekey!($key, $( $trt )+); impl $crate::TypeMapTrait for $map { type Key = $key; #[inline] fn new() -> Self { Self($crate::base::TypeMapBase::new()) } #[inline] fn insert>( &mut self, value: T::Value, ) { let mto = >::into_mto(value); self.0.insert::(mto); } #[inline] fn get>(&self) -> Option<&T::Value> { self.0.get::().and_then(|v| v.downcast_ref()) } #[inline] fn get_mut>( &mut self, ) -> Option<&mut T::Value> { self.0.get_mut::().and_then(|v| v.downcast_mut()) } #[inline] fn remove>( &mut self, ) -> Option { self.0.remove::().and_then(|v| v.downcast()) } #[inline] fn contains_key>(&self) -> bool { self.0.contains_key::() } } }; } #[doc(hidden)] #[macro_export] macro_rules! impl_typekey { ($key:ident, $($trt:ident), +) => { #[doc(hidden)] pub struct $key; impl $crate::TypedKeyTrait<$key> for T where T: $crate::TypeMapKey, ::Value: $crate::TypedKeyMto<$key> $(+ $trt )+, { type Value = T::Value; } impl $crate::TypedKeyMto<$key> for T { fn into_mto(self) -> multi_trait_object::MultitraitObject { multi_trait_object::create_object!(self $(, dyn $trt )+) } } } }