diff options
| author | Deadbeef <fee1-dead-beef@protonmail.com> | 2021-06-19 12:59:22 +0800 |
|---|---|---|
| committer | Deadbeef <fee1-dead-beef@protonmail.com> | 2021-06-19 12:59:22 +0800 |
| commit | 15cdb28f5bd4cae04d6fd0bc9ae2faf079448d22 (patch) | |
| tree | 3f627b9cb874fc59fb81dde6153284ed2d1ceddf /library/std/src | |
| parent | ec57c60c50de4f601a5dbe80e663388058e6e527 (diff) | |
| download | rust-15cdb28f5bd4cae04d6fd0bc9ae2faf079448d22.tar.gz rust-15cdb28f5bd4cae04d6fd0bc9ae2faf079448d22.zip | |
Account for self.extra in size_hint for EncodeWide
Diffstat (limited to 'library/std/src')
| -rw-r--r-- | library/std/src/sys_common/wtf8.rs | 3 | ||||
| -rw-r--r-- | library/std/src/sys_common/wtf8/tests.rs | 12 |
2 files changed, 14 insertions, 1 deletions
diff --git a/library/std/src/sys_common/wtf8.rs b/library/std/src/sys_common/wtf8.rs index 7d4b0d52831..1bd3cfd2200 100644 --- a/library/std/src/sys_common/wtf8.rs +++ b/library/std/src/sys_common/wtf8.rs @@ -853,10 +853,11 @@ impl<'a> Iterator for EncodeWide<'a> { #[inline] fn size_hint(&self) -> (usize, Option<usize>) { let (low, high) = self.code_points.size_hint(); + let ext = (self.extra != 0) as usize; // every code point gets either one u16 or two u16, // so this iterator is between 1 or 2 times as // long as the underlying iterator. - (low, high.and_then(|n| n.checked_mul(2))) + (low + ext, high.and_then(|n| n.checked_mul(2)).and_then(|n| n.checked_add(ext))) } } diff --git a/library/std/src/sys_common/wtf8/tests.rs b/library/std/src/sys_common/wtf8/tests.rs index 385e01f92fa..5afbc6fcee3 100644 --- a/library/std/src/sys_common/wtf8/tests.rs +++ b/library/std/src/sys_common/wtf8/tests.rs @@ -395,3 +395,15 @@ fn wtf8_encode_wide() { vec![0x61, 0xE9, 0x20, 0xD83D, 0xD83D, 0xDCA9] ); } + +#[test] +fn wtf8_encode_wide_size_hint() { + let string = Wtf8Buf::from_str("\u{12345}"); + let mut iter = string.encode_wide(); + assert_eq!((1, Some(8)), iter.size_hint()); + iter.next().unwrap(); + assert_eq!((1, Some(1)), iter.size_hint()); + iter.next().unwrap(); + assert_eq!((0, Some(0)), iter.size_hint()); + assert!(iter.next().is_none()); +} |
