Rewrite str.starts_with()/ends_with() to be simpler

This commit is contained in:
Kevin Ballard 2013-10-16 23:02:46 -07:00
parent 2fcb53493d
commit 87a2d032ff

View file

@ -827,17 +827,6 @@ pub fn eq(a: &~str, b: &~str) -> bool {
eq_slice(*a, *b)
}
/*
Section: Searching
*/
// Utility used by various searching functions
fn match_at<'a,'b>(haystack: &'a str, needle: &'b str, at: uint) -> bool {
let mut i = at;
for c in needle.byte_iter() { if haystack[i] != c { return false; } i += 1u; }
return true;
}
/*
Section: Misc
*/
@ -2018,18 +2007,16 @@ impl<'self> StrSlice<'self> for &'self str {
}
}
#[inline]
fn starts_with<'a>(&self, needle: &'a str) -> bool {
let (self_len, needle_len) = (self.len(), needle.len());
if needle_len == 0u { true }
else if needle_len > self_len { false }
else { match_at(*self, needle, 0u) }
let n = needle.len();
self.len() >= n && needle == self.slice_to(n)
}
#[inline]
fn ends_with(&self, needle: &str) -> bool {
let (self_len, needle_len) = (self.len(), needle.len());
if needle_len == 0u { true }
else if needle_len > self_len { false }
else { match_at(*self, needle, self_len - needle_len) }
let (m, n) = (self.len(), needle.len());
m >= n && needle == self.slice_from(m - n)
}
fn escape_default(&self) -> ~str {