Skip to content

Commit af35d53

Browse files
committed
Constify AsciiStr::trim methods
* AsciiStr::trim_start() * AsciiStr::trim_end() * AsciiStr::trim()
1 parent 8bca2c2 commit af35d53

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

src/ascii_str.rs

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ impl AsciiStr {
278278
/// assert_eq!("white \tspace", example.trim());
279279
/// ```
280280
#[must_use]
281-
pub fn trim(&self) -> &Self {
281+
pub const fn trim(&self) -> &Self {
282282
self.trim_start().trim_end()
283283
}
284284

@@ -291,14 +291,16 @@ impl AsciiStr {
291291
/// assert_eq!("white \tspace \t", example.trim_start());
292292
/// ```
293293
#[must_use]
294-
pub fn trim_start(&self) -> &Self {
295-
let whitespace_len = self
296-
.chars()
297-
.position(|ch| !ch.is_whitespace())
298-
.unwrap_or_else(|| self.len());
299-
300-
// SAFETY: `whitespace_len` is `0..=len`, which is at most `len`, which is a valid empty slice.
301-
unsafe { self.as_slice().get_unchecked(whitespace_len..).into() }
294+
pub const fn trim_start(&self) -> &Self {
295+
let mut trimmed = &self.slice;
296+
while let Some((first, rest)) = trimmed.split_first() {
297+
if first.is_whitespace() {
298+
trimmed = rest;
299+
} else {
300+
break;
301+
}
302+
}
303+
AsciiStr::new(trimmed)
302304
}
303305

304306
/// Returns an ASCII string slice with trailing whitespace removed.
@@ -310,20 +312,16 @@ impl AsciiStr {
310312
/// assert_eq!(" \twhite \tspace", example.trim_end());
311313
/// ```
312314
#[must_use]
313-
pub fn trim_end(&self) -> &Self {
314-
// Number of whitespace characters counting from the end
315-
let whitespace_len = self
316-
.chars()
317-
.rev()
318-
.position(|ch| !ch.is_whitespace())
319-
.unwrap_or_else(|| self.len());
320-
321-
// SAFETY: `whitespace_len` is `0..=len`, which is at most `len`, which is a valid empty slice, and at least `0`, which is the whole slice.
322-
unsafe {
323-
self.as_slice()
324-
.get_unchecked(..self.len() - whitespace_len)
325-
.into()
315+
pub const fn trim_end(&self) -> &Self {
316+
let mut trimmed = &self.slice;
317+
while let Some((last, rest)) = trimmed.split_last() {
318+
if last.is_whitespace() {
319+
trimmed = rest;
320+
} else {
321+
break;
322+
}
326323
}
324+
AsciiStr::new(trimmed)
327325
}
328326

329327
/// Compares two strings case-insensitively.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy