From 2e319b51bef1460121d1ad6550bef74038470c69 Mon Sep 17 00:00:00 2001 From: Carl Lerche <me@carllerche.com> Date: Tue, 7 Mar 2017 11:41:53 -0800 Subject: [PATCH] Impl Extend for BytesMut --- src/bytes.rs | 22 ++++++++++++++++++++++ tests/test_bytes.rs | 7 +++++++ 2 files changed, 29 insertions(+) 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<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 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 -- GitLab