diff --git a/src/buf/mod.rs b/src/buf/mod.rs index a69ad3fce082694ce57e66c20b97c2092931374e..cdd11ea00098269cdc207e08799356d980adb11b 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 a59872f86f26316bcdfe28b8f3941b07093b82f6..3c0175bea0c69cd50e73a54b618f0c00f48feccf 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);