1use core::pin::Pin;
17use core::task::{Context, Poll};
18
19use futures_io::AsyncWrite;
20
21use crate::{CountWrite, Result};
22
23#[cfg(any(feature = "futures"))]
24impl<W: AsyncWrite + Unpin> AsyncWrite for CountWrite<W> {
28 fn poll_write(self: Pin<&mut Self>, ctx: &mut Context, buf: &[u8]) -> Poll<Result<usize>> {
29 let Self { inner, count } = unsafe { self.get_unchecked_mut() };
30 let pin = unsafe { Pin::new_unchecked(inner) };
31 let ret = pin.poll_write(ctx, buf);
32 if let Poll::Ready(ret) = &ret {
33 if let Ok(written) = &ret {
34 *count += *written as u64;
35 }
36 }
37 ret
38 }
39
40 fn poll_flush(self: Pin<&mut Self>, ctx: &mut Context) -> Poll<Result> {
41 unsafe { self.map_unchecked_mut(|cw| &mut cw.inner) }.poll_flush(ctx)
42 }
43
44 fn poll_close(self: Pin<&mut Self>, ctx: &mut Context) -> Poll<Result> {
45 unsafe { self.map_unchecked_mut(|cw| &mut cw.inner) }.poll_close(ctx)
46 }
47}