about summary refs log tree commit diff
path: root/src/libstd/io
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-10-20 03:27:12 +0000
committerbors <bors@rust-lang.org>2014-10-20 03:27:12 +0000
commit045bc283eceb414caeea28797b9b610bd33f33ac (patch)
tree797553fefcd75356f7f1a7a6fa610df8db82ef51 /src/libstd/io
parentaff4f11cddadae56fe26980329b610066eb487b0 (diff)
parent3839696529213ceaa12eb0da28c3dad10c8b99e7 (diff)
downloadrust-045bc283eceb414caeea28797b9b610bd33f33ac.tar.gz
rust-045bc283eceb414caeea28797b9b610bd33f33ac.zip
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.
Diffstat (limited to 'src/libstd/io')
-rw-r--r--src/libstd/io/buffered.rs13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs
index 8ab0d3a5504..95c44e6a3fc 100644
--- a/src/libstd/io/buffered.rs
+++ b/src/libstd/io/buffered.rs
@@ -104,6 +104,9 @@ impl<R: Reader> Buffer for BufferedReader<R> {
 
 impl<R: Reader> Reader for BufferedReader<R> {
     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
+        if self.pos == self.cap && buf.len() >= self.buf.capacity() {
+            return self.inner.read(buf);
+        }
         let nread = {
             let available = try!(self.fill_buf());
             let nread = cmp::min(available.len(), buf.len());
@@ -409,13 +412,19 @@ mod test {
 
     #[test]
     fn test_buffered_reader() {
-        let inner = MemReader::new(vec!(0, 1, 2, 3, 4));
+        let inner = MemReader::new(vec!(5, 6, 7, 0, 1, 2, 3, 4));
         let mut reader = BufferedReader::with_capacity(2, inner);
 
         let mut buf = [0, 0, 0];
         let nread = reader.read(buf);
+        assert_eq!(Ok(3), nread);
+        let b: &[_] = &[5, 6, 7];
+        assert_eq!(buf.as_slice(), b);
+
+        let mut buf = [0, 0];
+        let nread = reader.read(buf);
         assert_eq!(Ok(2), nread);
-        let b: &[_] = &[0, 1, 0];
+        let b: &[_] = &[0, 1];
         assert_eq!(buf.as_slice(), b);
 
         let mut buf = [0];