use std::io::Cursor;
use compio_buf::IoBuf;
use crate::IoResult;
pub trait AsyncReadManaged {
type BufferPool;
type Buffer: IoBuf;
async fn read_managed(
&mut self,
buffer_pool: &Self::BufferPool,
len: usize,
) -> IoResult<Self::Buffer>;
}
pub trait AsyncReadManagedAt {
type BufferPool;
type Buffer: IoBuf;
async fn read_managed_at(
&self,
pos: u64,
buffer_pool: &Self::BufferPool,
len: usize,
) -> IoResult<Self::Buffer>;
}
impl<A: AsyncReadManagedAt> AsyncReadManaged for Cursor<A> {
type Buffer = A::Buffer;
type BufferPool = A::BufferPool;
async fn read_managed(
&mut self,
buffer_pool: &Self::BufferPool,
len: usize,
) -> IoResult<Self::Buffer> {
let pos = self.position();
let buf = self
.get_ref()
.read_managed_at(pos, buffer_pool, len)
.await?;
self.set_position(pos + buf.buf_len() as u64);
Ok(buf)
}
}