#[cfg(feature = "allocator_api")]
use std::alloc::Allocator;
use compio_buf::{BufResult, IoBuf, IoBufMut, IoVectoredBuf, IoVectoredBufMut, t_alloc};
use futures_util::Stream;
use crate::{AsyncReadManaged, IoResult};
pub trait AsyncReadAncillary {
async fn read_with_ancillary<T: IoBufMut, C: IoBufMut>(
&mut self,
buffer: T,
control: C,
) -> BufResult<(usize, usize), (T, C)>;
async fn read_vectored_with_ancillary<T: IoVectoredBufMut, C: IoBufMut>(
&mut self,
buffer: T,
control: C,
) -> BufResult<(usize, usize), (T, C)>;
}
impl<A: AsyncReadAncillary + ?Sized> AsyncReadAncillary for &mut A {
#[inline]
async fn read_with_ancillary<T: IoBufMut, C: IoBufMut>(
&mut self,
buffer: T,
control: C,
) -> BufResult<(usize, usize), (T, C)> {
(**self).read_with_ancillary(buffer, control).await
}
#[inline]
async fn read_vectored_with_ancillary<T: IoVectoredBufMut, C: IoBufMut>(
&mut self,
buffer: T,
control: C,
) -> BufResult<(usize, usize), (T, C)> {
(**self).read_vectored_with_ancillary(buffer, control).await
}
}
impl<A: AsyncReadAncillary + ?Sized, #[cfg(feature = "allocator_api")] Alloc: Allocator>
AsyncReadAncillary for t_alloc!(Box, A, Alloc)
{
#[inline]
async fn read_with_ancillary<T: IoBufMut, C: IoBufMut>(
&mut self,
buffer: T,
control: C,
) -> BufResult<(usize, usize), (T, C)> {
(**self).read_with_ancillary(buffer, control).await
}
#[inline]
async fn read_vectored_with_ancillary<T: IoVectoredBufMut, C: IoBufMut>(
&mut self,
buffer: T,
control: C,
) -> BufResult<(usize, usize), (T, C)> {
(**self).read_vectored_with_ancillary(buffer, control).await
}
}
pub trait AsyncWriteAncillary {
async fn write_with_ancillary<T: IoBuf, C: IoBuf>(
&mut self,
buffer: T,
control: C,
) -> BufResult<usize, (T, C)>;
async fn write_vectored_with_ancillary<T: IoVectoredBuf, C: IoBuf>(
&mut self,
buffer: T,
control: C,
) -> BufResult<usize, (T, C)>;
}
impl<A: AsyncWriteAncillary + ?Sized> AsyncWriteAncillary for &mut A {
#[inline]
async fn write_with_ancillary<T: IoBuf, C: IoBuf>(
&mut self,
buffer: T,
control: C,
) -> BufResult<usize, (T, C)> {
(**self).write_with_ancillary(buffer, control).await
}
#[inline]
async fn write_vectored_with_ancillary<T: IoVectoredBuf, C: IoBuf>(
&mut self,
buffer: T,
control: C,
) -> BufResult<usize, (T, C)> {
(**self)
.write_vectored_with_ancillary(buffer, control)
.await
}
}
impl<A: AsyncWriteAncillary + ?Sized, #[cfg(feature = "allocator_api")] Alloc: Allocator>
AsyncWriteAncillary for t_alloc!(Box, A, Alloc)
{
#[inline]
async fn write_with_ancillary<T: IoBuf, C: IoBuf>(
&mut self,
buffer: T,
control: C,
) -> BufResult<usize, (T, C)> {
(**self).write_with_ancillary(buffer, control).await
}
#[inline]
async fn write_vectored_with_ancillary<T: IoVectoredBuf, C: IoBuf>(
&mut self,
buffer: T,
control: C,
) -> BufResult<usize, (T, C)> {
(**self)
.write_vectored_with_ancillary(buffer, control)
.await
}
}
pub trait AsyncWriteAncillaryZerocopy {
type BufferReadyFuture<T: IoBuf, C: IoBuf>: Future<Output = (T, C)>;
type VectoredBufferReadyFuture<T: IoVectoredBuf, C: IoBuf>: Future<Output = (T, C)>;
fn write_zerocopy_with_ancillary<T: IoBuf, C: IoBuf>(
&mut self,
buf: T,
control: C,
) -> impl Future<Output = BufResult<usize, Self::BufferReadyFuture<T, C>>>;
fn write_zerocopy_vectored_with_ancillary<T: IoVectoredBuf, C: IoBuf>(
&mut self,
buf: T,
control: C,
) -> impl Future<Output = BufResult<usize, Self::VectoredBufferReadyFuture<T, C>>>;
}
impl<A: AsyncWriteAncillaryZerocopy + ?Sized> AsyncWriteAncillaryZerocopy for &mut A {
type BufferReadyFuture<T: IoBuf, C: IoBuf> = A::BufferReadyFuture<T, C>;
type VectoredBufferReadyFuture<T: IoVectoredBuf, C: IoBuf> = A::VectoredBufferReadyFuture<T, C>;
#[inline]
fn write_zerocopy_with_ancillary<T: IoBuf, C: IoBuf>(
&mut self,
buf: T,
control: C,
) -> impl Future<Output = BufResult<usize, Self::BufferReadyFuture<T, C>>> {
(**self).write_zerocopy_with_ancillary(buf, control)
}
#[inline]
fn write_zerocopy_vectored_with_ancillary<T: IoVectoredBuf, C: IoBuf>(
&mut self,
buf: T,
control: C,
) -> impl Future<Output = BufResult<usize, Self::VectoredBufferReadyFuture<T, C>>> {
(**self).write_zerocopy_vectored_with_ancillary(buf, control)
}
}
impl<A: AsyncWriteAncillaryZerocopy + ?Sized, #[cfg(feature = "allocator_api")] Alloc: Allocator>
AsyncWriteAncillaryZerocopy for t_alloc!(Box, A, Alloc)
{
type BufferReadyFuture<T: IoBuf, C: IoBuf> = A::BufferReadyFuture<T, C>;
type VectoredBufferReadyFuture<T: IoVectoredBuf, C: IoBuf> = A::VectoredBufferReadyFuture<T, C>;
fn write_zerocopy_with_ancillary<T: IoBuf, C: IoBuf>(
&mut self,
buf: T,
control: C,
) -> impl Future<Output = BufResult<usize, Self::BufferReadyFuture<T, C>>> {
(**self).write_zerocopy_with_ancillary(buf, control)
}
fn write_zerocopy_vectored_with_ancillary<T: IoVectoredBuf, C: IoBuf>(
&mut self,
buf: T,
control: C,
) -> impl Future<Output = BufResult<usize, Self::VectoredBufferReadyFuture<T, C>>> {
(**self).write_zerocopy_vectored_with_ancillary(buf, control)
}
}
pub trait AsyncReadAncillaryManaged: AsyncReadManaged {
async fn read_managed_with_ancillary<C: IoBufMut>(
&mut self,
len: usize,
control: C,
) -> IoResult<Option<(Self::Buffer, C)>>;
}
pub trait AsyncReadAncillaryMulti {
type Return;
fn read_multi_with_ancillary(
&mut self,
control_len: usize,
) -> impl Stream<Item = IoResult<Self::Return>>;
}