Skip to content

Commit e06348e

Browse files
committed
auto merge of #13049 : alexcrichton/rust/io-fill, r=huonw
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.
2 parents e6468a8 + 02dab5a commit e06348e

File tree

4 files changed

+40
-11
lines changed

4 files changed

+40
-11
lines changed

src/librand/reader.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,8 @@ impl<R: Reader> Rng for ReaderRng<R> {
6060
}
6161
fn fill_bytes(&mut self, v: &mut [u8]) {
6262
if v.len() == 0 { return }
63-
match self.reader.read(v) {
64-
Ok(n) if n == v.len() => return,
65-
Ok(n) => fail!("ReaderRng.fill_bytes could not fill buffer: \
66-
read {} out of {} bytes.", n, v.len()),
63+
match self.reader.fill(v) {
64+
Ok(()) => {}
6765
Err(e) => fail!("ReaderRng.fill_bytes error: {}", e)
6866
}
6967
}

src/libstd/io/buffered.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ impl<R: Reader> BufferedReader<R> {
8686
}
8787

8888
impl<R: Reader> Buffer for BufferedReader<R> {
89-
fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> {
89+
fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
9090
if self.pos == self.cap {
9191
self.cap = try!(self.inner.read(self.buf.as_mut_slice()));
9292
self.pos = 0;
@@ -103,7 +103,7 @@ impl<R: Reader> Buffer for BufferedReader<R> {
103103
impl<R: Reader> Reader for BufferedReader<R> {
104104
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
105105
let nread = {
106-
let available = try!(self.fill());
106+
let available = try!(self.fill_buf());
107107
let nread = cmp::min(available.len(), buf.len());
108108
slice::bytes::copy_memory(buf, available.slice_to(nread));
109109
nread
@@ -345,7 +345,7 @@ impl<S: Stream> BufferedStream<S> {
345345
}
346346

347347
impl<S: Stream> Buffer for BufferedStream<S> {
348-
fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> { self.inner.fill() }
348+
fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> { self.inner.fill_buf() }
349349
fn consume(&mut self, amt: uint) { self.inner.consume(amt) }
350350
}
351351

src/libstd/io/mem.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ impl Seek for MemReader {
190190
}
191191

192192
impl Buffer for MemReader {
193-
fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> {
193+
fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
194194
if self.pos < self.buf.len() {
195195
Ok(self.buf.slice_from(self.pos))
196196
} else {
@@ -322,7 +322,7 @@ impl<'a> Seek for BufReader<'a> {
322322
}
323323

324324
impl<'a> Buffer for BufReader<'a> {
325-
fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]> {
325+
fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
326326
if self.pos < self.buf.len() {
327327
Ok(self.buf.slice_from(self.pos))
328328
} else {
@@ -555,4 +555,18 @@ mod test {
555555
let mut r = BufWriter::new(buf);
556556
assert!(r.seek(-1, SeekSet).is_err());
557557
}
558+
559+
#[test]
560+
fn io_fill() {
561+
let mut r = MemReader::new(~[1, 2, 3, 4, 5, 6, 7, 8]);
562+
let mut buf = [0, ..3];
563+
assert_eq!(r.fill(buf), Ok(()));
564+
assert_eq!(buf.as_slice(), &[1, 2, 3]);
565+
assert_eq!(r.fill(buf.mut_slice_to(0)), Ok(()));
566+
assert_eq!(buf.as_slice(), &[1, 2, 3]);
567+
assert_eq!(r.fill(buf), Ok(()));
568+
assert_eq!(buf.as_slice(), &[4, 5, 6]);
569+
assert!(r.fill(buf).is_err());
570+
assert_eq!(buf.as_slice(), &[7, 8, 6]);
571+
}
558572
}

src/libstd/io/mod.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,23 @@ pub trait Reader {
360360
}
361361
}
362362

363+
/// Fills the provided slice with bytes from this reader
364+
///
365+
/// This will continue to call `read` until the slice has been completely
366+
/// filled with bytes.
367+
///
368+
/// # Error
369+
///
370+
/// If an error occurs at any point, that error is returned, and no further
371+
/// bytes are read.
372+
fn fill(&mut self, buf: &mut [u8]) -> IoResult<()> {
373+
let mut read = 0;
374+
while read < buf.len() {
375+
read += try!(self.read(buf.mut_slice_from(read)));
376+
}
377+
Ok(())
378+
}
379+
363380
/// Reads exactly `len` bytes and appends them to a vector.
364381
///
365382
/// May push fewer than the requested number of bytes on error
@@ -1045,7 +1062,7 @@ pub trait Buffer: Reader {
10451062
/// This function will return an I/O error if the underlying reader was
10461063
/// read, but returned an error. Note that it is not an error to return a
10471064
/// 0-length buffer.
1048-
fn fill<'a>(&'a mut self) -> IoResult<&'a [u8]>;
1065+
fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]>;
10491066

10501067
/// Tells this buffer that `amt` bytes have been consumed from the buffer,
10511068
/// so they should no longer be returned in calls to `fill` or `read`.
@@ -1116,7 +1133,7 @@ pub trait Buffer: Reader {
11161133
let mut used;
11171134
loop {
11181135
{
1119-
let available = match self.fill() {
1136+
let available = match self.fill_buf() {
11201137
Ok(n) => n,
11211138
Err(ref e) if res.len() > 0 && e.kind == EndOfFile => {
11221139
used = 0;

0 commit comments

Comments
 (0)