Revert "Rollup merge of #125362 - joboet:tait_hack, r=Nilstrieb" · model-checking/verify-rust-std@e1d73c2 (original) (raw)
`@@ -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(char::is_whitespace).filter(|s| !s.is_empty()) }
`
``
986
`+
SplitWhitespace { inner: self.split(IsWhitespace).filter(IsNotEmpty) }
`
987
987
`}
`
988
988
``
989
989
`/// Splits a string slice by ASCII whitespace.
`
`@@ -1032,13 +1032,8 @@ 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 = 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) });
`
``
1035
`+
let inner =
`
``
1036
`+
self.as_bytes().split(IsAsciiWhitespace).filter(BytesIsNotEmpty).map(UnsafeBytesToStr);
`
1042
1037
`SplitAsciiWhitespace { inner }
`
1043
1038
`}
`
1044
1039
``
`@@ -1090,11 +1085,7 @@ impl str {
`
1090
1085
`#[stable(feature = "rust1", since = "1.0.0")]
`
1091
1086
`#[inline]
`
1092
1087
`pub fn lines(&self) -> Lines<'_> {
`
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
``
`-
}))
`
``
1088
`+
Lines(self.split_inclusive('\n').map(LinesMap))
`
1098
1089
`}
`
1099
1090
``
1100
1091
`/// An iterator over the lines of a string.
`
`@@ -2645,19 +2636,14 @@ impl str {
`
2645
2636
`#[stable(feature = "str_escape", since = "1.34.0")]
`
2646
2637
`pub fn escape_debug(&self) -> EscapeDebug<'_> {
`
2647
2638
`let mut chars = self.chars();
`
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 }
`
``
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
`+
}
`
2661
2647
`}
`
2662
2648
``
2663
2649
`` /// Return an iterator that escapes each char in self
with [char::escape_default
].
``
`@@ -2695,7 +2681,7 @@ impl str {
`
2695
2681
` without modifying the original"]
`
2696
2682
`#[stable(feature = "str_escape", since = "1.34.0")]
`
2697
2683
`pub fn escape_default(&self) -> EscapeDefault<'_> {
`
2698
``
`-
EscapeDefault { inner: self.chars().flat_map(char::escape_default) }
`
``
2684
`+
EscapeDefault { inner: self.chars().flat_map(CharEscapeDefault) }
`
2699
2685
`}
`
2700
2686
``
2701
2687
`` /// Return an iterator that escapes each char in self
with [char::escape_unicode
].
``
`@@ -2733,7 +2719,7 @@ impl str {
`
2733
2719
` without modifying the original"]
`
2734
2720
`#[stable(feature = "str_escape", since = "1.34.0")]
`
2735
2721
`pub fn escape_unicode(&self) -> EscapeUnicode<'_> {
`
2736
``
`-
EscapeUnicode { inner: self.chars().flat_map(char::escape_unicode) }
`
``
2722
`+
EscapeUnicode { inner: self.chars().flat_map(CharEscapeUnicode) }
`
2737
2723
`}
`
2738
2724
`}
`
2739
2725
``
`@@ -2764,15 +2750,59 @@ impl Default for &mut str {
`
2764
2750
`}
`
2765
2751
`}
`
2766
2752
``
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;
`
``
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
`+
}
`
2776
2806
``
2777
2807
`` // This is required to make impl From<&str> for Box<dyn Error>
and impl<E> From<E> for Box<dyn Error>
not overlap.
``
2778
2808
`#[stable(feature = "rust1", since = "1.0.0")]
`