@@ -983,7 +983,7 @@ impl str {
983
983
#[ cfg_attr( not( test) , rustc_diagnostic_item = "str_split_whitespace" ) ]
984
984
#[ inline]
985
985
pub fn split_whitespace ( & self ) -> SplitWhitespace < ' _ > {
986
- SplitWhitespace { inner : self . split ( IsWhitespace ) . filter ( IsNotEmpty ) }
986
+ SplitWhitespace { inner : self . split ( char :: is_whitespace ) . filter ( |s| !s . is_empty ( ) ) }
987
987
}
988
988
989
989
/// Splits a string slice by ASCII whitespace.
@@ -1032,8 +1032,13 @@ impl str {
1032
1032
#[ stable( feature = "split_ascii_whitespace" , since = "1.34.0" ) ]
1033
1033
#[ inline]
1034
1034
pub fn split_ascii_whitespace ( & self ) -> SplitAsciiWhitespace < ' _ > {
1035
- let inner =
1036
- self . as_bytes ( ) . split ( IsAsciiWhitespace ) . filter ( BytesIsNotEmpty ) . map ( UnsafeBytesToStr ) ;
1035
+ let inner = self
1036
+ . as_bytes ( )
1037
+ . split ( u8:: is_ascii_whitespace)
1038
+ . filter ( |s| !s. is_empty ( ) )
1039
+ // SAFETY: the byte slice came from a string and was only split
1040
+ // along character boundaries, so the resulting slices are strings.
1041
+ . map ( |bytes| unsafe { from_utf8_unchecked ( bytes) } ) ;
1037
1042
SplitAsciiWhitespace { inner }
1038
1043
}
1039
1044
@@ -1085,7 +1090,11 @@ impl str {
1085
1090
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1086
1091
#[ inline]
1087
1092
pub fn lines ( & self ) -> Lines < ' _ > {
1088
- Lines ( self . split_inclusive ( '\n' ) . map ( LinesMap ) )
1093
+ Lines ( self . split_inclusive ( '\n' ) . map ( |line| {
1094
+ let Some ( line) = line. strip_suffix ( '\n' ) else { return line } ;
1095
+ let Some ( line) = line. strip_suffix ( '\r' ) else { return line } ;
1096
+ line
1097
+ } ) )
1089
1098
}
1090
1099
1091
1100
/// An iterator over the lines of a string.
@@ -2636,14 +2645,19 @@ impl str {
2636
2645
#[ stable( feature = "str_escape" , since = "1.34.0" ) ]
2637
2646
pub fn escape_debug ( & self ) -> EscapeDebug < ' _ > {
2638
2647
let mut chars = self . chars ( ) ;
2639
- EscapeDebug {
2640
- inner : chars
2641
- . next ( )
2642
- . map ( |first| first. escape_debug_ext ( EscapeDebugExtArgs :: ESCAPE_ALL ) )
2643
- . into_iter ( )
2644
- . flatten ( )
2645
- . chain ( chars. flat_map ( CharEscapeDebugContinue ) ) ,
2646
- }
2648
+ let first = chars
2649
+ . next ( )
2650
+ . map ( |first| first. escape_debug_ext ( EscapeDebugExtArgs :: ESCAPE_ALL ) )
2651
+ . into_iter ( )
2652
+ . flatten ( ) ;
2653
+ let inner = first. chain ( chars. flat_map ( |c| {
2654
+ c. escape_debug_ext ( EscapeDebugExtArgs {
2655
+ escape_grapheme_extended : false ,
2656
+ escape_single_quote : true ,
2657
+ escape_double_quote : true ,
2658
+ } )
2659
+ } ) ) ;
2660
+ EscapeDebug { inner }
2647
2661
}
2648
2662
2649
2663
/// Return an iterator that escapes each char in `self` with [`char::escape_default`].
@@ -2681,7 +2695,7 @@ impl str {
2681
2695
without modifying the original"]
2682
2696
#[ stable( feature = "str_escape" , since = "1.34.0" ) ]
2683
2697
pub fn escape_default ( & self ) -> EscapeDefault < ' _ > {
2684
- EscapeDefault { inner : self . chars ( ) . flat_map ( CharEscapeDefault ) }
2698
+ EscapeDefault { inner : self . chars ( ) . flat_map ( char :: escape_default ) }
2685
2699
}
2686
2700
2687
2701
/// Return an iterator that escapes each char in `self` with [`char::escape_unicode`].
@@ -2719,7 +2733,7 @@ impl str {
2719
2733
without modifying the original"]
2720
2734
#[ stable( feature = "str_escape" , since = "1.34.0" ) ]
2721
2735
pub fn escape_unicode ( & self ) -> EscapeUnicode < ' _ > {
2722
- EscapeUnicode { inner : self . chars ( ) . flat_map ( CharEscapeUnicode ) }
2736
+ EscapeUnicode { inner : self . chars ( ) . flat_map ( char :: escape_unicode ) }
2723
2737
}
2724
2738
}
2725
2739
@@ -2750,59 +2764,15 @@ impl Default for &mut str {
2750
2764
}
2751
2765
}
2752
2766
2753
- impl_fn_for_zst ! {
2754
- /// A nameable, cloneable fn type
2755
- #[ derive( Clone ) ]
2756
- struct LinesMap impl <' a> Fn = |line: & ' a str | -> & ' a str {
2757
- let Some ( line) = line. strip_suffix( '\n' ) else { return line } ;
2758
- let Some ( line) = line. strip_suffix( '\r' ) else { return line } ;
2759
- line
2760
- } ;
2761
-
2762
- #[ derive( Clone ) ]
2763
- struct CharEscapeDebugContinue impl Fn = |c: char | -> char :: EscapeDebug {
2764
- c. escape_debug_ext( EscapeDebugExtArgs {
2765
- escape_grapheme_extended: false ,
2766
- escape_single_quote: true ,
2767
- escape_double_quote: true
2768
- } )
2769
- } ;
2770
-
2771
- #[ derive( Clone ) ]
2772
- struct CharEscapeUnicode impl Fn = |c: char | -> char :: EscapeUnicode {
2773
- c. escape_unicode( )
2774
- } ;
2775
- #[ derive( Clone ) ]
2776
- struct CharEscapeDefault impl Fn = |c: char | -> char :: EscapeDefault {
2777
- c. escape_default( )
2778
- } ;
2779
-
2780
- #[ derive( Clone ) ]
2781
- struct IsWhitespace impl Fn = |c: char | -> bool {
2782
- c. is_whitespace( )
2783
- } ;
2784
-
2785
- #[ derive( Clone ) ]
2786
- struct IsAsciiWhitespace impl Fn = |byte: & u8 | -> bool {
2787
- byte. is_ascii_whitespace( )
2788
- } ;
2789
-
2790
- #[ derive( Clone ) ]
2791
- struct IsNotEmpty impl <' a, ' b> Fn = |s: & ' a & ' b str | -> bool {
2792
- !s. is_empty( )
2793
- } ;
2794
-
2795
- #[ derive( Clone ) ]
2796
- struct BytesIsNotEmpty impl <' a, ' b> Fn = |s: & ' a & ' b [ u8 ] | -> bool {
2797
- !s. is_empty( )
2798
- } ;
2799
-
2800
- #[ derive( Clone ) ]
2801
- struct UnsafeBytesToStr impl <' a> Fn = |bytes: & ' a [ u8 ] | -> & ' a str {
2802
- // SAFETY: not safe
2803
- unsafe { from_utf8_unchecked( bytes) }
2804
- } ;
2805
- }
2767
+ type LinesMap = impl ( Fn ( & str ) -> & str ) + Copy ;
2768
+ type CharEscapeDebugContinue = impl ( FnMut ( char ) -> char:: EscapeDebug ) + Copy ;
2769
+ type CharEscapeUnicode = impl ( Fn ( char ) -> char:: EscapeUnicode ) + Copy ;
2770
+ type CharEscapeDefault = impl ( Fn ( char ) -> char:: EscapeDefault ) + Copy ;
2771
+ type IsWhitespace = impl ( Fn ( char ) -> bool ) + Copy ;
2772
+ type IsAsciiWhitespace = impl ( Fn ( & u8 ) -> bool ) + Copy ;
2773
+ type IsNotEmpty = impl ( Fn ( & & str ) -> bool ) + Copy ;
2774
+ type BytesIsNotEmpty < ' a > = impl ( FnMut ( & & ' a [ u8 ] ) -> bool ) + Copy ;
2775
+ type UnsafeBytesToStr < ' a > = impl ( FnMut ( & ' a [ u8 ] ) -> & ' a str ) + Copy ;
2806
2776
2807
2777
// This is required to make `impl From<&str> for Box<dyn Error>` and `impl<E> From<E> for Box<dyn Error>` not overlap.
2808
2778
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
0 commit comments