@@ -1446,7 +1446,7 @@ impl<T: Read, U: Read> Read for Chain<T, U> {
14461446impl < T : BufRead , U : BufRead > BufRead for Chain < T , U > {
14471447 fn fill_buf ( & mut self ) -> Result < & [ u8 ] > {
14481448 if !self . done_first {
1449- match try! ( self . first . fill_buf ( ) ) {
1449+ match self . first . fill_buf ( ) ? {
14501450 buf if buf. len ( ) == 0 => { self . done_first = true ; }
14511451 buf => return Ok ( buf) ,
14521452 }
@@ -1865,6 +1865,36 @@ mod tests {
18651865 assert_eq ! ( 0 , R . take( 0 ) . read( & mut buf) . unwrap( ) ) ;
18661866 }
18671867
1868+ fn cmp_bufread < Br1 : BufRead , Br2 : BufRead > ( mut br1 : Br1 , mut br2 : Br2 , exp : & [ u8 ] ) {
1869+ let mut cat = Vec :: new ( ) ;
1870+ loop {
1871+ let consume = {
1872+ let buf1 = br1. fill_buf ( ) . unwrap ( ) ;
1873+ let buf2 = br2. fill_buf ( ) . unwrap ( ) ;
1874+ let minlen = if buf1. len ( ) < buf2. len ( ) { buf1. len ( ) } else { buf2. len ( ) } ;
1875+ assert_eq ! ( buf1[ ..minlen] , buf2[ ..minlen] ) ;
1876+ cat. extend_from_slice ( & buf1[ ..minlen] ) ;
1877+ minlen
1878+ } ;
1879+ if consume == 0 {
1880+ break ;
1881+ }
1882+ br1. consume ( consume) ;
1883+ br2. consume ( consume) ;
1884+ }
1885+ assert_eq ! ( br1. fill_buf( ) . unwrap( ) . len( ) , 0 ) ;
1886+ assert_eq ! ( br2. fill_buf( ) . unwrap( ) . len( ) , 0 ) ;
1887+ assert_eq ! ( & cat[ ..] , & exp[ ..] )
1888+ }
1889+
1890+ #[ test]
1891+ fn chain_bufread ( ) {
1892+ let testdata = b"ABCDEFGHIJKL" ;
1893+ let chain1 = ( & testdata[ ..3 ] ) . chain ( & testdata[ 3 ..6 ] ) . chain ( & testdata[ 6 ..9 ] ) . chain ( & testdata[ 9 ..] ) ;
1894+ let chain2 = ( & testdata[ ..4 ] ) . chain ( & testdata[ 4 ..8 ] ) . chain ( & testdata[ 8 ..] ) ;
1895+ cmp_bufread ( chain1, chain2, & testdata[ ..] ) ;
1896+ }
1897+
18681898 #[ bench]
18691899 fn bench_read_to_end ( b : & mut test:: Bencher ) {
18701900 b. iter ( || {
0 commit comments