diff --git a/src/buf/buf.rs b/src/buf/buf.rs index c537e04fa20f84887649b277c9f525f0ddd40153..3f3dbb6e8ba5207475daec0a0580f103472f8230 100644 --- a/src/buf/buf.rs +++ b/src/buf/buf.rs @@ -1,7 +1,7 @@ use super::{Take, Reader, Iter, FromBuf}; use byteorder::ByteOrder; -use std::{cmp, ptr}; +use std::{cmp, io, ptr}; /// Read bytes from a buffer. /// @@ -566,3 +566,55 @@ pub trait Buf { super::iter::new(self) } } + +impl<'a, T: Buf + ?Sized> Buf for &'a mut T { + fn remaining(&self) -> usize { + (**self).remaining() + } + + fn bytes(&self) -> &[u8] { + (**self).bytes() + } + + fn advance(&mut self, cnt: usize) { + (**self).advance(cnt) + } +} + +impl<T: Buf + ?Sized> Buf for Box<T> { + fn remaining(&self) -> usize { + (**self).remaining() + } + + fn bytes(&self) -> &[u8] { + (**self).bytes() + } + + fn advance(&mut self, cnt: usize) { + (**self).advance(cnt) + } +} + +impl<T: AsRef<[u8]>> Buf for io::Cursor<T> { + fn remaining(&self) -> usize { + let len = self.get_ref().as_ref().len(); + let pos = self.position(); + + if pos >= len as u64 { + return 0; + } + + len - pos as usize + } + + fn bytes(&self) -> &[u8] { + let pos = self.position() as usize; + &(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().as_ref().len(), pos + cnt); + self.set_position(pos as u64); + } +} diff --git a/src/buf/buf_mut.rs b/src/buf/buf_mut.rs index 2e40ee76c0cca2a3e00f1e315312ab201a4c3be6..2e3c141b91da260ae5ee20a16302babef87a3df1 100644 --- a/src/buf/buf_mut.rs +++ b/src/buf/buf_mut.rs @@ -1,7 +1,7 @@ use super::{Source, Writer}; use byteorder::ByteOrder; -use std::{cmp, ptr}; +use std::{cmp, io, ptr, usize}; /// A trait for values that provide sequential write access to bytes. /// @@ -503,3 +503,87 @@ pub trait BufMut { super::writer::new(self) } } + +impl<'a, T: BufMut + ?Sized> BufMut for &'a mut T { + fn remaining_mut(&self) -> usize { + (**self).remaining_mut() + } + + unsafe fn bytes_mut(&mut self) -> &mut [u8] { + (**self).bytes_mut() + } + + unsafe fn advance_mut(&mut self, cnt: usize) { + (**self).advance_mut(cnt) + } +} + +impl<T: BufMut + ?Sized> BufMut for Box<T> { + fn remaining_mut(&self) -> usize { + (**self).remaining_mut() + } + + unsafe fn bytes_mut(&mut self) -> &mut [u8] { + (**self).bytes_mut() + } + + unsafe fn advance_mut(&mut self, cnt: usize) { + (**self).advance_mut(cnt) + } +} + +impl<T: AsMut<[u8]> + AsRef<[u8]>> BufMut for io::Cursor<T> { + fn remaining_mut(&self) -> usize { + use Buf; + self.remaining() + } + + /// Advance the internal cursor of the BufMut + unsafe fn advance_mut(&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 BufMut position and of + /// length between 0 and `BufMut::remaining()`. + /// + /// The returned byte slice may represent uninitialized memory. + unsafe fn bytes_mut(&mut self) -> &mut [u8] { + let pos = self.position() as usize; + &mut (self.get_mut().as_mut())[pos..] + } +} + +impl BufMut for Vec<u8> { + fn remaining_mut(&self) -> usize { + usize::MAX - self.len() + } + + unsafe fn advance_mut(&mut self, cnt: usize) { + let len = self.len() + cnt; + + if len > self.capacity() { + // Reserve additional + // TODO: Should this case panic? + let cap = self.capacity(); + self.reserve(cap - len); + } + + self.set_len(len); + } + + unsafe fn bytes_mut(&mut self) -> &mut [u8] { + use std::slice; + + if self.capacity() == self.len() { + self.reserve(64); // Grow the vec + } + + let cap = self.capacity(); + let len = self.len(); + + let ptr = self.as_mut_ptr(); + &mut slice::from_raw_parts_mut(ptr, cap)[len..] + } +} diff --git a/src/buf/mod.rs b/src/buf/mod.rs index f700c3866b267eb4756261788cb5c742e7d4ae9e..f8cf37aea058a685d17965446f3c6080e1926f7a 100644 --- a/src/buf/mod.rs +++ b/src/buf/mod.rs @@ -16,8 +16,6 @@ //! [`Buf`]: trait.Buf.html //! [`BufMut`]: trait.BufMut.html -use std::{cmp, io, usize}; - mod buf; mod buf_mut; mod from_buf; @@ -37,144 +35,3 @@ pub use self::reader::Reader; pub use self::source::Source; pub use self::take::Take; pub use self::writer::Writer; - -/* - * - * ===== Buf impls ===== - * - */ - -impl<'a, T: Buf + ?Sized> Buf for &'a mut T { - fn remaining(&self) -> usize { - (**self).remaining() - } - - fn bytes(&self) -> &[u8] { - (**self).bytes() - } - - fn advance(&mut self, cnt: usize) { - (**self).advance(cnt) - } -} - -impl<'a, T: BufMut + ?Sized> BufMut for &'a mut T { - fn remaining_mut(&self) -> usize { - (**self).remaining_mut() - } - - unsafe fn bytes_mut(&mut self) -> &mut [u8] { - (**self).bytes_mut() - } - - unsafe fn advance_mut(&mut self, cnt: usize) { - (**self).advance_mut(cnt) - } -} - -impl<T: Buf + ?Sized> Buf for Box<T> { - fn remaining(&self) -> usize { - (**self).remaining() - } - - fn bytes(&self) -> &[u8] { - (**self).bytes() - } - - fn advance(&mut self, cnt: usize) { - (**self).advance(cnt) - } -} - -impl<T: BufMut + ?Sized> BufMut for Box<T> { - fn remaining_mut(&self) -> usize { - (**self).remaining_mut() - } - - unsafe fn bytes_mut(&mut self) -> &mut [u8] { - (**self).bytes_mut() - } - - unsafe fn advance_mut(&mut self, cnt: usize) { - (**self).advance_mut(cnt) - } -} - -impl<T: AsRef<[u8]>> Buf for io::Cursor<T> { - fn remaining(&self) -> usize { - let len = self.get_ref().as_ref().len(); - let pos = self.position(); - - if pos >= len as u64 { - return 0; - } - - len - pos as usize - } - - fn bytes(&self) -> &[u8] { - let pos = self.position() as usize; - &(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().as_ref().len(), pos + cnt); - self.set_position(pos as u64); - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>> BufMut for io::Cursor<T> { - fn remaining_mut(&self) -> usize { - self.remaining() - } - - /// Advance the internal cursor of the BufMut - unsafe fn advance_mut(&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 BufMut position and of - /// length between 0 and `BufMut::remaining()`. - /// - /// The returned byte slice may represent uninitialized memory. - unsafe fn bytes_mut(&mut self) -> &mut [u8] { - let pos = self.position() as usize; - &mut (self.get_mut().as_mut())[pos..] - } -} - -impl BufMut for Vec<u8> { - fn remaining_mut(&self) -> usize { - usize::MAX - self.len() - } - - unsafe fn advance_mut(&mut self, cnt: usize) { - let len = self.len() + cnt; - - if len > self.capacity() { - // Reserve additional - // TODO: Should this case panic? - let cap = self.capacity(); - self.reserve(cap - len); - } - - self.set_len(len); - } - - unsafe fn bytes_mut(&mut self) -> &mut [u8] { - use std::slice; - - if self.capacity() == self.len() { - self.reserve(64); // Grow the vec - } - - let cap = self.capacity(); - let len = self.len(); - - let ptr = self.as_mut_ptr(); - &mut slice::from_raw_parts_mut(ptr, cap)[len..] - } -}