Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/stdx/src/lib.rs')
-rw-r--r--crates/stdx/src/lib.rs14
1 files changed, 11 insertions, 3 deletions
diff --git a/crates/stdx/src/lib.rs b/crates/stdx/src/lib.rs
index 978c50d807..82f17fb9f7 100644
--- a/crates/stdx/src/lib.rs
+++ b/crates/stdx/src/lib.rs
@@ -187,11 +187,19 @@ pub fn is_upper_snake_case(s: &str) -> bool {
}
pub fn replace(buf: &mut String, from: char, to: &str) {
- if !buf.contains(from) {
+ let replace_count = buf.chars().filter(|&ch| ch == from).count();
+ if replace_count == 0 {
return;
}
- // FIXME: do this in place.
- *buf = buf.replace(from, to);
+ let from_len = from.len_utf8();
+ let additional = to.len().saturating_sub(from_len);
+ buf.reserve(additional * replace_count);
+
+ let mut end = buf.len();
+ while let Some(i) = buf[..end].rfind(from) {
+ buf.replace_range(i..i + from_len, to);
+ end = i;
+ }
}
#[must_use]