Crates.io | cow-utils |
lib.rs | cow-utils |
version | 0.1.3 |
source | src |
created_at | 2020-02-16 02:57:44.196279 |
updated_at | 2023-09-26 20:31:17.795671 |
description | Copy-on-write string utilities for Rust |
homepage | |
repository | https://github.com/RReverser/cow-utils-rs |
max_upload_size | |
id | 209657 |
size | 19,872 |
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).
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 |
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:
.cow_replace
instead of str::replace
.cow_replacen
instead of str::replacen
.cow_to_ascii_lowercase
instead of str::to_ascii_lowercase
.cow_to_ascii_uppercase
instead of str::to_ascii_uppercase
.cow_to_lowercase
instead of str::to_lowercase
.cow_to_uppercase
instead of str::to_uppercase
Check out the docs for detailed examples.