chiark / gitweb /
less cloning
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jun 2023 16:14:45 +0000 (17:14 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jun 2023 16:14:45 +0000 (17:14 +0100)
src/main.rs

index 13d9400b50426fd2e87491775b4938f48da81a4a..1c4ea5dc4cbda9997c27754c1974bf49ce2590cb 100644 (file)
@@ -5,7 +5,7 @@ use std::sync::Arc;
 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);
 /*
@@ -45,11 +45,11 @@ impl HasPseudoMethods for Frog {
     // 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();
@@ -65,7 +65,7 @@ fn main() {
    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();