diff --git a/src/bytes.rs b/src/bytes.rs index cee2ecd708c8fc91ffe7f7aefd7d08f7ef30f415..097487fae8909c02ae4a4371f6e82ebc47d73814 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -1298,6 +1298,28 @@ impl<'a> IntoIterator for &'a BytesMut { } } +impl Extend<u8> for BytesMut { + fn extend<T>(&mut self, iter: T) where T: IntoIterator<Item = u8> { + 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<T>(&mut self, iter: T) where T: IntoIterator<Item = &'a u8> { + self.extend(iter.into_iter().map(|b| *b)) + } +} + /* * * ===== Inner ===== diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index ce1006b48e2261655247f334ff99f5c74af554bb..cfb50707d9b8dfaf0f164ffc5bb516e0f0ef3659 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