about summary refs log tree commit diff
path: root/library/alloc
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-10-23 01:03:48 +0000
committerbors <bors@rust-lang.org>2024-10-23 01:03:48 +0000
commitb13176595d8a9fd27334747080764a53a18f4c24 (patch)
tree09ade9d4ba8d3de7e8fea4dfa181b02a191bc866 /library/alloc
parent8bf64f106ac0cd1f2b9c6fd27965dd2dc4b862dd (diff)
parentc8391802afc158759dfe234e22f665d39091ea8d (diff)
downloadrust-b13176595d8a9fd27334747080764a53a18f4c24.tar.gz
rust-b13176595d8a9fd27334747080764a53a18f4c24.zip
Auto merge of #131929 - LaihoE:replace_default_capacity, r=joboet
better default capacity for str::replace

Adds smarter capacity for str::replace in cases where we know that the output will be at least as long as the original string.
Diffstat (limited to 'library/alloc')
-rw-r--r--library/alloc/src/str.rs12
1 files changed, 8 insertions, 4 deletions
diff --git a/library/alloc/src/str.rs b/library/alloc/src/str.rs
index 52ceb8b45f9..26c1ba2a5c4 100644
--- a/library/alloc/src/str.rs
+++ b/library/alloc/src/str.rs
@@ -269,8 +269,7 @@ impl str {
     #[stable(feature = "rust1", since = "1.0.0")]
     #[inline]
     pub fn replace<P: Pattern>(&self, from: P, to: &str) -> String {
-        // Fast path for ASCII to ASCII case.
-
+        // Fast path for replacing a single ASCII character with another.
         if let Some(from_byte) = match from.as_utf8_pattern() {
             Some(Utf8Pattern::StringPattern([from_byte])) => Some(*from_byte),
             Some(Utf8Pattern::CharPattern(c)) => c.as_ascii().map(|ascii_char| ascii_char.to_u8()),
@@ -280,8 +279,13 @@ impl str {
                 return unsafe { replace_ascii(self.as_bytes(), from_byte, *to_byte) };
             }
         }
-
-        let mut result = String::new();
+        // Set result capacity to self.len() when from.len() <= to.len()
+        let default_capacity = match from.as_utf8_pattern() {
+            Some(Utf8Pattern::StringPattern(s)) if s.len() <= to.len() => self.len(),
+            Some(Utf8Pattern::CharPattern(c)) if c.len_utf8() <= to.len() => self.len(),
+            _ => 0,
+        };
+        let mut result = String::with_capacity(default_capacity);
         let mut last_end = 0;
         for (start, part) in self.match_indices(from) {
             result.push_str(unsafe { self.get_unchecked(last_end..start) });