Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--lib/smol_str/src/lib.rs28
1 files changed, 26 insertions, 2 deletions
diff --git a/lib/smol_str/src/lib.rs b/lib/smol_str/src/lib.rs
index d76f029dbe..ff25651f54 100644
--- a/lib/smol_str/src/lib.rs
+++ b/lib/smol_str/src/lib.rs
@@ -644,12 +644,36 @@ impl StrExt for str {
#[inline]
fn to_ascii_lowercase_smolstr(&self) -> SmolStr {
- from_char_iter(self.chars().map(|c| c.to_ascii_lowercase()))
+ let len = self.len();
+ if len <= INLINE_CAP {
+ let mut buf = [0u8; INLINE_CAP];
+ buf[..len].copy_from_slice(self.as_bytes());
+ buf[..len].make_ascii_lowercase();
+ SmolStr(Repr::Inline {
+ // SAFETY: `len` is in bounds
+ len: unsafe { InlineSize::transmute_from_u8(len as u8) },
+ buf,
+ })
+ } else {
+ self.to_ascii_lowercase().into()
+ }
}
#[inline]
fn to_ascii_uppercase_smolstr(&self) -> SmolStr {
- from_char_iter(self.chars().map(|c| c.to_ascii_uppercase()))
+ let len = self.len();
+ if len <= INLINE_CAP {
+ let mut buf = [0u8; INLINE_CAP];
+ buf[..len].copy_from_slice(self.as_bytes());
+ buf[..len].make_ascii_uppercase();
+ SmolStr(Repr::Inline {
+ // SAFETY: `len` is in bounds
+ len: unsafe { InlineSize::transmute_from_u8(len as u8) },
+ buf,
+ })
+ } else {
+ self.to_ascii_uppercase().into()
+ }
}
#[inline]