#cow #no-std

no-std laxcow

Clone-on-write smart pointer with relaxed trait constraints

2 releases

Uses new Rust 2021

0.1.1 Nov 20, 2022
0.1.0 Nov 20, 2022

#612 in Rust patterns

Download history 56/week @ 2022-11-20 5/week @ 2022-11-27

61 downloads per month

MIT/Apache

80KB
300 lines

LaxCow

CI status Crate Docs License

Clone-on-write smart pointer similar to Cow, but with relaxed trait constraints. Crate is totally no_std.

Examples

Simple usage

use laxcow::LaxCow;

let lc = LaxCow::Borrowed("foobar");

let lc2 = lc.clone();
assert_eq!(lc2, LaxCow::Borrowed("foobar"));

let owned = lc.into_owned();
assert_eq!(owned, "foobar".to_owned());

Usage not possible with Cow

Storing a borrowed struct which doesn't implement Clone. This is possible because LaxCow::Owned variant is not restricted by the LaxCow::Borrowed variant via ToOwned trait.

use laxcow::LaxCow;

struct Foo;

// We don't care about the owned type as it is not used.
let laxcow = LaxCow::<_, ()>::Borrowed(&Foo);

Cow definition by wrapping LaxCow

This example shows the difference between LaxCow and Cow. It makes Cow a struct, but only works here as an example.

use laxcow::LaxCow;

struct Cow<'a, T: ?Sized + ToOwned>(LaxCow::<'a, T, <T as ToOwned>::Owned>);

License

Licensed under either of

at your option.

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

No runtime deps