Skip to content

Commit e441473

Browse files
committed
auto merge of #13127 : kballard/rust/read_at_least, r=alexcrichton
Reader.read_at_least() ensures that at least a given number of bytes have been read. The most common use-case for this is ensuring at least 1 byte has been read. If the reader returns 0 enough times in a row, a new error kind NoProgress will be returned instead of looping infinitely. This change is necessary in order to properly support Readers that repeatedly return 0, either because they're broken, or because they're attempting to do a non-blocking read on some resource that never becomes available. Also add .push() and .push_at_least() methods. push() is like read() but the results are appended to the passed Vec. Remove Reader.fill() and Reader.push_exact() as they end up being thin wrappers around read_at_least() and push_at_least(). [breaking-change]
2 parents b2b383c + 972f2e5 commit e441473

File tree

4 files changed

+253
-84
lines changed

4 files changed

+253
-84
lines changed

src/librand/reader.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +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.fill(v) {
64-
Ok(()) => {}
63+
match self.reader.read_at_least(v.len(), v) {
64+
Ok(_) => {}
6565
Err(e) => fail!("ReaderRng.fill_bytes error: {}", e)
6666
}
6767
}

src/libstd/io/extensions.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -342,39 +342,39 @@ mod test {
342342
}
343343

344344
#[test]
345-
fn push_exact() {
346-
let mut reader = MemReader::new(vec!(10, 11, 12, 13));
347-
let mut buf = vec!(8, 9);
348-
reader.push_exact(&mut buf, 4).unwrap();
349-
assert!(buf == vec!(8, 9, 10, 11, 12, 13));
345+
fn push_at_least() {
346+
let mut reader = MemReader::new(vec![10, 11, 12, 13]);
347+
let mut buf = vec![8, 9];
348+
assert!(reader.push_at_least(4, 4, &mut buf).is_ok());
349+
assert!(buf == vec![8, 9, 10, 11, 12, 13]);
350350
}
351351

352352
#[test]
353-
fn push_exact_partial() {
353+
fn push_at_least_partial() {
354354
let mut reader = PartialReader {
355355
count: 0,
356356
};
357-
let mut buf = vec!(8, 9);
358-
reader.push_exact(&mut buf, 4).unwrap();
359-
assert!(buf == vec!(8, 9, 10, 11, 12, 13));
357+
let mut buf = vec![8, 9];
358+
assert!(reader.push_at_least(4, 4, &mut buf).is_ok());
359+
assert!(buf == vec![8, 9, 10, 11, 12, 13]);
360360
}
361361

362362
#[test]
363-
fn push_exact_eof() {
364-
let mut reader = MemReader::new(vec!(10, 11));
365-
let mut buf = vec!(8, 9);
366-
assert!(reader.push_exact(&mut buf, 4).is_err());
367-
assert!(buf == vec!(8, 9, 10, 11));
363+
fn push_at_least_eof() {
364+
let mut reader = MemReader::new(vec![10, 11]);
365+
let mut buf = vec![8, 9];
366+
assert!(reader.push_at_least(4, 4, &mut buf).is_err());
367+
assert!(buf == vec![8, 9, 10, 11]);
368368
}
369369

370370
#[test]
371-
fn push_exact_error() {
371+
fn push_at_least_error() {
372372
let mut reader = ErroringLaterReader {
373373
count: 0,
374374
};
375-
let mut buf = vec!(8, 9);
376-
assert!(reader.push_exact(&mut buf, 4).is_err());
377-
assert!(buf == vec!(8, 9, 10));
375+
let mut buf = vec![8, 9];
376+
assert!(reader.push_at_least(4, 4, &mut buf).is_err());
377+
assert!(buf == vec![8, 9, 10]);
378378
}
379379

380380
#[test]

src/libstd/io/mem.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -559,16 +559,16 @@ mod test {
559559
}
560560

561561
#[test]
562-
fn io_fill() {
563-
let mut r = MemReader::new(vec!(1, 2, 3, 4, 5, 6, 7, 8));
562+
fn io_read_at_least() {
563+
let mut r = MemReader::new(vec![1, 2, 3, 4, 5, 6, 7, 8]);
564564
let mut buf = [0, ..3];
565-
assert_eq!(r.fill(buf), Ok(()));
565+
assert!(r.read_at_least(buf.len(), buf).is_ok());
566566
assert_eq!(buf.as_slice(), &[1, 2, 3]);
567-
assert_eq!(r.fill(buf.mut_slice_to(0)), Ok(()));
567+
assert!(r.read_at_least(0, buf.mut_slice_to(0)).is_ok());
568568
assert_eq!(buf.as_slice(), &[1, 2, 3]);
569-
assert_eq!(r.fill(buf), Ok(()));
569+
assert!(r.read_at_least(buf.len(), buf).is_ok());
570570
assert_eq!(buf.as_slice(), &[4, 5, 6]);
571-
assert!(r.fill(buf).is_err());
571+
assert!(r.read_at_least(buf.len(), buf).is_err());
572572
assert_eq!(buf.as_slice(), &[7, 8, 6]);
573573
}
574574
}

0 commit comments

Comments
 (0)