[][src]Crate objekt

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

Example

This code runs with edition 2018
trait MyTrait: objekt::Clone {
    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<MyTrait> = Box::new(String::from(line));
 
    x.recite();
 
    // The type of x2 is a Box<MyTrait> cloned from x.
    let x2 = objekt::clone_box(&*x);
 
    x2.recite();
}

This crate includes a macro for concisely implementing impl std::clone::Clone for Box<MyTrait> in terms of objekt::clone_box.

This code runs with edition 2018
// As before.
trait MyTrait: objekt::Clone {
    /* ... */
}

objekt::clone_trait_object!(MyTrait);

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

Macros

clone_trait_object

Implement the standard library Clone for a trait object that has objekt::Clone as a supertrait.

Traits

Clone

This trait is implemented by any type that implements std::clone::Clone.

Functions

clone
clone_box