macro_rules! impl_downcast { (@impl_full $trait_:ident [$($param_types:tt)*] for [$($forall_types:ident),*] where [$($preds:tt)*] ) => { ... }; (@impl_full_sync $trait_:ident [$($param_types:tt)*] for [$($forall_types:ident),*] where [$($preds:tt)*] ) => { ... }; (@impl_body $trait_:ident [$($types:tt)*]) => { ... }; (@impl_body_sync $trait_:ident [$($types:tt)*]) => { ... }; (@inject_where [$($before:tt)*] types [] where [] [$($after:tt)*]) => { ... }; (@inject_where [$($before:tt)*] types [$($types:ident),*] where [] [$($after:tt)*]) => { ... }; (@inject_where [$($before:tt)*] types [$($types:ident),*] where [$($preds:tt)+] [$($after:tt)*]) => { ... }; (@as_item $i:item) => { ... }; ($trait_:ident ) => { ... }; ($trait_:ident <>) => { ... }; (sync $trait_:ident ) => { ... }; (sync $trait_:ident <>) => { ... }; ($trait_:ident < $($types:ident),* >) => { ... }; (sync $trait_:ident < $($types:ident),* >) => { ... }; ($trait_:ident < $($types:ident),* > where $($preds:tt)+) => { ... }; (sync $trait_:ident < $($types:ident),* > where $($preds:tt)+) => { ... }; ($trait_:ident assoc $($atypes:ident),*) => { ... }; (sync $trait_:ident assoc $($atypes:ident),*) => { ... }; ($trait_:ident assoc $($atypes:ident),* where $($preds:tt)+) => { ... }; (sync $trait_:ident assoc $($atypes:ident),* where $($preds:tt)+) => { ... }; ($trait_:ident < $($types:ident),* > assoc $($atypes:ident),*) => { ... }; (sync $trait_:ident < $($types:ident),* > assoc $($atypes:ident),*) => { ... }; ($trait_:ident < $($types:ident),* > assoc $($atypes:ident),* where $($preds:tt)+) => { ... }; (sync $trait_:ident < $($types:ident),* > assoc $($atypes:ident),* where $($preds:tt)+) => { ... }; (concrete $trait_:ident < $($types:ident),* >) => { ... }; (sync concrete $trait_:ident < $($types:ident),* >) => { ... }; (concrete $trait_:ident assoc $($atypes:ident = $aty:ty),*) => { ... }; (sync concrete $trait_:ident assoc $($atypes:ident = $aty:ty),*) => { ... }; (concrete $trait_:ident < $($types:ident),* > assoc $($atypes:ident = $aty:ty),*) => { ... }; (sync concrete $trait_:ident < $($types:ident),* > assoc $($atypes:ident = $aty:ty),*) => { ... }; }
Expand description
Adds downcasting support to traits that extend downcast::Downcast
by defining forwarding
methods to the corresponding implementations on std::any::Any
in the standard library.
See https://users.rust-lang.org/t/how-to-create-a-macro-to-impl-a-provided-type-parametrized-trait/5289 for why this is implemented this way to support templatized traits.