Skip to content

Instantly share code, notes, and snippets.

@mbrubeck
Forked from allengeorge/borrow.rs
Last active November 12, 2016 01:32
Show Gist options
  • Save mbrubeck/e0c955a50ba90906fd8d040870143fb8 to your computer and use it in GitHub Desktop.
Save mbrubeck/e0c955a50ba90906fd8d040870143fb8 to your computer and use it in GitHub Desktop.
impl<T: Transport> BufferedTransport<T> {
fn get_bytes(&mut self) -> io::Result<&[u8]> {
if self.rpos == self.rbuf.len() {
self.rpos = 0;
self.rcap = try!(self.underlying.read(&mut self.rbuf));
}
Ok(&self.rbuf[self.rpos..self.rcap])
}
fn consume(&mut self, consumed: usize) {
self.rpos += cmp::min(self.rcap, self.rpos + consumed);
}
}
impl<T: TTransport> io::Read for TBufferedTransport<T> {
fn read(&mut self, b: &mut [u8]) -> io::Result<usize> {
let mut bytes_read = 0;
loop {
let copyable;
{
let buf = try!(self.get_bytes());
let remaining = b.len() - bytes_read;
copyable = cmp::min(remaining, buf.len());
b[bytes_read..].copy_from_slice(&buf[0..copyable]);
}
bytes_read += copyable;
self.consume(copyable);
if bytes_read == b.len() || copyable == 0 {
break
}
}
Ok(bytes_read)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment