From 83925dd453ca67c611e45cbd6c17d7a4d3041bde Mon Sep 17 00:00:00 2001 From: Michael Spector Date: Sat, 11 Sep 2021 18:40:04 +0300 Subject: [PATCH 1/2] Allow reverse iteration of lowercase'd/uppercase'd chars --- library/alloc/tests/str.rs | 31 +++++++++++++++++++++++++++++++ library/core/src/char/mod.rs | 34 ++++++++++++++++++++++++++++++++++ library/core/tests/char.rs | 6 ++++++ 3 files changed, 71 insertions(+) diff --git a/library/alloc/tests/str.rs b/library/alloc/tests/str.rs index d3a87c056cfb1..9ec57d7e64476 100644 --- a/library/alloc/tests/str.rs +++ b/library/alloc/tests/str.rs @@ -1125,6 +1125,37 @@ fn test_rev_iterator() { assert_eq!(pos, v.len()); } +#[test] +fn test_to_lowercase_rev_iterator() { + let s = "AÖßÜ💩ΣΤΙΓΜΑΣDžfiİ"; + let v = ['\u{307}', 'i', 'fi', 'dž', 'σ', 'α', 'μ', 'γ', 'ι', 'τ', 'σ', '💩', 'ü', 'ß', 'ö', 'a']; + + let mut pos = 0; + let it = s.chars().flat_map(|c| c.to_lowercase()).rev(); + + for c in it { + assert_eq!(c, v[pos]); + pos += 1; + } + assert_eq!(pos, v.len()); +} + +#[test] +fn test_to_uppercase_rev_iterator() { + let s = "aößü💩στιγμαςDžfiᾀ"; + let v = + ['Ι', 'Ἀ', 'I', 'F', 'DŽ', 'Σ', 'Α', 'Μ', 'Γ', 'Ι', 'Τ', 'Σ', '💩', 'Ü', 'S', 'S', 'Ö', 'A']; + + let mut pos = 0; + let it = s.chars().flat_map(|c| c.to_uppercase()).rev(); + + for c in it { + assert_eq!(c, v[pos]); + pos += 1; + } + assert_eq!(pos, v.len()); +} + #[test] #[cfg_attr(miri, ignore)] // Miri is too slow fn test_chars_decoding() { diff --git a/library/core/src/char/mod.rs b/library/core/src/char/mod.rs index 0728523d0a413..a9e7144eb64cd 100644 --- a/library/core/src/char/mod.rs +++ b/library/core/src/char/mod.rs @@ -393,6 +393,13 @@ impl Iterator for ToLowercase { } } +#[stable(feature = "rust1", since = "1.0.0")] +impl DoubleEndedIterator for ToLowercase { + fn next_back(&mut self) -> Option { + self.0.next_back() + } +} + #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for ToLowercase {} @@ -420,6 +427,13 @@ impl Iterator for ToUppercase { } } +#[stable(feature = "rust1", since = "1.0.0")] +impl DoubleEndedIterator for ToUppercase { + fn next_back(&mut self) -> Option { + self.0.next_back() + } +} + #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for ToUppercase {} @@ -479,6 +493,26 @@ impl Iterator for CaseMappingIter { } } +impl DoubleEndedIterator for CaseMappingIter { + fn next_back(&mut self) -> Option { + match *self { + CaseMappingIter::Three(a, b, c) => { + *self = CaseMappingIter::Two(a, b); + Some(c) + } + CaseMappingIter::Two(b, c) => { + *self = CaseMappingIter::One(b); + Some(c) + } + CaseMappingIter::One(c) => { + *self = CaseMappingIter::Zero; + Some(c) + } + CaseMappingIter::Zero => None, + } + } +} + impl fmt::Display for CaseMappingIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { diff --git a/library/core/tests/char.rs b/library/core/tests/char.rs index 51eca1e05d343..ee196db5363be 100644 --- a/library/core/tests/char.rs +++ b/library/core/tests/char.rs @@ -91,6 +91,9 @@ fn test_to_lowercase() { let iter: String = c.to_lowercase().collect(); let disp: String = c.to_lowercase().to_string(); assert_eq!(iter, disp); + let iter_rev: String = c.to_lowercase().rev().collect(); + let disp_rev: String = disp.chars().rev().collect(); + assert_eq!(iter_rev, disp_rev); iter } assert_eq!(lower('A'), "a"); @@ -118,6 +121,9 @@ fn test_to_uppercase() { let iter: String = c.to_uppercase().collect(); let disp: String = c.to_uppercase().to_string(); assert_eq!(iter, disp); + let iter_rev: String = c.to_uppercase().rev().collect(); + let disp_rev: String = disp.chars().rev().collect(); + assert_eq!(iter_rev, disp_rev); iter } assert_eq!(upper('a'), "A"); From 417b6f354e98a3198f456223c97b162c30ab3a5e Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Wed, 22 Dec 2021 10:49:51 -0800 Subject: [PATCH 2/2] Update stability attribute for double ended case mapping iterators --- library/core/src/char/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/core/src/char/mod.rs b/library/core/src/char/mod.rs index a9e7144eb64cd..5f30d5790a04f 100644 --- a/library/core/src/char/mod.rs +++ b/library/core/src/char/mod.rs @@ -393,7 +393,7 @@ impl Iterator for ToLowercase { } } -#[stable(feature = "rust1", since = "1.0.0")] +#[stable(feature = "case_mapping_double_ended", since = "1.59.0")] impl DoubleEndedIterator for ToLowercase { fn next_back(&mut self) -> Option { self.0.next_back() @@ -427,7 +427,7 @@ impl Iterator for ToUppercase { } } -#[stable(feature = "rust1", since = "1.0.0")] +#[stable(feature = "case_mapping_double_ended", since = "1.59.0")] impl DoubleEndedIterator for ToUppercase { fn next_back(&mut self) -> Option { self.0.next_back()