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