use std::pin::Pin;
use crate::AsyncInput;
use crate::ReadExactFuture;
use crate::ReadFullyFuture;
use crate::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)
}
}