use downcast_rs::{DowncastSync, impl_downcast};
pub trait HasPseudoMethods: DowncastSync {
- fn cast_to_instance(&self, arc: Arc<dyn HasPseudoMethods>, tp: TypeId) -> Option<Box<dyn Any>>;
+ fn cast_to_instance(&self, arc: &Arc<dyn HasPseudoMethods>, tp: TypeId) -> Option<Box<dyn Any>>;
}
impl_downcast!(sync HasPseudoMethods);
/*
// Note: if you wanted to be able to add more traits to Frog elsewhere, you would
// need a registry of cast-to-trait objects, similar to the existing dispatch
// table. I'm not sure if that's needed.
- fn cast_to_instance(&self, arc: Arc<dyn HasPseudoMethods>, tp: TypeId) -> Option<Box<dyn Any>> {
+ fn cast_to_instance(&self, arc: &Arc<dyn HasPseudoMethods>, tp: TypeId) -> Option<Box<dyn Any>> {
if tp == TypeId::of::<Arc<dyn HasFeet>>() {
- let arc: Arc<dyn Any + Send + Sync> = DowncastSync::into_any_arc(arc);
+ let arc: Arc<dyn Any + Send + Sync> = DowncastSync::into_any_arc(arc.clone());
let arc: Arc<Frog> = Arc::downcast::<Frog>(arc).unwrap();
- let arc: Arc<dyn HasFeet> = arc.clone();
+ let arc: Arc<dyn HasFeet> = arc as _;
return Some(Box::new(arc));
/* } else if tp == TypeId::of::<Arc<dyn EatsFood>>() {
let arc: Arc<dyn EatsFood> = self.clone();
let erased_frog: Arc<dyn HasPseudoMethods> = frog as _;
let with_feet: Box<dyn Any> = erased_frog.cast_to_instance(
- erased_frog.clone(),
+ &erased_frog,
TypeId::of::<Arc<dyn HasFeet>>(),
).unwrap();