1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
use std::io;
use buf_redux_reexport as br;

use BufReadGrow;

impl<'a, B: BufReadGrow + ?Sized> BufReadGrow for &'a mut B {
    #[inline]
    fn grow_buf(&mut self) -> io::Result<&[u8]> {
        (**self).grow_buf()
    }
    #[inline]
    fn fill_buf_min(&mut self, size: usize) -> io::Result<&[u8]> {
        (**self).fill_buf_min(size)
    }
    #[inline]
    fn read_until2(&mut self, delims: (u8, u8), buf: &mut Vec<u8>) -> io::Result<()> {
        (**self).read_until2(delims, buf)
    }
    #[inline]
    fn skip_until2(&mut self, delims: (u8, u8)) -> io::Result<()> {
        (**self).skip_until2(delims)
    }
}

impl<B: BufReadGrow + ?Sized> BufReadGrow for Box<B> {
    #[inline]
    fn grow_buf(&mut self) -> io::Result<&[u8]> {
        (**self).grow_buf()
    }
    #[inline]
    fn fill_buf_min(&mut self, size: usize) -> io::Result<&[u8]> {
        (**self).fill_buf_min(size)
    }
    #[inline]
    fn read_until2(&mut self, delims: (u8, u8), buf: &mut Vec<u8>) -> io::Result<()> {
        (**self).read_until2(delims, buf)
    }
    #[inline]
    fn skip_until2(&mut self, delims: (u8, u8)) -> io::Result<()> {
        (**self).skip_until2(delims)
    }
}

impl BufReadGrow for io::Empty {
    fn grow_buf(&mut self) -> io::Result<&[u8]> {
        Err(io::Error::new(io::ErrorKind::UnexpectedEof, "Stream is already at EOF"))
    }
}

impl<'a> BufReadGrow for &'a [u8] {
    #[inline]
    fn grow_buf(&mut self) -> io::Result<&[u8]> {
        Err(io::Error::new(io::ErrorKind::UnexpectedEof, "Stream is already at EOF"))
    }
}

impl<T> BufReadGrow for io::Cursor<T>
    where T: AsRef<[u8]>
{
    fn grow_buf(&mut self) -> io::Result<&[u8]> {
        Err(io::Error::new(io::ErrorKind::UnexpectedEof, "Stream is already at EOF"))
    }
}

impl<R, Rs, Ms> BufReadGrow for br::BufReader<R, Rs, Ms>
    where R: io::Read,
          Rs: br::strategy::ReadStrategy,
          Ms: br::strategy::MoveStrategy
{
    fn grow_buf(&mut self) -> io::Result<&[u8]> {
        if self.available() == self.capacity() {
            return Err(io::Error::new(io::ErrorKind::Other,
                                      "No bytes could be read because the buffer is full"));
        }

        match try!(self.read_into_buf()) {
            0 => {
                Err(io::Error::new(io::ErrorKind::UnexpectedEof, "Stream is already at EOF"))
            }
            _ => Ok(self.get_buf()),
        }
    }
}

#[cfg(test)]
mod tests {
    use buf_redux_reexport as br;
    use std::io;
    use {Stream, Read, BufReadGrow};
    use mock::MockRead;

    #[test]
    fn bufreader_bufreadgrow_3of3() {
        let mut reader = io::repeat(0).take(3).limited(1).buffer();
        assert_eq!(reader.fill_buf_min(3).unwrap().len(), 3);
    }

        #[test]
    fn bufreader_bufreadgrow_4of3() {
        let mut reader = io::repeat(0).take(3).limited(1).buffer();
        assert_eq!(reader.fill_buf_min(4).unwrap_err().kind(),
                   io::ErrorKind::UnexpectedEof);
    }

    #[test]
    fn bufreader_bufreadgrow_3of3_smallbuf() {
        let mut reader = br::BufReader::with_capacity(3, io::repeat(0).limited(1));
        assert_eq!(reader.fill_buf_min(3).unwrap().len(), 3);
    }

    #[test]
    fn bufreader_bufreadgrow_4of3_smallbuf() {
        let mut reader = br::BufReader::with_capacity(3, io::repeat(0).limited(1));
        assert_eq!(reader.fill_buf_min(4).unwrap_err().kind(),
                   io::ErrorKind::Other);
    }
}