A Cow
-like data structure where owned data is stored inside an Arc
.
Here's what it looks like:
pub enum CowArc<'a, T: ?Sized + 'static> {
Borrowed(&'a T),
Static(&'static T),
Owned(Arc<T>),
}
As implied by the Cow
name, this type allows for cheap immutable reference, but can be converted into a shared owned form via cloning when lifetime extension is required.
This data structure is particularly useful for str
or other values with a static lifetime,
as might be used in structures such as asset paths.
A 'static str
stored in a CowArc
can be cloned without allocations or bookkeeping,
while owned values are shared by reference-counting in a thread-safe fashion.
The similar cow_arc
crate already exists.
How does atomicow
differ?
Put simply: cow_arc
's data structure is just a wrapper over an Arc
.
While this is exactly what you need in some use cases,
the enum structure used in atomicow
is both more transparent and more flexible.
This crate is maintained by the Bevy organization, and is intended to be tiny, stable, zero-dependency, and broadly useful. Issues and pull requests are genuinely welcome!