about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorDeadbeef <fee1-dead-beef@protonmail.com>2021-06-19 12:59:22 +0800
committerDeadbeef <fee1-dead-beef@protonmail.com>2021-06-19 12:59:22 +0800
commit15cdb28f5bd4cae04d6fd0bc9ae2faf079448d22 (patch)
tree3f627b9cb874fc59fb81dde6153284ed2d1ceddf /library/std/src
parentec57c60c50de4f601a5dbe80e663388058e6e527 (diff)
downloadrust-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.rs3
-rw-r--r--library/std/src/sys_common/wtf8/tests.rs12
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());
+}