This method can be used to fill a byte slice of data entirely, and it's considered an error if any error happens before its entirely filled.
}
fn fill_bytes(&mut self, v: &mut [u8]) {
if v.len() == 0 { return }
- match self.reader.read(v) {
- Ok(n) if n == v.len() => return,
- Ok(n) => fail!("ReaderRng.fill_bytes could not fill buffer: \
- read {} out of {} bytes.", n, v.len()),
+ match self.reader.fill(v) {
+ Ok(()) => {}
Err(e) => fail!("ReaderRng.fill_bytes error: {}", e)
}
}
}
impl<R: Reader> Buffer for BufferedReader<R> {
- fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> {
+ fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
if self.pos == self.cap {
self.cap = try!(self.inner.read(self.buf.as_mut_slice()));
self.pos = 0;
impl<R: Reader> Reader for BufferedReader<R> {
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
let nread = {
- let available = try!(self.fill());
+ let available = try!(self.fill_buf());
let nread = cmp::min(available.len(), buf.len());
slice::bytes::copy_memory(buf, available.slice_to(nread));
nread
}
impl<S: Stream> Buffer for BufferedStream<S> {
- fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> { self.inner.fill() }
+ fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> { self.inner.fill_buf() }
fn consume(&mut self, amt: uint) { self.inner.consume(amt) }
}
}
impl Buffer for MemReader {
- fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> {
+ fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
if self.pos < self.buf.len() {
Ok(self.buf.slice_from(self.pos))
} else {
}
impl<'a> Buffer for BufReader<'a> {
- fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> {
+ fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
if self.pos < self.buf.len() {
Ok(self.buf.slice_from(self.pos))
} else {
let mut r = BufWriter::new(buf);
assert!(r.seek(-1, SeekSet).is_err());
}
+
+ #[test]
+ fn io_fill() {
+ let mut r = MemReader::new(~[1, 2, 3, 4, 5, 6, 7, 8]);
+ let mut buf = [0, ..3];
+ assert_eq!(r.fill(buf), Ok(()));
+ assert_eq!(buf.as_slice(), &[1, 2, 3]);
+ assert_eq!(r.fill(buf.mut_slice_to(0)), Ok(()));
+ assert_eq!(buf.as_slice(), &[1, 2, 3]);
+ assert_eq!(r.fill(buf), Ok(()));
+ assert_eq!(buf.as_slice(), &[4, 5, 6]);
+ assert!(r.fill(buf).is_err());
+ assert_eq!(buf.as_slice(), &[7, 8, 6]);
+ }
}
}
}
+ /// Fills the provided slice with bytes from this reader
+ ///
+ /// This will continue to call `read` until the slice has been completely
+ /// filled with bytes.
+ ///
+ /// # Error
+ ///
+ /// If an error occurs at any point, that error is returned, and no further
+ /// bytes are read.
+ fn fill(&mut self, buf: &mut [u8]) -> IoResult<()> {
+ let mut read = 0;
+ while read < buf.len() {
+ read += try!(self.read(buf.mut_slice_from(read)));
+ }
+ Ok(())
+ }
+
/// Reads exactly `len` bytes and appends them to a vector.
///
/// May push fewer than the requested number of bytes on error
/// This function will return an I/O error if the underlying reader was
/// read, but returned an error. Note that it is not an error to return a
/// 0-length buffer.
- fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]>;
+ fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]>;
/// Tells this buffer that `amt` bytes have been consumed from the buffer,
/// so they should no longer be returned in calls to `fill` or `read`.
let mut used;
loop {
{
- let available = match self.fill() {
+ let available = match self.fill_buf() {
Ok(n) => n,
Err(ref e) if res.len() > 0 && e.kind == EndOfFile => {
used = 0;