use std::pin::Pin;
use crate::{
AsyncInput,
ReadExactFuture,
ReadFullyFuture,
ReadFuture,
};
pub trait PinnedAsyncInputExt {
type Input: AsyncInput + ?Sized;
fn read_async<'a>(
&'a mut self,
output: &'a mut [<Self::Input as AsyncInput>::Item],
) -> ReadFuture<'a, Self::Input>;
fn read_fully_async<'a>(
&'a mut self,
output: &'a mut [<Self::Input as AsyncInput>::Item],
) -> ReadFullyFuture<'a, Self::Input>;
fn read_exactly_async<'a>(
&'a mut self,
output: &'a mut [<Self::Input as AsyncInput>::Item],
) -> ReadExactFuture<'a, Self::Input>;
}
impl<I> PinnedAsyncInputExt for Pin<&mut I>
where
I: AsyncInput + ?Sized,
{
type Input = I;
#[inline(always)]
fn read_async<'a>(
&'a mut self,
output: &'a mut [I::Item],
) -> ReadFuture<'a, Self::Input> {
ReadFuture::new(self.as_mut(), output)
}
#[inline(always)]
fn read_fully_async<'a>(
&'a mut self,
output: &'a mut [I::Item],
) -> ReadFullyFuture<'a, Self::Input> {
ReadFullyFuture::new(self.as_mut(), output)
}
#[inline(always)]
fn read_exactly_async<'a>(
&'a mut self,
output: &'a mut [I::Item],
) -> ReadExactFuture<'a, Self::Input> {
ReadExactFuture::new(self.as_mut(), output)
}
}