diff --git a/src/bytes.rs b/src/bytes.rs index cee2ecd..097487f 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -1298,6 +1298,28 @@ impl<'a> IntoIterator for &'a BytesMut { } } +impl Extend for BytesMut { + fn extend(&mut self, iter: T) where T: IntoIterator { + let iter = iter.into_iter(); + + let (lower, _) = iter.size_hint(); + self.reserve(lower); + + for b in iter { + unsafe { + self.bytes_mut()[0] = b; + self.advance_mut(1); + } + } + } +} + +impl<'a> Extend<&'a u8> for BytesMut { + fn extend(&mut self, iter: T) where T: IntoIterator { + self.extend(iter.into_iter().map(|b| *b)) + } +} + /* * * ===== Inner ===== diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index ce1006b..cfb5070 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -290,6 +290,13 @@ fn inline_storage() { assert_eq!(*bytes, zero[0..inline_cap()]); } +#[test] +fn extend() { + let mut bytes = BytesMut::with_capacity(0); + bytes.extend(LONG); + assert_eq!(*bytes, LONG[..]); +} + #[test] fn stress() { // Tests promoting a buffer from a vec -> shared in a concurrent situation