@@ -1442,6 +1442,27 @@ impl<T: Read, U: Read> Read for Chain<T, U> {
1442
1442
}
1443
1443
}
1444
1444
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
+
1445
1466
/// Reader adaptor which limits the bytes read from an underlying reader.
1446
1467
///
1447
1468
/// This struct is generally created by calling [`take()`][take] on a reader.
@@ -1844,6 +1865,39 @@ mod tests {
1844
1865
assert_eq ! ( 0 , R . take( 0 ) . read( & mut buf) . unwrap( ) ) ;
1845
1866
}
1846
1867
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
+
1847
1901
#[ bench]
1848
1902
fn bench_read_to_end ( b : & mut test:: Bencher ) {
1849
1903
b. iter ( || {
0 commit comments