dyn-clone 1.0.16

Clone trait that is object-safe
Clone trait that is object-safe

[<img alt="github" src="https://img.shields.io/badge/github-dtolnay/dyn--clone-8da0cb?style=for-the-badge&labelColor=555555&logo=github" height="20">](https://github.com/dtolnay/dyn-clone)
[<img alt="crates.io" src="https://img.shields.io/crates/v/dyn-clone.svg?style=for-the-badge&color=fc8d62&logo=rust" height="20">](https://crates.io/crates/dyn-clone)
[<img alt="docs.rs" src="https://img.shields.io/badge/docs.rs-dyn--clone-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs" height="20">](https://docs.rs/dyn-clone)
[<img alt="build status" src="https://img.shields.io/github/actions/workflow/status/dtolnay/dyn-clone/ci.yml?branch=master&style=for-the-badge" height="20">](https://github.com/dtolnay/dyn-clone/actions?query=branch%3Amaster)

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

[`std::clone::Clone`]: https://doc.rust-lang.org/std/clone/trait.Clone.html

The signature of `clone_box` is:

fn clone_box<T>(t: &T) -> Box<T>
    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));


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


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 {
    /* ... */


// Now data structures containing Box<dyn MyTrait> can derive Clone:
struct Container {
    trait_object: Box<dyn MyTrait>,


#### License

Licensed under either of <a href="LICENSE-APACHE">Apache License, Version
2.0</a> or <a href="LICENSE-MIT">MIT license</a> at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in this crate by you, as defined in the Apache-2.0 license, shall
be dual licensed as above, without any additional terms or conditions.