in Rust ~ read.

Copy-on-write string utilities for Rust

View on GitHub

Crate docs
License

I wrote variations of these string manipulation utils so many times in various projects, so...

Introducing cow-utils - a helper crate for @rustlang that allows to perform zero-alloc string transformations when no transformation is actually necessary.


Some str methods
perform destructive transformations and so they allocate, copy into and
return a new
String even
when no modification is necessary.

This crate provides a helper trait CowUtils with drop-in variants of
such methods, which behave in the same way, but avoid extra copies and
allocations when no modification is necessary.

For now it's only implemented for &str and returns
std::borrow::Cow<str>,
but in the future might be extended to other types where even more
efficient handling is possible (e.g. in-place modifications on mutable
strings).

Performance

The primary motivation for this crate was ability to perform zero-alloc replacements when no match is found, so showing results only for .replace vs .cow_replace for now.

The actual results will vary depending on the inputs, but here is a taster based on "a".repeat(40) as an input and various modes (nothing matched, everything matched and replaced, everything matched from the start and deleted):

params .replace (ns) .cow_replace (ns) difference (%)
("a", "") 408.59 290.27 -29
("b", "c") 98.78 54.00 -45
("a", "b") 985.99 1,000.70 +1

Usage

First, you need to import CowUtils into the scope:

use cow_utils::CowUtils;

Then you can start invoking following .cow_-prefixed methods on
strings instead of the regular ones:

Check out the docs for detailed examples.