use core_io::{Read, Write, Error as IoError}; #[derive(Debug, Clone)] pub struct Cursor { inner: T, pos: usize } impl Cursor { #[inline] pub fn new(inner: T) -> Cursor { Cursor { inner, pos: 0 } } #[inline] pub fn into_inner(self) -> T { self.inner } #[inline] pub fn get_ref(&self) -> &T { &self.inner } #[inline] pub fn get_mut(&mut self) -> &mut T { &mut self.inner } #[inline] pub fn position(&self) -> usize { self.pos } #[inline] pub fn set_position(&mut self, pos: usize) { self.pos = pos } } impl> Read for Cursor { fn read(&mut self, buf: &mut [u8]) -> Result { let data = &self.inner.as_ref()[self.pos..]; let len = buf.len().min(data.len()); buf[..len].copy_from_slice(&data[..len]); self.pos += len; Ok(len) } } impl Write for Cursor<&mut [u8]> { fn write(&mut self, buf: &[u8]) -> Result { let data = &mut self.inner[self.pos..]; let len = buf.len().min(data.len()); data[..len].copy_from_slice(&buf[..len]); self.pos += len; Ok(len) } #[inline] fn flush(&mut self) -> Result<(), IoError> { Ok(()) } } #[cfg(feature = "alloc")] impl Write for Cursor<::alloc::Vec> { #[inline] fn write(&mut self, buf: &[u8]) -> Result { self.inner.extend_from_slice(buf); Ok(buf.len()) } #[inline] fn flush(&mut self) -> Result<(), IoError> { Ok(()) } }