From 988b3d5f9e43a9d63a8bff86756c27b9cb69615c Mon Sep 17 00:00:00 2001 From: Konrad Borowski Date: Wed, 27 Feb 2019 18:11:35 +0100 Subject: [PATCH 1/3] Implement ExactSizeIterator for ToLowercase and ToUppercase --- src/libcore/char/mod.rs | 22 ++++++++++++++++++++++ src/libcore/tests/char.rs | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/src/libcore/char/mod.rs b/src/libcore/char/mod.rs index 15e153bdfada2..95b7c066793fc 100644 --- a/src/libcore/char/mod.rs +++ b/src/libcore/char/mod.rs @@ -389,11 +389,17 @@ impl Iterator for ToLowercase { fn next(&mut self) -> Option { self.0.next() } + fn size_hint(&self) -> (usize, Option) { + self.0.size_hint() + } } #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for ToLowercase {} +#[stable(feature = "exact_size_case_mapping_iter", since = "1.34.0")] +impl ExactSizeIterator for ToLowercase {} + /// Returns an iterator that yields the uppercase equivalent of a `char`. /// /// This `struct` is created by the [`to_uppercase`] method on [`char`]. See @@ -411,11 +417,17 @@ impl Iterator for ToUppercase { fn next(&mut self) -> Option { self.0.next() } + fn size_hint(&self) -> (usize, Option) { + self.0.size_hint() + } } #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for ToUppercase {} +#[stable(feature = "exact_size_case_mapping_iter", since = "1.34.0")] +impl ExactSizeIterator for ToUppercase {} + #[derive(Debug, Clone)] enum CaseMappingIter { Three(char, char, char), @@ -457,6 +469,16 @@ impl Iterator for CaseMappingIter { CaseMappingIter::Zero => None, } } + + fn size_hint(&self) -> (usize, Option) { + let size = match self { + CaseMappingIter::Three(..) => 3, + CaseMappingIter::Two(..) => 2, + CaseMappingIter::One(_) => 1, + CaseMappingIter::Zero => 0, + }; + (size, Some(size)) + } } impl fmt::Display for CaseMappingIter { diff --git a/src/libcore/tests/char.rs b/src/libcore/tests/char.rs index 61856242c5706..579feed288adb 100644 --- a/src/libcore/tests/char.rs +++ b/src/libcore/tests/char.rs @@ -76,6 +76,8 @@ fn test_to_digit() { #[test] fn test_to_lowercase() { fn lower(c: char) -> String { + let to_lowercase = c.to_uppercase(); + assert_eq!(to_lowercase.len(), to_lowercase.count()); let iter: String = c.to_lowercase().collect(); let disp: String = c.to_lowercase().to_string(); assert_eq!(iter, disp); @@ -101,6 +103,8 @@ fn test_to_lowercase() { #[test] fn test_to_uppercase() { fn upper(c: char) -> String { + let to_uppercase = c.to_uppercase(); + assert_eq!(to_uppercase.len(), to_uppercase.count()); let iter: String = c.to_uppercase().collect(); let disp: String = c.to_uppercase().to_string(); assert_eq!(iter, disp); From 911a633bb1ce0f20fec1c8c45fe4cbf025f19e07 Mon Sep 17 00:00:00 2001 From: Oliver Middleton Date: Wed, 27 Feb 2019 14:44:20 +0100 Subject: [PATCH 2/3] Remove copy paste error in char tests Co-Authored-By: xfix --- src/libcore/tests/char.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcore/tests/char.rs b/src/libcore/tests/char.rs index 579feed288adb..57e9f4e384e0f 100644 --- a/src/libcore/tests/char.rs +++ b/src/libcore/tests/char.rs @@ -76,7 +76,7 @@ fn test_to_digit() { #[test] fn test_to_lowercase() { fn lower(c: char) -> String { - let to_lowercase = c.to_uppercase(); + let to_lowercase = c.to_lowercase(); assert_eq!(to_lowercase.len(), to_lowercase.count()); let iter: String = c.to_lowercase().collect(); let disp: String = c.to_lowercase().to_string(); From 8f261a6abe874f504c07d2aec937778a2f6df2a3 Mon Sep 17 00:00:00 2001 From: Konrad Borowski Date: Tue, 19 Mar 2019 08:49:45 +0100 Subject: [PATCH 3/3] Update since annotation for ExactSizeIterator for ToUppercase/Lowercase This functionality was added in 1.35.0, not 1.34.0. --- src/libcore/char/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcore/char/mod.rs b/src/libcore/char/mod.rs index 95b7c066793fc..2191ce08b907a 100644 --- a/src/libcore/char/mod.rs +++ b/src/libcore/char/mod.rs @@ -397,7 +397,7 @@ impl Iterator for ToLowercase { #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for ToLowercase {} -#[stable(feature = "exact_size_case_mapping_iter", since = "1.34.0")] +#[stable(feature = "exact_size_case_mapping_iter", since = "1.35.0")] impl ExactSizeIterator for ToLowercase {} /// Returns an iterator that yields the uppercase equivalent of a `char`. @@ -425,7 +425,7 @@ impl Iterator for ToUppercase { #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for ToUppercase {} -#[stable(feature = "exact_size_case_mapping_iter", since = "1.34.0")] +#[stable(feature = "exact_size_case_mapping_iter", since = "1.35.0")] impl ExactSizeIterator for ToUppercase {} #[derive(Debug, Clone)]