about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKevin Ballard <kevin@sb.org>2013-10-16 23:02:46 -0700
committerKevin Ballard <kevin@sb.org>2013-10-16 23:17:34 -0700
commit87a2d032ff6fe74e97348189f95a3a91fd9e228e (patch)
tree4db1f17013b3991d026b3acfcc38cd11bffade64
parent2fcb53493dc80469acf86797c53dacc331629d50 (diff)
downloadrust-87a2d032ff6fe74e97348189f95a3a91fd9e228e.tar.gz
rust-87a2d032ff6fe74e97348189f95a3a91fd9e228e.zip
Rewrite str.starts_with()/ends_with() to be simpler
-rw-r--r--src/libstd/str.rs25
1 files changed, 6 insertions, 19 deletions
diff --git a/src/libstd/str.rs b/src/libstd/str.rs
index decfbb0785c..5c6974de17d 100644
--- a/src/libstd/str.rs
+++ b/src/libstd/str.rs
@@ -828,17 +828,6 @@ pub fn eq(a: &~str, b: &~str) -> bool {
 }
 
 /*
-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 {