Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/dtolnay/dyn-clone
Clone trait that is object-safe
https://github.com/dtolnay/dyn-clone
Last synced: 1 day ago
JSON representation
Clone trait that is object-safe
- Host: GitHub
- URL: https://github.com/dtolnay/dyn-clone
- Owner: dtolnay
- License: apache-2.0
- Created: 2018-01-13T21:47:14.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2025-02-10T01:53:33.000Z (11 days ago)
- Last Synced: 2025-02-13T05:06:57.963Z (8 days ago)
- Language: Rust
- Homepage:
- Size: 198 KB
- Stars: 688
- Watchers: 6
- Forks: 19
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE-APACHE
Awesome Lists containing this project
README
Clone trait that is dyn-compatible
==================================[
](https://github.com/dtolnay/dyn-clone)
[](https://crates.io/crates/dyn-clone)
[](https://docs.rs/dyn-clone)
[](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
object.[`std::clone::Clone`]: https://doc.rust-lang.org/std/clone/trait.Clone.html
The signature of `clone_box` is:
```rust
fn clone_box(t: &T) -> Box
where
T: ?Sized + DynClone
```## Example
```rust
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 = Box::new(String::from(line));x.recite();
// The type of x2 is a Box 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` in terms of `dyn_clone::clone_box`:```rust
// As before.
trait MyTrait: DynClone {
/* ... */
}dyn_clone::clone_trait_object!(MyTrait);
// Now data structures containing Box can derive Clone:
#[derive(Clone)]
struct Container {
trait_object: Box,
}
```
#### License
Licensed under either of Apache License, Version
2.0 or MIT license 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.