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