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_vectored_operation};
use crate::future::waker::WakerRegistry;
use crate::operation::{Operation, Submitted};
use crate::ring::Ring;
pub struct VectoredReadFuture<'ring, 'buf> {
operation: Option<Operation<'ring, 'buf, Submitted>>,
ring: &'ring mut Ring<'ring>,
waker_registry: Arc<WakerRegistry>,
_phantom: PhantomData<(&'ring (), &'buf ())>,
}
pub struct VectoredWriteFuture<'ring, 'buf> {
operation: Option<Operation<'ring, 'buf, Submitted>>,
ring: &'ring mut Ring<'ring>,
waker_registry: Arc<WakerRegistry>,
_phantom: PhantomData<(&'ring (), &'buf ())>,
}
impl<'ring, 'buf> VectoredReadFuture<'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> VectoredWriteFuture<'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 VectoredReadFuture<'ring, 'buf> {
type Output = io::Result<(usize, Vec<StdPin<&'buf mut [u8]>>)>;
fn poll(mut self: StdPin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
poll_vectored_operation!(self, cx, "VectoredReadFuture")
}
}
impl<'ring, 'buf> Future for VectoredWriteFuture<'ring, 'buf> {
type Output = io::Result<(usize, Vec<StdPin<&'buf mut [u8]>>)>;
fn poll(mut self: StdPin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
poll_vectored_operation!(self, cx, "VectoredWriteFuture")
}
}
impl<'ring, 'buf> Drop for VectoredReadFuture<'ring, 'buf> {
fn drop(&mut self) {
impl_future_drop!(self);
}
}
impl<'ring, 'buf> Drop for VectoredWriteFuture<'ring, 'buf> {
fn drop(&mut self) {
impl_future_drop!(self);
}
}