Skip to content

Commit 87a2d03

Browse files
committed
Rewrite str.starts_with()/ends_with() to be simpler
1 parent 2fcb534 commit 87a2d03

File tree

1 file changed

+6
-19
lines changed

1 file changed

+6
-19
lines changed

src/libstd/str.rs

+6-19
Original file line numberDiff line numberDiff line change
@@ -827,17 +827,6 @@ pub fn eq(a: &~str, b: &~str) -> bool {
827827
eq_slice(*a, *b)
828828
}
829829

830-
/*
831-
Section: Searching
832-
*/
833-
834-
// Utility used by various searching functions
835-
fn match_at<'a,'b>(haystack: &'a str, needle: &'b str, at: uint) -> bool {
836-
let mut i = at;
837-
for c in needle.byte_iter() { if haystack[i] != c { return false; } i += 1u; }
838-
return true;
839-
}
840-
841830
/*
842831
Section: Misc
843832
*/
@@ -2018,18 +2007,16 @@ impl<'self> StrSlice<'self> for &'self str {
20182007
}
20192008
}
20202009
2010+
#[inline]
20212011
fn starts_with<'a>(&self, needle: &'a str) -> bool {
2022-
let (self_len, needle_len) = (self.len(), needle.len());
2023-
if needle_len == 0u { true }
2024-
else if needle_len > self_len { false }
2025-
else { match_at(*self, needle, 0u) }
2012+
let n = needle.len();
2013+
self.len() >= n && needle == self.slice_to(n)
20262014
}
20272015
2016+
#[inline]
20282017
fn ends_with(&self, needle: &str) -> bool {
2029-
let (self_len, needle_len) = (self.len(), needle.len());
2030-
if needle_len == 0u { true }
2031-
else if needle_len > self_len { false }
2032-
else { match_at(*self, needle, self_len - needle_len) }
2018+
let (m, n) = (self.len(), needle.len());
2019+
m >= n && needle == self.slice_from(m - n)
20332020
}
20342021
20352022
fn escape_default(&self) -> ~str {

0 commit comments

Comments
 (0)