about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorJordi Boggiano <j.boggiano@seld.be>2013-06-29 04:53:52 +0200
committerJordi Boggiano <j.boggiano@seld.be>2013-06-29 04:53:52 +0200
commit647b4a6bcd921507943a60fcc413f4ae69b2609c (patch)
tree5f756f4055d9eeacdd4c5b795cc8724517fd74ed /src/libstd
parente23934645aa7eb526e9f55da6b3d7c262dc1670f (diff)
downloadrust-647b4a6bcd921507943a60fcc413f4ae69b2609c.tar.gz
rust-647b4a6bcd921507943a60fcc413f4ae69b2609c.zip
Optimize str::each_split_within when it is called with large limits
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/str.rs11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/libstd/str.rs b/src/libstd/str.rs
index 2144afc0fbd..acf136689dc 100644
--- a/src/libstd/str.rs
+++ b/src/libstd/str.rs
@@ -434,10 +434,17 @@ pub fn each_split_within<'a>(ss: &'a str,
     let mut last_start = 0;
     let mut last_end = 0;
     let mut state = A;
+    let mut fake_i = ss.len();
+    let mut lim = lim;
 
     let mut cont = true;
     let slice: &fn() = || { cont = it(ss.slice(slice_start, last_end)) };
 
+    // if the limit is larger than the string, lower it to save cycles
+    if (lim >= fake_i) {
+        lim = fake_i;
+    }
+
     let machine: &fn((uint, char)) -> bool = |(i, c)| {
         let whitespace = if char::is_whitespace(c)       { Ws }       else { Cr };
         let limit      = if (i - slice_start + 1) <= lim { UnderLim } else { OverLim };
@@ -466,7 +473,6 @@ pub fn each_split_within<'a>(ss: &'a str,
     ss.iter().enumerate().advance(machine);
 
     // Let the automaton 'run out' by supplying trailing whitespace
-    let mut fake_i = ss.len();
     while cont && match state { B | C => true, A => false } {
         machine((fake_i, ' '));
         fake_i += 1;
@@ -2299,6 +2305,7 @@ mod tests {
     use libc;
     use ptr;
     use str::*;
+    use uint;
     use vec;
     use vec::{ImmutableVector, CopyableVector};
     use cmp::{TotalOrd, Less, Equal, Greater};
@@ -2444,6 +2451,8 @@ mod tests {
         t("hello", 15, [~"hello"]);
         t("\nMary had a little lamb\nLittle lamb\n", 15,
             [~"Mary had a", ~"little lamb", ~"Little lamb"]);
+        t("\nMary had a little lamb\nLittle lamb\n", uint::max_value,
+            [~"Mary had a little lamb\nLittle lamb"]);
     }
 
     #[test]