Improve Buf/MutBuf impl for Cursor

This commit is contained in:
Carl Lerche
2016-08-05 22:19:37 -07:00
parent b6a424d892
commit 16b4266c3c
2 changed files with 31 additions and 22 deletions
+27 -21
View File
@@ -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 { 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] { fn bytes(&self) -> &[u8] {
let pos = self.position() as usize; let pos = self.position() as usize;
&(&self.get_ref())[pos..] &(self.get_ref().as_ref())[pos..]
} }
fn advance(&mut self, cnt: usize) { fn advance(&mut self, cnt: usize) {
let pos = self.position() as 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); 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> { impl MutBuf for Vec<u8> {
fn remaining(&self) -> usize { fn remaining(&self) -> usize {
usize::MAX - self.len() 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 ===== * ===== Read impls =====
+4 -1
View File
@@ -1,9 +1,10 @@
use bytes::{Buf, MutBuf};
use std::usize; use std::usize;
use std::io::{Cursor}; use std::io::{Cursor};
#[test] #[test]
pub fn test_fresh_cursor_vec() { pub fn test_fresh_cursor_vec() {
use bytes::Buf;
let mut buf = Cursor::new(b"hello".to_vec()); let mut buf = Cursor::new(b"hello".to_vec());
assert_eq!(buf.remaining(), 5); assert_eq!(buf.remaining(), 5);
@@ -27,6 +28,8 @@ pub fn test_fresh_cursor_vec() {
#[test] #[test]
pub fn test_vec_as_mut_buf() { pub fn test_vec_as_mut_buf() {
use bytes::MutBuf;
let mut buf = Vec::with_capacity(64); let mut buf = Vec::with_capacity(64);
assert_eq!(buf.remaining(), usize::MAX); assert_eq!(buf.remaining(), usize::MAX);