diff options
| author | Jordi Boggiano <j.boggiano@seld.be> | 2013-06-29 04:53:52 +0200 |
|---|---|---|
| committer | Jordi Boggiano <j.boggiano@seld.be> | 2013-06-29 04:53:52 +0200 |
| commit | 647b4a6bcd921507943a60fcc413f4ae69b2609c (patch) | |
| tree | 5f756f4055d9eeacdd4c5b795cc8724517fd74ed /src/libstd | |
| parent | e23934645aa7eb526e9f55da6b3d7c262dc1670f (diff) | |
| download | rust-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.rs | 11 |
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] |
