tree: c9baef35672d554b9ef33e819e75378e44f37608 [path history] [tgz]
  1. examples/
  2. src/
  3. tests/
  4. .android-checksum.json
  5. .cargo-checksum.json
  6. Android.bp
  7. Cargo.lock
  8. Cargo.toml
  9. cargo_embargo.json
  10. LICENSE-APACHE
  11. METADATA
  12. MODULE_LICENSE_APACHE2
  13. README.md
crates/dyn-clone/README.md

Clone trait that is dyn-compatible

This crate provides a DynClone trait that can be used in trait objects, and a clone_box function that can clone any sized or dynamically sized implementation of DynClone. Types that implement the standard library's std::clone::Clone trait are automatically usable by a DynClone trait object.

The signature of clone_box is:

fn clone_box<T>(t: &T) -> Box<T>
where
    T: ?Sized + DynClone

Example

use dyn_clone::DynClone;

trait MyTrait: DynClone {
    fn recite(&self);
}

impl MyTrait for String {
    fn recite(&self) {
        println!("{} ♫", self);
    }
}

fn main() {
    let line = "The slithy structs did gyre and gimble the namespace";

    // Build a trait object holding a String.
    // This requires String to implement MyTrait and std::clone::Clone.
    let x: Box<dyn MyTrait> = Box::new(String::from(line));

    x.recite();

    // The type of x2 is a Box<dyn MyTrait> cloned from x.
    let x2 = dyn_clone::clone_box(&*x);

    x2.recite();
}

This crate includes a macro for generating the implementation impl std::clone::Clone for Box<dyn MyTrait> in terms of dyn_clone::clone_box:

// As before.
trait MyTrait: DynClone {
    /* ... */
}

dyn_clone::clone_trait_object!(MyTrait);

// Now data structures containing Box<dyn MyTrait> can derive Clone:
#[derive(Clone)]
struct Container {
    trait_object: Box<dyn MyTrait>,
}

License