From 16b4266c3cfb4ffc54369f13da5b7c4174e9f65d Mon Sep 17 00:00:00 2001
From: Carl Lerche <me@carllerche.com>
Date: Fri, 5 Aug 2016 22:19:37 -0700
Subject: [PATCH] Improve Buf/MutBuf impl for Cursor

---
 src/buf/mod.rs   | 48 +++++++++++++++++++++++++++---------------------
 test/test_buf.rs |  5 ++++-
 2 files changed, 31 insertions(+), 22 deletions(-)

diff --git a/src/buf/mod.rs b/src/buf/mod.rs
index a69ad3f..cdd11ea 100644
--- a/src/buf/mod.rs
+++ b/src/buf/mod.rs
@@ -321,23 +321,46 @@ impl fmt::Debug for Box<Buf+Send+'static> {
     }
 }
 
-impl Buf for io::Cursor<Vec<u8>> {
+impl<T: AsRef<[u8]>> Buf for io::Cursor<T> {
     fn remaining(&self) -> usize {
-        self.get_ref().len() - self.position() as usize
+        self.get_ref().as_ref().len() - self.position() as usize
     }
 
     fn bytes(&self) -> &[u8] {
         let pos = self.position() as usize;
-        &(&self.get_ref())[pos..]
+        &(self.get_ref().as_ref())[pos..]
     }
 
     fn advance(&mut self, cnt: usize) {
         let pos = self.position() as usize;
-        let pos = cmp::min(self.get_ref().len(), pos + cnt);
+        let pos = cmp::min(self.get_ref().as_ref().len(), pos + cnt);
         self.set_position(pos as u64);
     }
 }
 
+impl<T: AsMut<[u8]> + AsRef<[u8]>> MutBuf for io::Cursor<T> {
+
+    fn remaining(&self) -> usize {
+        self.get_ref().as_ref().len() - self.position() as usize
+    }
+
+    /// Advance the internal cursor of the MutBuf
+    unsafe fn advance(&mut self, cnt: usize) {
+        let pos = self.position() as usize;
+        let pos = cmp::min(self.get_mut().as_mut().len(), pos + cnt);
+        self.set_position(pos as u64);
+    }
+
+    /// Returns a mutable slice starting at the current MutBuf position and of
+    /// length between 0 and `MutBuf::remaining()`.
+    ///
+    /// The returned byte slice may represent uninitialized memory.
+    unsafe fn mut_bytes<'a>(&'a mut self) -> &'a mut [u8] {
+        let pos = self.position() as usize;
+        &mut (self.get_mut().as_mut())[pos..]
+    }
+}
+
 impl MutBuf for Vec<u8> {
     fn remaining(&self) -> usize {
         usize::MAX - self.len()
@@ -371,23 +394,6 @@ impl MutBuf for Vec<u8> {
     }
 }
 
-impl<'a> Buf for io::Cursor<&'a [u8]> {
-    fn remaining(&self) -> usize {
-        self.get_ref().len() - self.position() as usize
-    }
-
-    fn bytes(&self) -> &[u8] {
-        let pos = self.position() as usize;
-        &(&self.get_ref())[pos..]
-    }
-
-    fn advance(&mut self, cnt: usize) {
-        let pos = self.position() as usize;
-        let pos = cmp::min(self.get_ref().len(), pos + cnt);
-        self.set_position(pos as u64);
-    }
-}
-
 /*
  *
  * ===== Read impls =====
diff --git a/test/test_buf.rs b/test/test_buf.rs
index a59872f..3c0175b 100644
--- a/test/test_buf.rs
+++ b/test/test_buf.rs
@@ -1,9 +1,10 @@
-use bytes::{Buf, MutBuf};
 use std::usize;
 use std::io::{Cursor};
 
 #[test]
 pub fn test_fresh_cursor_vec() {
+    use bytes::Buf;
+
     let mut buf = Cursor::new(b"hello".to_vec());
 
     assert_eq!(buf.remaining(), 5);
@@ -27,6 +28,8 @@ pub fn test_fresh_cursor_vec() {
 
 #[test]
 pub fn test_vec_as_mut_buf() {
+    use bytes::MutBuf;
+
     let mut buf = Vec::with_capacity(64);
 
     assert_eq!(buf.remaining(), usize::MAX);
-- 
GitLab