use std::future::Future;
use std::io;
use std::marker::PhantomData;
use std::pin::Pin as StdPin;
use std::sync::Arc;
use std::task::{Context, Poll};
use super::common::{impl_future_drop, poll_io_operation};
use crate::future::waker::WakerRegistry;
use crate::operation::{Operation, Submitted};
use crate::ring::Ring;
pub struct ReadFuture<'ring, 'buf> {
operation: Option<Operation<'ring, 'buf, Submitted>>,
ring: &'ring mut Ring<'ring>,
waker_registry: Arc<WakerRegistry>,
_phantom: PhantomData<(&'ring (), &'buf ())>,
}
pub struct WriteFuture<'ring, 'buf> {
operation: Option<Operation<'ring, 'buf, Submitted>>,
ring: &'ring mut Ring<'ring>,
waker_registry: Arc<WakerRegistry>,
_phantom: PhantomData<(&'ring (), &'buf ())>,
}
impl<'ring, 'buf> ReadFuture<'ring, 'buf> {
pub(crate) fn new(
operation: Operation<'ring, 'buf, Submitted>,
ring: &'ring mut Ring<'ring>,
waker_registry: Arc<WakerRegistry>,
) -> Self {
Self {
operation: Some(operation),
ring,
waker_registry,
_phantom: PhantomData,
}
}
}
impl<'ring, 'buf> WriteFuture<'ring, 'buf> {
pub(crate) fn new(
operation: Operation<'ring, 'buf, Submitted>,
ring: &'ring mut Ring<'ring>,
waker_registry: Arc<WakerRegistry>,
) -> Self {
Self {
operation: Some(operation),
ring,
waker_registry,
_phantom: PhantomData,
}
}
}
impl<'ring, 'buf> Future for ReadFuture<'ring, 'buf> {
type Output = io::Result<(usize, StdPin<&'buf mut [u8]>)>;
fn poll(mut self: StdPin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
poll_io_operation!(self, cx, "ReadFuture")
}
}
impl<'ring, 'buf> Future for WriteFuture<'ring, 'buf> {
type Output = io::Result<(usize, StdPin<&'buf mut [u8]>)>;
fn poll(mut self: StdPin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
poll_io_operation!(self, cx, "WriteFuture")
}
}
impl<'ring, 'buf> Drop for ReadFuture<'ring, 'buf> {
fn drop(&mut self) {
impl_future_drop!(self);
}
}
impl<'ring, 'buf> Drop for WriteFuture<'ring, 'buf> {
fn drop(&mut self) {
impl_future_drop!(self);
}
}