aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bytes_mut.rs2
-rw-r--r--tests/test_bytes.rs22
2 files changed, 22 insertions, 2 deletions
diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs
index 734f4df..1b4a4d9 100644
--- a/src/bytes_mut.rs
+++ b/src/bytes_mut.rs
@@ -1283,9 +1283,7 @@ impl Extend<u8> for BytesMut {
// TODO: optimize
// 1. If self.kind() == KIND_VEC, use Vec::extend
- // 2. Make `reserve` inline-able
for b in iter {
- self.reserve(1);
self.put_u8(b);
}
}
diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs
index 76adfdb..e3820d7 100644
--- a/tests/test_bytes.rs
+++ b/tests/test_bytes.rs
@@ -599,6 +599,28 @@ fn extend_mut_from_bytes() {
}
#[test]
+fn extend_past_lower_limit_of_size_hint() {
+ // See https://github.com/tokio-rs/bytes/pull/674#pullrequestreview-1913035700
+ struct Iter<I>(I);
+
+ impl<I: Iterator<Item = u8>> Iterator for Iter<I> {
+ type Item = u8;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.0.next()
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ (5, None)
+ }
+ }
+
+ let mut bytes = BytesMut::with_capacity(5);
+ bytes.extend(Iter(std::iter::repeat(0).take(10)));
+ assert_eq!(bytes.len(), 10);
+}
+
+#[test]
fn extend_mut_without_size_hint() {
let mut bytes = BytesMut::with_capacity(0);
let mut long_iter = LONG.iter();