Skip to content

Commit a1aa3f8

Browse files
finish BufRead
1 parent dc6c8fb commit a1aa3f8

File tree

2 files changed

+35
-44
lines changed

2 files changed

+35
-44
lines changed

src/io/read/chain.rs

+20-22
Original file line numberDiff line numberDiff line change
@@ -139,28 +139,26 @@ impl<T: Read + Unpin, U: Read + Unpin> Read for Chain<T, U> {
139139
}
140140

141141
impl<T: BufRead + Unpin, U: BufRead + Unpin> BufRead for Chain<T, U> {
142-
fn poll_fill_buf(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
143-
// FIXME: how to make this compile?
144-
145-
// let Self {
146-
// first,
147-
// second,
148-
// done_first
149-
// } = &mut *self;
150-
151-
// if !*done_first {
152-
// let rd = Pin::new(first);
153-
154-
// match futures_core::ready!(rd.poll_fill_buf(cx)) {
155-
// Ok(buf) if buf.is_empty() => { *done_first = true; }
156-
// Ok(buf) => return Poll::Ready(Ok(buf)),
157-
// Err(err) => return Poll::Ready(Err(err)),
158-
// }
159-
// }
160-
161-
// let rd = Pin::new(second);
162-
// rd.poll_fill_buf(cx)
163-
unimplemented!()
142+
fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
143+
let Self {
144+
first,
145+
second,
146+
done_first,
147+
} = unsafe { self.get_unchecked_mut() };
148+
149+
if !*done_first {
150+
let first = unsafe { Pin::new_unchecked(first) };
151+
match futures_core::ready!(first.poll_fill_buf(cx)) {
152+
Ok(buf) if buf.is_empty() => {
153+
*done_first = true;
154+
}
155+
Ok(buf) => return Poll::Ready(Ok(buf)),
156+
Err(err) => return Poll::Ready(Err(err)),
157+
}
158+
}
159+
160+
let second = unsafe { Pin::new_unchecked(second) };
161+
second.poll_fill_buf(cx)
164162
}
165163

166164
fn consume(mut self: Pin<&mut Self>, amt: usize) {

src/io/read/take.rs

+15-22
Original file line numberDiff line numberDiff line change
@@ -187,28 +187,21 @@ pub fn take_read_internal<R: Read + ?Sized>(
187187
}
188188

189189
impl<T: BufRead + Unpin> BufRead for Take<T> {
190-
fn poll_fill_buf(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
191-
// FIXME: how to get this to compile?
192-
unimplemented!();
193-
194-
// let Self {
195-
// inner,
196-
// limit,
197-
// } = &mut *self;
198-
199-
// if *limit == 0 {
200-
// return Poll::Ready(Ok(&[]));
201-
// }
202-
203-
// let rd = Pin::new(inner);
204-
205-
// match futures_core::ready!(rd.poll_fill_buf(cx)) {
206-
// Ok(buf) => {
207-
// let cap = cmp::min(buf.len() as u64, *limit) as usize;
208-
// Poll::Ready(Ok(&buf[..cap]))
209-
// }
210-
// Err(e) => Poll::Ready(Err(e)),
211-
// }
190+
fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<&[u8]>> {
191+
let Self { inner, limit } = unsafe { self.get_unchecked_mut() };
192+
let inner = unsafe { Pin::new_unchecked(inner) };
193+
194+
if *limit == 0 {
195+
return Poll::Ready(Ok(&[]));
196+
}
197+
198+
match futures_core::ready!(inner.poll_fill_buf(cx)) {
199+
Ok(buf) => {
200+
let cap = cmp::min(buf.len() as u64, *limit) as usize;
201+
Poll::Ready(Ok(&buf[..cap]))
202+
}
203+
Err(e) => Poll::Ready(Err(e)),
204+
}
212205
}
213206

214207
fn consume(mut self: Pin<&mut Self>, amt: usize) {

0 commit comments

Comments
 (0)