@@ -1442,6 +1442,27 @@ impl<T: Read, U: Read> Read for Chain<T, U> {
14421442 }
14431443}
14441444
1445+ #[ stable( feature = "chain_bufread" , since = "1.9.0" ) ]
1446+ impl < T : BufRead , U : BufRead > BufRead for Chain < T , U > {
1447+ fn fill_buf ( & mut self ) -> Result < & [ u8 ] > {
1448+ if !self . done_first {
1449+ match self . first . fill_buf ( ) ? {
1450+ buf if buf. len ( ) == 0 => { self . done_first = true ; }
1451+ buf => return Ok ( buf) ,
1452+ }
1453+ }
1454+ self . second . fill_buf ( )
1455+ }
1456+
1457+ fn consume ( & mut self , amt : usize ) {
1458+ if !self . done_first {
1459+ self . first . consume ( amt)
1460+ } else {
1461+ self . second . consume ( amt)
1462+ }
1463+ }
1464+ }
1465+
14451466/// Reader adaptor which limits the bytes read from an underlying reader.
14461467///
14471468/// This struct is generally created by calling [`take()`][take] on a reader.
@@ -1844,6 +1865,39 @@ mod tests {
18441865 assert_eq ! ( 0 , R . take( 0 ) . read( & mut buf) . unwrap( ) ) ;
18451866 }
18461867
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 ] )
1894+ . chain ( & testdata[ 6 ..9 ] )
1895+ . chain ( & testdata[ 9 ..] ) ;
1896+ let chain2 = ( & testdata[ ..4 ] ) . chain ( & testdata[ 4 ..8 ] )
1897+ . chain ( & testdata[ 8 ..] ) ;
1898+ cmp_bufread ( chain1, chain2, & testdata[ ..] ) ;
1899+ }
1900+
18471901 #[ bench]
18481902 fn bench_read_to_end ( b : & mut test:: Bencher ) {
18491903 b. iter ( || {
0 commit comments