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