31 releases (4 stable)
1.3.0 | Jan 23, 2024 |
---|---|
1.2.0 | Jul 29, 2023 |
1.0.0 | Jun 20, 2023 |
0.13.0 | Mar 21, 2023 |
0.9.0 | Nov 16, 2022 |
#295 in Rust patterns
41 downloads per month
Used in 6 crates
125KB
2.5K
SLoC
This library defines strings with copy-on-write semantics.
CowStr
Is a String that can be initialized to a static string or be build dynamically. Its contents can then be immutably shared and reference counted. When mutation is required the string will be copied first.
This resembles a improved Arc<Cow<'static, str>>
with some differences:
- No double dereference going from
Arc
toString
to the actual data. - There are no
Weak
references. CowStr
can be interior-mutable extended (append at the end).- Improved
AllocationStrategy
CowStr
implements many of the std::String
methods. Missing methods will be added as required,
PR's are welcome.
SubStr
Refers to an immutable slice inside of a CowStr
. This somewhat resembles the String
/&str
relationship while SubStr
keeping a strong reference to its orgin CowStr
and thus don't
need lifetimes.
Features
- serde wrapping the default string (de)serialization.
- nightly enable some nightly optimizations and extensions
Implementation Notes
CowStr
is made for sharing immutable strings, a short single CowStr
will occupy slightly
more memory than a std String
. But as soon a CowStr
is cloned or SubStr
's are used
it pays back. Especially since SubStr
don't need lifetimes as they use reference counting
memory management becomes significantly easier.
Because rust has yet incomplete support for DST's CowStr
needs some unsafe code. This is
liberally chosen, when possible contracts are enforced by debug_assert
's.
Testing
CowStr
commes with an extensive test suite. 'cargo-mutants' is used to detect missing
tests. Releases must pass testing under 'miri'.
Dependencies
~78–290KB