Skip to content

Commit 161c541

Browse files
committed
Auto merge of #32541 - troplin:chain-bufread, r=alexcrichton
Implement BufRead for Chain Addresses #32536
2 parents 21a4d80 + f611e44 commit 161c541

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

src/libstd/io/mod.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)