Skip to content

Commit 045bc28

Browse files
committed
auto merge of #18108 : mahkoh/rust/buffered_reader, r=alexcrichton
This optimizes `read` for the case in which the number of bytes requested is larger than the internal buffer. Note that the first comparison occurs again right afterwards and should thus be free. The second comparison occurs only in the cold branch.
2 parents aff4f11 + 3839696 commit 045bc28

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

src/libstd/io/buffered.rs

+11-2
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ impl<R: Reader> Buffer for BufferedReader<R> {
104104

105105
impl<R: Reader> Reader for BufferedReader<R> {
106106
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
107+
if self.pos == self.cap && buf.len() >= self.buf.capacity() {
108+
return self.inner.read(buf);
109+
}
107110
let nread = {
108111
let available = try!(self.fill_buf());
109112
let nread = cmp::min(available.len(), buf.len());
@@ -409,13 +412,19 @@ mod test {
409412

410413
#[test]
411414
fn test_buffered_reader() {
412-
let inner = MemReader::new(vec!(0, 1, 2, 3, 4));
415+
let inner = MemReader::new(vec!(5, 6, 7, 0, 1, 2, 3, 4));
413416
let mut reader = BufferedReader::with_capacity(2, inner);
414417

415418
let mut buf = [0, 0, 0];
416419
let nread = reader.read(buf);
420+
assert_eq!(Ok(3), nread);
421+
let b: &[_] = &[5, 6, 7];
422+
assert_eq!(buf.as_slice(), b);
423+
424+
let mut buf = [0, 0];
425+
let nread = reader.read(buf);
417426
assert_eq!(Ok(2), nread);
418-
let b: &[_] = &[0, 1, 0];
427+
let b: &[_] = &[0, 1];
419428
assert_eq!(buf.as_slice(), b);
420429

421430
let mut buf = [0];

0 commit comments

Comments
 (0)