@@ -217,37 +217,37 @@ impl<'a, S: Str> StrVector for Vec<S> {
217
217
/// Something that can be used to compare against a character
218
218
pub trait CharEq {
219
219
/// Determine if the splitter should split at the given character
220
- fn matches ( & self , char ) -> bool ;
220
+ fn matches ( & mut self , char ) -> bool ;
221
221
/// Indicate if this is only concerned about ASCII characters,
222
222
/// which can allow for a faster implementation.
223
223
fn only_ascii ( & self ) -> bool ;
224
224
}
225
225
226
226
impl CharEq for char {
227
227
#[ inline]
228
- fn matches ( & self , c : char ) -> bool { * self == c }
228
+ fn matches ( & mut self , c : char ) -> bool { * self == c }
229
229
230
230
fn only_ascii ( & self ) -> bool { ( * self as uint ) < 128 }
231
231
}
232
232
233
233
impl < ' a > CharEq for |char|: ' a -> bool {
234
234
#[ inline]
235
- fn matches ( & self , c : char ) -> bool { ( * self ) ( c) }
235
+ fn matches ( & mut self , c : char ) -> bool { ( * self ) ( c) }
236
236
237
237
fn only_ascii ( & self ) -> bool { false }
238
238
}
239
239
240
240
impl CharEq for extern "Rust" fn ( char ) -> bool {
241
241
#[ inline]
242
- fn matches ( & self , c : char ) -> bool { ( * self ) ( c) }
242
+ fn matches ( & mut self , c : char ) -> bool { ( * self ) ( c) }
243
243
244
244
fn only_ascii ( & self ) -> bool { false }
245
245
}
246
246
247
- impl < ' a , C : CharEq > CharEq for & ' a [ C ] {
247
+ impl < ' a > CharEq for & ' a [ char ] {
248
248
#[ inline]
249
- fn matches ( & self , c : char ) -> bool {
250
- self . iter ( ) . any ( |m| m. matches ( c) )
249
+ fn matches ( & mut self , c : char ) -> bool {
250
+ self . iter ( ) . any ( |& mut m| m. matches ( c) )
251
251
}
252
252
253
253
fn only_ascii ( & self ) -> bool {
@@ -1977,11 +1977,11 @@ pub trait StrSlice<'a> {
1977
1977
/// # Example
1978
1978
///
1979
1979
/// ```rust
1980
- /// assert_eq!("11foo1bar11".trim_chars(& '1'), "foo1bar")
1981
- /// assert_eq!("12foo1bar12".trim_chars(& & ['1', '2']), "foo1bar")
1982
- /// assert_eq!("123foo1bar123".trim_chars(& |c: char| c.is_digit()), "foo1bar")
1980
+ /// assert_eq!("11foo1bar11".trim_chars('1'), "foo1bar")
1981
+ /// assert_eq!("12foo1bar12".trim_chars(&['1', '2']), "foo1bar")
1982
+ /// assert_eq!("123foo1bar123".trim_chars(|c: char| c.is_digit()), "foo1bar")
1983
1983
/// ```
1984
- fn trim_chars < C : CharEq > ( & self , to_trim : & C ) -> & ' a str ;
1984
+ fn trim_chars < C : CharEq > ( & self , to_trim : C ) -> & ' a str ;
1985
1985
1986
1986
/// Returns a string with leading `chars_to_trim` removed.
1987
1987
///
@@ -1992,11 +1992,11 @@ pub trait StrSlice<'a> {
1992
1992
/// # Example
1993
1993
///
1994
1994
/// ```rust
1995
- /// assert_eq!("11foo1bar11".trim_left_chars(& '1'), "foo1bar11")
1996
- /// assert_eq!("12foo1bar12".trim_left_chars(& & ['1', '2']), "foo1bar12")
1997
- /// assert_eq!("123foo1bar123".trim_left_chars(& |c: char| c.is_digit()), "foo1bar123")
1995
+ /// assert_eq!("11foo1bar11".trim_left_chars('1'), "foo1bar11")
1996
+ /// assert_eq!("12foo1bar12".trim_left_chars(&['1', '2']), "foo1bar12")
1997
+ /// assert_eq!("123foo1bar123".trim_left_chars(|c: char| c.is_digit()), "foo1bar123")
1998
1998
/// ```
1999
- fn trim_left_chars < C : CharEq > ( & self , to_trim : & C ) -> & ' a str ;
1999
+ fn trim_left_chars < C : CharEq > ( & self , to_trim : C ) -> & ' a str ;
2000
2000
2001
2001
/// Returns a string with trailing `chars_to_trim` removed.
2002
2002
///
@@ -2007,11 +2007,11 @@ pub trait StrSlice<'a> {
2007
2007
/// # Example
2008
2008
///
2009
2009
/// ```rust
2010
- /// assert_eq!("11foo1bar11".trim_right_chars(& '1'), "11foo1bar")
2011
- /// assert_eq!("12foo1bar12".trim_right_chars(& & ['1', '2']), "12foo1bar")
2012
- /// assert_eq!("123foo1bar123".trim_right_chars(& |c: char| c.is_digit()), "123foo1bar")
2010
+ /// assert_eq!("11foo1bar11".trim_right_chars('1'), "11foo1bar")
2011
+ /// assert_eq!("12foo1bar12".trim_right_chars(&['1', '2']), "12foo1bar")
2012
+ /// assert_eq!("123foo1bar123".trim_right_chars(|c: char| c.is_digit()), "123foo1bar")
2013
2013
/// ```
2014
- fn trim_right_chars < C : CharEq > ( & self , to_trim : & C ) -> & ' a str ;
2014
+ fn trim_right_chars < C : CharEq > ( & self , to_trim : C ) -> & ' a str ;
2015
2015
2016
2016
/// Replace all occurrences of one string with another.
2017
2017
///
@@ -2487,29 +2487,39 @@ impl<'a> StrSlice<'a> for &'a str {
2487
2487
2488
2488
#[ inline]
2489
2489
fn trim_left ( & self ) -> & ' a str {
2490
- self . trim_left_chars ( & char:: is_whitespace)
2490
+ self . trim_left_chars ( char:: is_whitespace)
2491
2491
}
2492
2492
2493
2493
#[ inline]
2494
2494
fn trim_right ( & self ) -> & ' a str {
2495
- self . trim_right_chars ( & char:: is_whitespace)
2495
+ self . trim_right_chars ( char:: is_whitespace)
2496
2496
}
2497
2497
2498
2498
#[ inline]
2499
- fn trim_chars < C : CharEq > ( & self , to_trim : & C ) -> & ' a str {
2500
- self . trim_left_chars ( to_trim) . trim_right_chars ( to_trim)
2499
+ fn trim_chars < C : CharEq > ( & self , mut to_trim : C ) -> & ' a str {
2500
+ let cur = match self . find ( |c : char | !to_trim. matches ( c) ) {
2501
+ None => "" ,
2502
+ Some ( i) => unsafe { raw:: slice_bytes ( * self , i, self . len ( ) ) }
2503
+ } ;
2504
+ match cur. rfind ( |c : char | !to_trim. matches ( c) ) {
2505
+ None => "" ,
2506
+ Some ( i) => {
2507
+ let right = cur. char_range_at ( i) . next ;
2508
+ unsafe { raw:: slice_bytes ( cur, 0 , right) }
2509
+ }
2510
+ }
2501
2511
}
2502
2512
2503
2513
#[ inline]
2504
- fn trim_left_chars < C : CharEq > ( & self , to_trim : & C ) -> & ' a str {
2514
+ fn trim_left_chars < C : CharEq > ( & self , mut to_trim : C ) -> & ' a str {
2505
2515
match self . find ( |c : char | !to_trim. matches ( c) ) {
2506
2516
None => "" ,
2507
2517
Some ( first) => unsafe { raw:: slice_bytes ( * self , first, self . len ( ) ) }
2508
2518
}
2509
2519
}
2510
2520
2511
2521
#[ inline]
2512
- fn trim_right_chars < C : CharEq > ( & self , to_trim : & C ) -> & ' a str {
2522
+ fn trim_right_chars < C : CharEq > ( & self , mut to_trim : C ) -> & ' a str {
2513
2523
match self . rfind ( |c : char | !to_trim. matches ( c) ) {
2514
2524
None => "" ,
2515
2525
Some ( last) => {
@@ -2627,7 +2637,7 @@ impl<'a> StrSlice<'a> for &'a str {
2627
2637
unsafe { cast:: transmute ( * self ) }
2628
2638
}
2629
2639
2630
- fn find < C : CharEq > ( & self , search : C ) -> Option < uint > {
2640
+ fn find < C : CharEq > ( & self , mut search : C ) -> Option < uint > {
2631
2641
if search. only_ascii ( ) {
2632
2642
self . bytes ( ) . position ( |b| search. matches ( b as char ) )
2633
2643
} else {
@@ -2638,7 +2648,7 @@ impl<'a> StrSlice<'a> for &'a str {
2638
2648
}
2639
2649
}
2640
2650
2641
- fn rfind < C : CharEq > ( & self , search : C ) -> Option < uint > {
2651
+ fn rfind < C : CharEq > ( & self , mut search : C ) -> Option < uint > {
2642
2652
if search. only_ascii ( ) {
2643
2653
self . bytes ( ) . rposition ( |b| search. matches ( b as char ) )
2644
2654
} else {
@@ -3156,40 +3166,40 @@ mod tests {
3156
3166
#[ test]
3157
3167
fn test_trim_left_chars ( ) {
3158
3168
let v: & [ char ] = & [ ] ;
3159
- assert_eq ! ( " *** foo *** " . trim_left_chars( & v) , " *** foo *** " ) ;
3160
- assert_eq ! ( " *** foo *** " . trim_left_chars( & & [ '*' , ' ' ] ) , "foo *** " ) ;
3161
- assert_eq ! ( " *** *** " . trim_left_chars( & & [ '*' , ' ' ] ) , "" ) ;
3162
- assert_eq ! ( "foo *** " . trim_left_chars( & & [ '*' , ' ' ] ) , "foo *** " ) ;
3169
+ assert_eq ! ( " *** foo *** " . trim_left_chars( v) , " *** foo *** " ) ;
3170
+ assert_eq ! ( " *** foo *** " . trim_left_chars( & [ '*' , ' ' ] ) , "foo *** " ) ;
3171
+ assert_eq ! ( " *** *** " . trim_left_chars( & [ '*' , ' ' ] ) , "" ) ;
3172
+ assert_eq ! ( "foo *** " . trim_left_chars( & [ '*' , ' ' ] ) , "foo *** " ) ;
3163
3173
3164
- assert_eq ! ( "11foo1bar11" . trim_left_chars( & '1' ) , "foo1bar11" ) ;
3165
- assert_eq ! ( "12foo1bar12" . trim_left_chars( & & [ '1' , '2' ] ) , "foo1bar12" ) ;
3166
- assert_eq ! ( "123foo1bar123" . trim_left_chars( & |c: char | c. is_digit( ) ) , "foo1bar123" ) ;
3174
+ assert_eq ! ( "11foo1bar11" . trim_left_chars( '1' ) , "foo1bar11" ) ;
3175
+ assert_eq ! ( "12foo1bar12" . trim_left_chars( & [ '1' , '2' ] ) , "foo1bar12" ) ;
3176
+ assert_eq ! ( "123foo1bar123" . trim_left_chars( |c: char | c. is_digit( ) ) , "foo1bar123" ) ;
3167
3177
}
3168
3178
3169
3179
#[ test]
3170
3180
fn test_trim_right_chars ( ) {
3171
3181
let v: & [ char ] = & [ ] ;
3172
- assert_eq ! ( " *** foo *** " . trim_right_chars( & v) , " *** foo *** " ) ;
3173
- assert_eq ! ( " *** foo *** " . trim_right_chars( & & [ '*' , ' ' ] ) , " *** foo" ) ;
3174
- assert_eq ! ( " *** *** " . trim_right_chars( & & [ '*' , ' ' ] ) , "" ) ;
3175
- assert_eq ! ( " *** foo" . trim_right_chars( & & [ '*' , ' ' ] ) , " *** foo" ) ;
3182
+ assert_eq ! ( " *** foo *** " . trim_right_chars( v) , " *** foo *** " ) ;
3183
+ assert_eq ! ( " *** foo *** " . trim_right_chars( & [ '*' , ' ' ] ) , " *** foo" ) ;
3184
+ assert_eq ! ( " *** *** " . trim_right_chars( & [ '*' , ' ' ] ) , "" ) ;
3185
+ assert_eq ! ( " *** foo" . trim_right_chars( & [ '*' , ' ' ] ) , " *** foo" ) ;
3176
3186
3177
- assert_eq ! ( "11foo1bar11" . trim_right_chars( & '1' ) , "11foo1bar" ) ;
3178
- assert_eq ! ( "12foo1bar12" . trim_right_chars( & & [ '1' , '2' ] ) , "12foo1bar" ) ;
3179
- assert_eq ! ( "123foo1bar123" . trim_right_chars( & |c: char | c. is_digit( ) ) , "123foo1bar" ) ;
3187
+ assert_eq ! ( "11foo1bar11" . trim_right_chars( '1' ) , "11foo1bar" ) ;
3188
+ assert_eq ! ( "12foo1bar12" . trim_right_chars( & [ '1' , '2' ] ) , "12foo1bar" ) ;
3189
+ assert_eq ! ( "123foo1bar123" . trim_right_chars( |c: char | c. is_digit( ) ) , "123foo1bar" ) ;
3180
3190
}
3181
3191
3182
3192
#[ test]
3183
3193
fn test_trim_chars ( ) {
3184
3194
let v: & [ char ] = & [ ] ;
3185
- assert_eq ! ( " *** foo *** " . trim_chars( & v) , " *** foo *** " ) ;
3186
- assert_eq ! ( " *** foo *** " . trim_chars( & & [ '*' , ' ' ] ) , "foo" ) ;
3187
- assert_eq ! ( " *** *** " . trim_chars( & & [ '*' , ' ' ] ) , "" ) ;
3188
- assert_eq ! ( "foo" . trim_chars( & & [ '*' , ' ' ] ) , "foo" ) ;
3195
+ assert_eq ! ( " *** foo *** " . trim_chars( v) , " *** foo *** " ) ;
3196
+ assert_eq ! ( " *** foo *** " . trim_chars( & [ '*' , ' ' ] ) , "foo" ) ;
3197
+ assert_eq ! ( " *** *** " . trim_chars( & [ '*' , ' ' ] ) , "" ) ;
3198
+ assert_eq ! ( "foo" . trim_chars( & [ '*' , ' ' ] ) , "foo" ) ;
3189
3199
3190
- assert_eq ! ( "11foo1bar11" . trim_chars( & '1' ) , "foo1bar" ) ;
3191
- assert_eq ! ( "12foo1bar12" . trim_chars( & & [ '1' , '2' ] ) , "foo1bar" ) ;
3192
- assert_eq ! ( "123foo1bar123" . trim_chars( & |c: char | c. is_digit( ) ) , "foo1bar" ) ;
3200
+ assert_eq ! ( "11foo1bar11" . trim_chars( '1' ) , "foo1bar" ) ;
3201
+ assert_eq ! ( "12foo1bar12" . trim_chars( & [ '1' , '2' ] ) , "foo1bar" ) ;
3202
+ assert_eq ! ( "123foo1bar123" . trim_chars( |c: char | c. is_digit( ) ) , "foo1bar" ) ;
3193
3203
}
3194
3204
3195
3205
#[ test]
@@ -4119,7 +4129,7 @@ mod bench {
4119
4129
fn split_unicode_not_ascii ( b : & mut Bencher ) {
4120
4130
struct NotAscii ( char ) ;
4121
4131
impl CharEq for NotAscii {
4122
- fn matches ( & self , c : char ) -> bool {
4132
+ fn matches ( & mut self , c : char ) -> bool {
4123
4133
let NotAscii ( cc) = * self ;
4124
4134
cc == c
4125
4135
}
@@ -4144,7 +4154,7 @@ mod bench {
4144
4154
struct NotAscii ( char ) ;
4145
4155
impl CharEq for NotAscii {
4146
4156
#[ inline]
4147
- fn matches ( & self , c : char ) -> bool {
4157
+ fn matches ( & mut self , c : char ) -> bool {
4148
4158
let NotAscii ( cc) = * self ;
4149
4159
cc == c
4150
4160
}
0 commit comments