diff options
| author | bors <bors@rust-lang.org> | 2015-02-22 22:45:46 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-02-22 22:45:46 +0000 |
| commit | 67eb38ee4cfd7b28f8498b5b6492da172768dcb9 (patch) | |
| tree | 358263816246c0e05a4ba458cadb266307a96172 /src/libcollections | |
| parent | dcc6ce2c772cb851ac35cbc2ddafcae9bf2fa9fd (diff) | |
| parent | c8dd2d066d7b25246d2b940b7c161b8b67608b74 (diff) | |
| download | rust-67eb38ee4cfd7b28f8498b5b6492da172768dcb9.tar.gz rust-67eb38ee4cfd7b28f8498b5b6492da172768dcb9.zip | |
Auto merge of #22466 - Kimundi:str_pattern_ai_safe, r=aturon
This is not a complete implementation of the RFC: - only existing methods got updated, no new ones added - doc comments are not extensive enough yet - optimizations got lost and need to be reimplemented See https://github.com/rust-lang/rfcs/pull/528 Technically a [breaking-change]
Diffstat (limited to 'src/libcollections')
| -rw-r--r-- | src/libcollections/str.rs | 91 |
1 files changed, 35 insertions, 56 deletions
diff --git a/src/libcollections/str.rs b/src/libcollections/str.rs index ec0a487acdc..92dc01dc3e4 100644 --- a/src/libcollections/str.rs +++ b/src/libcollections/str.rs @@ -82,6 +82,8 @@ pub use core::str::{SplitN, RSplitN}; pub use core::str::{from_utf8, CharEq, Chars, CharIndices, Bytes}; pub use core::str::{from_utf8_unchecked, from_c_str, ParseBoolError}; pub use unicode::str::{Words, Graphemes, GraphemeIndices}; +pub use core::str::Pattern; +pub use core::str::{Searcher, ReverseSearcher, DoubleEndedSearcher, SearchStep}; /* Section: Creating a string @@ -530,7 +532,7 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert!("bananas".contains("nana")); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn contains(&self, pat: &str) -> bool { + fn contains<'a, P: Pattern<'a>>(&'a self, pat: P) -> bool { core_str::StrExt::contains(&self[..], pat) } @@ -545,9 +547,9 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// ```rust /// assert!("hello".contains_char('e')); /// ``` - #[unstable(feature = "collections", - reason = "might get removed in favour of a more generic contains()")] - fn contains_char<P: CharEq>(&self, pat: P) -> bool { + #[unstable(feature = "collections")] + #[deprecated(since = "1.0.0", reason = "use `contains()` with a char")] + fn contains_char<'a, P: Pattern<'a>>(&'a self, pat: P) -> bool { core_str::StrExt::contains_char(&self[..], pat) } @@ -603,7 +605,7 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert_eq!(v, vec![""]); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn split<P: CharEq>(&self, pat: P) -> Split<P> { + fn split<'a, P: Pattern<'a>>(&'a self, pat: P) -> Split<'a, P> { core_str::StrExt::split(&self[..], pat) } @@ -630,7 +632,7 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert_eq!(v, vec![""]); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn splitn<P: CharEq>(&self, count: usize, pat: P) -> SplitN<P> { + fn splitn<'a, P: Pattern<'a>>(&'a self, count: usize, pat: P) -> SplitN<'a, P> { core_str::StrExt::splitn(&self[..], count, pat) } @@ -658,8 +660,8 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// let v: Vec<&str> = "lionXXtigerXleopard".split('X').rev().collect(); /// assert_eq!(v, vec!["leopard", "tiger", "", "lion"]); /// ``` - #[unstable(feature = "collections", reason = "might get removed")] - fn split_terminator<P: CharEq>(&self, pat: P) -> SplitTerminator<P> { + #[stable(feature = "rust1", since = "1.0.0")] + fn split_terminator<'a, P: Pattern<'a>>(&'a self, pat: P) -> SplitTerminator<'a, P> { core_str::StrExt::split_terminator(&self[..], pat) } @@ -680,7 +682,7 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert_eq!(v, vec!["leopard", "tiger", "lionX"]); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn rsplitn<P: CharEq>(&self, count: usize, pat: P) -> RSplitN<P> { + fn rsplitn<'a, P: Pattern<'a>>(&'a self, count: usize, pat: P) -> RSplitN<'a, P> { core_str::StrExt::rsplitn(&self[..], count, pat) } @@ -706,7 +708,9 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// ``` #[unstable(feature = "collections", reason = "might have its iterator type changed")] - fn match_indices<'a>(&'a self, pat: &'a str) -> MatchIndices<'a> { + // NB: Right now MatchIndices yields `(usize, usize)`, + // but it would be more consistent and useful to return `(usize, &str)` + fn match_indices<'a, P: Pattern<'a>>(&'a self, pat: P) -> MatchIndices<'a, P> { core_str::StrExt::match_indices(&self[..], pat) } @@ -721,9 +725,9 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// let v: Vec<&str> = "1abcabc2".split_str("abc").collect(); /// assert_eq!(v, vec!["1", "", "2"]); /// ``` - #[unstable(feature = "collections", - reason = "might get removed in the future in favor of a more generic split()")] - fn split_str<'a>(&'a self, pat: &'a str) -> SplitStr<'a> { + #[unstable(feature = "collections")] + #[deprecated(since = "1.0.0", reason = "use `split()` with a `&str`")] + fn split_str<'a, P: Pattern<'a>>(&'a self, pat: P) -> SplitStr<'a, P> { core_str::StrExt::split_str(&self[..], pat) } @@ -825,7 +829,7 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert!("banana".starts_with("ba")); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn starts_with(&self, pat: &str) -> bool { + fn starts_with<'a, P: Pattern<'a>>(&'a self, pat: P) -> bool { core_str::StrExt::starts_with(&self[..], pat) } @@ -837,7 +841,9 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert!("banana".ends_with("nana")); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn ends_with(&self, pat: &str) -> bool { + fn ends_with<'a, P: Pattern<'a>>(&'a self, pat: P) -> bool + where P::Searcher: ReverseSearcher<'a> + { core_str::StrExt::ends_with(&self[..], pat) } @@ -857,7 +863,9 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert_eq!("123foo1bar123".trim_matches(|c: char| c.is_numeric()), "foo1bar"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn trim_matches<P: CharEq>(&self, pat: P) -> &str { + fn trim_matches<'a, P: Pattern<'a>>(&'a self, pat: P) -> &'a str + where P::Searcher: DoubleEndedSearcher<'a> + { core_str::StrExt::trim_matches(&self[..], pat) } @@ -877,7 +885,7 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert_eq!("123foo1bar123".trim_left_matches(|c: char| c.is_numeric()), "foo1bar123"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn trim_left_matches<P: CharEq>(&self, pat: P) -> &str { + fn trim_left_matches<'a, P: Pattern<'a>>(&'a self, pat: P) -> &'a str { core_str::StrExt::trim_left_matches(&self[..], pat) } @@ -897,7 +905,9 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert_eq!("123foo1bar123".trim_right_matches(|c: char| c.is_numeric()), "123foo1bar"); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn trim_right_matches<P: CharEq>(&self, pat: P) -> &str { + fn trim_right_matches<'a, P: Pattern<'a>>(&'a self, pat: P) -> &'a str + where P::Searcher: ReverseSearcher<'a> + { core_str::StrExt::trim_right_matches(&self[..], pat) } @@ -1074,7 +1084,7 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert_eq!(s.find(x), None); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn find<P: CharEq>(&self, pat: P) -> Option<usize> { + fn find<'a, P: Pattern<'a>>(&'a self, pat: P) -> Option<usize> { core_str::StrExt::find(&self[..], pat) } @@ -1102,7 +1112,9 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert_eq!(s.rfind(x), None); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - fn rfind<P: CharEq>(&self, pat: P) -> Option<usize> { + fn rfind<'a, P: Pattern<'a>>(&'a self, pat: P) -> Option<usize> + where P::Searcher: ReverseSearcher<'a> + { core_str::StrExt::rfind(&self[..], pat) } @@ -1125,9 +1137,9 @@ pub trait StrExt: Index<RangeFull, Output = str> { /// assert_eq!(s.find_str("老虎 L"), Some(6)); /// assert_eq!(s.find_str("muffin man"), None); /// ``` - #[unstable(feature = "collections", - reason = "might get removed in favor of a more generic find in the future")] - fn find_str(&self, needle: &str) -> Option<usize> { + #[unstable(feature = "collections")] + #[deprecated(since = "1.0.0", reason = "use `find()` with a `&str`")] + fn find_str<'a, P: Pattern<'a>>(&'a self, needle: P) -> Option<usize> { core_str::StrExt::find_str(&self[..], needle) } @@ -2888,22 +2900,6 @@ mod bench { } #[bench] - fn split_unicode_not_ascii(b: &mut Bencher) { - struct NotAscii(char); - impl CharEq for NotAscii { - fn matches(&mut self, c: char) -> bool { - let NotAscii(cc) = *self; - cc == c - } - fn only_ascii(&self) -> bool { false } - } - let s = "ประเทศไทย中华Việt Namประเทศไทย中华Việt Nam"; - - b.iter(|| assert_eq!(s.split(NotAscii('V')).count(), 3)); - } - - - #[bench] fn split_ascii(b: &mut Bencher) { let s = "Mary had a little lamb, Little lamb, little-lamb."; let len = s.split(' ').count(); @@ -2912,23 +2908,6 @@ mod bench { } #[bench] - fn split_not_ascii(b: &mut Bencher) { - struct NotAscii(char); - impl CharEq for NotAscii { - #[inline] - fn matches(&mut self, c: char) -> bool { - let NotAscii(cc) = *self; - cc == c - } - fn only_ascii(&self) -> bool { false } - } - let s = "Mary had a little lamb, Little lamb, little-lamb."; - let len = s.split(' ').count(); - - b.iter(|| assert_eq!(s.split(NotAscii(' ')).count(), len)); - } - - #[bench] fn split_extern_fn(b: &mut Bencher) { let s = "Mary had a little lamb, Little lamb, little-lamb."; let len = s.split(' ').count(); |
