diff options
| author | bors <bors@rust-lang.org> | 2024-10-23 01:03:48 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-10-23 01:03:48 +0000 |
| commit | b13176595d8a9fd27334747080764a53a18f4c24 (patch) | |
| tree | 09ade9d4ba8d3de7e8fea4dfa181b02a191bc866 /library/alloc | |
| parent | 8bf64f106ac0cd1f2b9c6fd27965dd2dc4b862dd (diff) | |
| parent | c8391802afc158759dfe234e22f665d39091ea8d (diff) | |
| download | rust-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.rs | 12 |
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) }); |
