use std::io::Result;
use std::pin::Pin;
use std::task::Context;
use std::task::Poll;
use crate::ReadExactFuture;
use crate::ReadFullyFuture;
use crate::ReadFuture;
use crate::traits::normalize_async_error;
use crate::traits::validate_read_count;
pub trait AsyncInput {
type Item;
#[inline(always)]
#[must_use]
fn is_buffered(&self) -> bool {
false
}
unsafe fn poll_read_unchecked(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
output: &mut [Self::Item],
index: usize,
count: usize,
) -> Poll<Result<usize>>;
#[inline]
fn poll_read(self: Pin<&mut Self>, cx: &mut Context<'_>, output: &mut [Self::Item]) -> Poll<Result<usize>> {
if output.is_empty() {
return Poll::Ready(Ok(0));
}
let requested = output.len();
match unsafe { self.poll_read_unchecked(cx, output, 0, requested) } {
Poll::Ready(Ok(read)) => Poll::Ready(validate_read_count(read, requested).map(|()| read)),
Poll::Ready(Err(error)) => Poll::Ready(Err(normalize_async_error(error))),
Poll::Pending => Poll::Pending,
}
}
#[inline(always)]
fn read_async<'a>(&'a mut self, output: &'a mut [Self::Item]) -> ReadFuture<'a, Self>
where
Self: Sized + Unpin,
{
ReadFuture::new(Pin::new(self), output)
}
#[inline(always)]
fn read_fully_async<'a>(&'a mut self, output: &'a mut [Self::Item]) -> ReadFullyFuture<'a, Self>
where
Self: Sized + Unpin,
{
ReadFullyFuture::new(Pin::new(self), output)
}
#[inline(always)]
fn read_exactly_async<'a>(&'a mut self, output: &'a mut [Self::Item]) -> ReadExactFuture<'a, Self>
where
Self: Sized + Unpin,
{
ReadExactFuture::new(Pin::new(self), output)
}
}