| Crates.io | laxcow |
| lib.rs | laxcow |
| version | 0.2.0 |
| created_at | 2022-11-20 13:28:17.033759+00 |
| updated_at | 2023-04-28 17:27:34.319073+00 |
| description | Clone-on-write smart pointer with relaxed trait constraints |
| homepage | https://github.com/kauppie/laxcow/tree/main |
| repository | https://github.com/kauppie/laxcow/tree/main |
| max_upload_size | |
| id | 719117 |
| size | 30,463 |
Clone-on-write smart pointer similar to Cow, but with relaxed trait constraints. Crate is totally no_std.
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());
CowStoring 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 LaxCowThis 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>);
allocLaxCow can be used without alloc but this restricts the usage quite a bit as ToOwned is defined in alloc.
Interaction with Cow also is not possible. It is also
debatable if clone-on-write functionality is useful in no_std environment, but this crate tries not to make
any assumptions about the usage.
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.