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

#220 in Rust patterns

Download history 21/week @ 2024-01-20 1/week @ 2024-01-27 18/week @ 2024-02-17 102/week @ 2024-02-24 9/week @ 2024-03-02 30/week @ 2024-03-09 8/week @ 2024-03-16 2/week @ 2024-03-23 117/week @ 2024-03-30 13/week @ 2024-04-06

144 downloads per month
Used in 6 crates

MIT/Apache

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 to String 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

~81–320KB