diff options
Diffstat (limited to 'src/libcore/str.rs')
| -rw-r--r-- | src/libcore/str.rs | 186 |
1 files changed, 99 insertions, 87 deletions
diff --git a/src/libcore/str.rs b/src/libcore/str.rs index 3d704b42a0e..f133a1fbfa6 100644 --- a/src/libcore/str.rs +++ b/src/libcore/str.rs @@ -29,6 +29,7 @@ use str; use u8; use uint; use vec; +use to_str::ToStr; #[cfg(notest)] use cmp::{Eq, Ord}; @@ -53,6 +54,19 @@ pub pure fn from_slice(s: &str) -> ~str { unsafe { raw::slice_bytes_unique(s, 0, len(s)) } } +impl ToStr for ~str { + #[inline(always)] + pure fn to_str(&self) -> ~str { copy *self } +} +impl ToStr for &'self str { + #[inline(always)] + pure fn to_str(&self) -> ~str { ::str::from_slice(*self) } +} +impl ToStr for @str { + #[inline(always)] + pure fn to_str(&self) -> ~str { ::str::from_slice(*self) } +} + /** * Convert a byte to a UTF-8 string * @@ -299,12 +313,12 @@ pub fn unshift_char(s: &mut ~str, ch: char) { * * chars_to_trim - A vector of chars * */ -pub pure fn trim_left_chars(s: &str, chars_to_trim: &[char]) -> ~str { - if chars_to_trim.is_empty() { return from_slice(s); } +pub pure fn trim_left_chars_DBGBRWD(s: &'a str, chars_to_trim: &[char]) -> &'a str { + if chars_to_trim.is_empty() { return s; } match find(s, |c| !chars_to_trim.contains(&c)) { - None => ~"", - Some(first) => unsafe { raw::slice_bytes_unique(s, first, s.len()) } + None => "", + Some(first) => unsafe { raw::slice_bytes(s, first, s.len()) } } } @@ -317,14 +331,14 @@ pub pure fn trim_left_chars(s: &str, chars_to_trim: &[char]) -> ~str { * * chars_to_trim - A vector of chars * */ -pub pure fn trim_right_chars(s: &str, chars_to_trim: &[char]) -> ~str { - if chars_to_trim.is_empty() { return str::from_slice(s); } +pub pure fn trim_right_chars_DBGBRWD(s: &'a str, chars_to_trim: &[char]) -> &'a str { + if chars_to_trim.is_empty() { return s; } match rfind(s, |c| !chars_to_trim.contains(&c)) { - None => ~"", + None => "", Some(last) => { let next = char_range_at(s, last).next; - unsafe { raw::slice_bytes_unique(s, 0u, next) } + unsafe { raw::slice_bytes(s, 0u, next) } } } } @@ -338,31 +352,31 @@ pub pure fn trim_right_chars(s: &str, chars_to_trim: &[char]) -> ~str { * * chars_to_trim - A vector of chars * */ -pub pure fn trim_chars(s: &str, chars_to_trim: &[char]) -> ~str { - trim_left_chars(trim_right_chars(s, chars_to_trim), chars_to_trim) +pub pure fn trim_chars_DBGBRWD(s: &'a str, chars_to_trim: &[char]) -> &'a str { + trim_left_chars_DBGBRWD(trim_right_chars_DBGBRWD(s, chars_to_trim), chars_to_trim) } /// Returns a string with leading whitespace removed -pub pure fn trim_left(s: &str) -> ~str { +pub pure fn trim_left_DBGBRWD(s: &'a str) -> &'a str { match find(s, |c| !char::is_whitespace(c)) { - None => ~"", - Some(first) => unsafe { raw::slice_bytes_unique(s, first, len(s)) } + None => "", + Some(first) => unsafe { raw::slice_bytes(s, first, len(s)) } } } /// Returns a string with trailing whitespace removed -pub pure fn trim_right(s: &str) -> ~str { +pub pure fn trim_right_DBGBRWD(s: &'a str) -> &'a str { match rfind(s, |c| !char::is_whitespace(c)) { - None => ~"", + None => "", Some(last) => { let next = char_range_at(s, last).next; - unsafe { raw::slice_bytes_unique(s, 0u, next) } + unsafe { raw::slice_bytes(s, 0u, next) } } } } /// Returns a string with leading and trailing whitespace removed -pub pure fn trim(s: &str) -> ~str { trim_left(trim_right(s)) } +pub pure fn trim_DBGBRWD(s: &'a str) -> &'a str { trim_left_DBGBRWD(trim_right_DBGBRWD(s)) } /* Section: Transforming strings @@ -407,8 +421,8 @@ pub pure fn chars(s: &str) -> ~[char] { * Returns a string containing `n` characters starting at byte offset * `begin`. */ -pub pure fn substr(s: &str, begin: uint, n: uint) -> ~str { - slice(s, begin, begin + count_bytes(s, begin, n)).to_owned() +pub pure fn substr_DBGBRWD(s: &'a str, begin: uint, n: uint) -> &'a str { + slice(s, begin, begin + count_bytes(s, begin, n)) } /** @@ -2221,25 +2235,6 @@ pub mod raw { } -pub trait Trimmable { - pure fn trim(&self) -> Self; - pure fn trim_left(&self) -> Self; - pure fn trim_right(&self) -> Self; -} - -/// Extension methods for strings -impl Trimmable for ~str { - /// Returns a string with leading and trailing whitespace removed - #[inline] - pure fn trim(&self) -> ~str { trim(*self) } - /// Returns a string with leading whitespace removed - #[inline] - pure fn trim_left(&self) -> ~str { trim_left(*self) } - /// Returns a string with trailing whitespace removed - #[inline] - pure fn trim_right(&self) -> ~str { trim_right(*self) } -} - #[cfg(notest)] pub mod traits { use ops::Add; @@ -2280,14 +2275,17 @@ pub trait StrSlice { pure fn split_char(&self, sep: char) -> ~[~str]; pure fn split_str(&self, sep: &'a str) -> ~[~str]; pure fn starts_with(&self, needle: &'a str) -> bool; - pure fn substr(&self, begin: uint, n: uint) -> ~str; + pure fn substr_DBGBRWD(&self, begin: uint, n: uint) -> &'self str; pure fn to_lower(&self) -> ~str; pure fn to_upper(&self) -> ~str; pure fn escape_default(&self) -> ~str; pure fn escape_unicode(&self) -> ~str; - pure fn trim(&self) -> ~str; - pure fn trim_left(&self) -> ~str; - pure fn trim_right(&self) -> ~str; + pure fn trim_DBGBRWD(&self) -> &'self str; + pure fn trim_left_DBGBRWD(&self) -> &'self str; + pure fn trim_right_DBGBRWD(&self) -> &'self str; + pure fn trim_chars_DBGBRWD(&self, chars_to_trim: &[char]) -> &'self str; + pure fn trim_left_chars_DBGBRWD(&self, chars_to_trim: &[char]) -> &'self str; + pure fn trim_right_chars_DBGBRWD(&self, chars_to_trim: &[char]) -> &'self str; pure fn to_owned(&self) -> ~str; pure fn to_managed(&self) -> @str; pure fn char_at(&self, i: uint) -> char; @@ -2421,8 +2419,8 @@ impl StrSlice for &'self str { * `begin`. */ #[inline] - pure fn substr(&self, begin: uint, n: uint) -> ~str { - substr(*self, begin, n) + pure fn substr_DBGBRWD(&self, begin: uint, n: uint) -> &'self str { + substr_DBGBRWD(*self, begin, n) } /// Convert a string to lowercase #[inline] @@ -2439,13 +2437,27 @@ impl StrSlice for &'self str { /// Returns a string with leading and trailing whitespace removed #[inline] - pure fn trim(&self) -> ~str { trim(*self) } + pure fn trim_DBGBRWD(&self) -> &'self str { trim_DBGBRWD(*self) } /// Returns a string with leading whitespace removed #[inline] - pure fn trim_left(&self) -> ~str { trim_left(*self) } + pure fn trim_left_DBGBRWD(&self) -> &'self str { trim_left_DBGBRWD(*self) } /// Returns a string with trailing whitespace removed #[inline] - pure fn trim_right(&self) -> ~str { trim_right(*self) } + pure fn trim_right_DBGBRWD(&self) -> &'self str { trim_right_DBGBRWD(*self) } + + #[inline] + pure fn trim_chars_DBGBRWD(&self, chars_to_trim: &[char]) -> &'self str { + trim_chars_DBGBRWD(*self, chars_to_trim) + } + #[inline] + pure fn trim_left_chars_DBGBRWD(&self, chars_to_trim: &[char]) -> &'self str { + trim_left_chars_DBGBRWD(*self, chars_to_trim) + } + #[inline] + pure fn trim_right_chars_DBGBRWD(&self, chars_to_trim: &[char]) -> &'self str { + trim_right_chars_DBGBRWD(*self, chars_to_trim) + } + #[inline] pure fn to_owned(&self) -> ~str { from_slice(*self) } @@ -2805,11 +2817,11 @@ mod tests { #[test] fn test_substr() { fn t(a: &str, b: &str, start: int) { - fail_unless!(substr(a, start as uint, len(b)) == b.to_str()); + fail_unless!(substr_DBGBRWD(a, start as uint, len(b)) == b); } - t(~"hello", ~"llo", 2); - t(~"hello", ~"el", 1); - fail_unless!(~"ะเทศไท" == substr(~"ประเทศไทย中华Việt Nam", 6u, 6u)); + t("hello", "llo", 2); + t("hello", "el", 1); + fail_unless!("ะเทศไท" == substr_DBGBRWD("ประเทศไทย中华Việt Nam", 6u, 6u)); } #[test] @@ -3042,62 +3054,62 @@ mod tests { #[test] fn test_trim_left_chars() { - fail_unless!(trim_left_chars(~" *** foo *** ", ~[]) == - ~" *** foo *** "); - fail_unless!(trim_left_chars(~" *** foo *** ", ~['*', ' ']) == - ~"foo *** "); - fail_unless!(trim_left_chars(~" *** *** ", ~['*', ' ']) == ~""); - fail_unless!(trim_left_chars(~"foo *** ", ~['*', ' ']) == - ~"foo *** "); + fail_unless!(trim_left_chars_DBGBRWD(" *** foo *** ", ~[]) == + " *** foo *** "); + fail_unless!(trim_left_chars_DBGBRWD(" *** foo *** ", ~['*', ' ']) == + "foo *** "); + fail_unless!(trim_left_chars_DBGBRWD(" *** *** ", ~['*', ' ']) == ""); + fail_unless!(trim_left_chars_DBGBRWD("foo *** ", ~['*', ' ']) == + "foo *** "); } #[test] fn test_trim_right_chars() { - fail_unless!(trim_right_chars(~" *** foo *** ", ~[]) == - ~" *** foo *** "); - fail_unless!(trim_right_chars(~" *** foo *** ", ~['*', ' ']) == - ~" *** foo"); - fail_unless!(trim_right_chars(~" *** *** ", ~['*', ' ']) == ~""); - fail_unless!(trim_right_chars(~" *** foo", ~['*', ' ']) == - ~" *** foo"); + fail_unless!(trim_right_chars_DBGBRWD(" *** foo *** ", ~[]) == + " *** foo *** "); + fail_unless!(trim_right_chars_DBGBRWD(" *** foo *** ", ~['*', ' ']) == + " *** foo"); + fail_unless!(trim_right_chars_DBGBRWD(" *** *** ", ~['*', ' ']) == ""); + fail_unless!(trim_right_chars_DBGBRWD(" *** foo", ~['*', ' ']) == + " *** foo"); } #[test] fn test_trim_chars() { - fail_unless!(trim_chars(~" *** foo *** ", ~[]) == ~" *** foo *** "); - fail_unless!(trim_chars(~" *** foo *** ", ~['*', ' ']) == ~"foo"); - fail_unless!(trim_chars(~" *** *** ", ~['*', ' ']) == ~""); - fail_unless!(trim_chars(~"foo", ~['*', ' ']) == ~"foo"); + fail_unless!(trim_chars_DBGBRWD(" *** foo *** ", ~[]) == " *** foo *** "); + fail_unless!(trim_chars_DBGBRWD(" *** foo *** ", ~['*', ' ']) == "foo"); + fail_unless!(trim_chars_DBGBRWD(" *** *** ", ~['*', ' ']) == ""); + fail_unless!(trim_chars_DBGBRWD("foo", ~['*', ' ']) == "foo"); } #[test] fn test_trim_left() { - fail_unless!((trim_left(~"") == ~"")); - fail_unless!((trim_left(~"a") == ~"a")); - fail_unless!((trim_left(~" ") == ~"")); - fail_unless!((trim_left(~" blah") == ~"blah")); - fail_unless!((trim_left(~" \u3000 wut") == ~"wut")); - fail_unless!((trim_left(~"hey ") == ~"hey ")); + fail_unless!((trim_left_DBGBRWD("") == "")); + fail_unless!((trim_left_DBGBRWD("a") == "a")); + fail_unless!((trim_left_DBGBRWD(" ") == "")); + fail_unless!((trim_left_DBGBRWD(" blah") == "blah")); + fail_unless!((trim_left_DBGBRWD(" \u3000 wut") == "wut")); + fail_unless!((trim_left_DBGBRWD("hey ") == "hey ")); } #[test] fn test_trim_right() { - fail_unless!((trim_right(~"") == ~"")); - fail_unless!((trim_right(~"a") == ~"a")); - fail_unless!((trim_right(~" ") == ~"")); - fail_unless!((trim_right(~"blah ") == ~"blah")); - fail_unless!((trim_right(~"wut \u3000 ") == ~"wut")); - fail_unless!((trim_right(~" hey") == ~" hey")); + fail_unless!((trim_right_DBGBRWD("") == "")); + fail_unless!((trim_right_DBGBRWD("a") == "a")); + fail_unless!((trim_right_DBGBRWD(" ") == "")); + fail_unless!((trim_right_DBGBRWD("blah ") == "blah")); + fail_unless!((trim_right_DBGBRWD("wut \u3000 ") == "wut")); + fail_unless!((trim_right_DBGBRWD(" hey") == " hey")); } #[test] fn test_trim() { - fail_unless!((trim(~"") == ~"")); - fail_unless!((trim(~"a") == ~"a")); - fail_unless!((trim(~" ") == ~"")); - fail_unless!((trim(~" blah ") == ~"blah")); - fail_unless!((trim(~"\nwut \u3000 ") == ~"wut")); - fail_unless!((trim(~" hey dude ") == ~"hey dude")); + fail_unless!((trim_DBGBRWD("") == "")); + fail_unless!((trim_DBGBRWD("a") == "a")); + fail_unless!((trim_DBGBRWD(" ") == "")); + fail_unless!((trim_DBGBRWD(" blah ") == "blah")); + fail_unless!((trim_DBGBRWD("\nwut \u3000 ") == "wut")); + fail_unless!((trim_DBGBRWD(" hey dude ") == "hey dude")); } #[test] |
