use std::borrow::Cow;
use std::ops::Range;
use super::Item;
use crate::common::ext::aligned_vec::ACow;
use crate::common::generic_consts::AccessPattern;
use crate::common::universal_io::{Result, UserData};
pub trait BorrowedReadPipeline<'file, U>: Sized
where
U: UserData,
{
type File: 'file;
fn new() -> Result<Self>;
fn can_schedule(&mut self) -> bool;
fn schedule<P: AccessPattern>(
&mut self,
user_data: U,
file: &'file Self::File,
range: Range<u64>,
align: usize,
) -> Result<()>;
fn wait(&mut self) -> Result<Option<(U, ACow<'file>)>>;
#[inline]
fn wait_bytemuck<T: Item>(&mut self) -> Result<Option<(U, Cow<'file, [T]>)>> {
let Some((user_data, bytes)) = self.wait()? else {
return Ok(None);
};
Ok(Some((user_data, bytes.try_cast_bytemuck().unwrap())))
}
}
pub trait OwnedReadPipeline<U>: Sized
where
U: UserData,
{
type File;
fn new(file: Self::File) -> Result<Self>;
fn can_schedule(&mut self) -> bool;
fn schedule<P: AccessPattern>(
&mut self,
user_data: U,
range: Range<u64>,
align: usize,
) -> Result<()>;
fn schedule_whole(&mut self, user_data: U) -> Result<()>;
fn wait(&mut self) -> Result<Option<(U, ACow<'_>)>>;
#[inline]
fn wait_bytemuck<T: Item>(&mut self) -> Result<Option<(U, Cow<'_, [T]>)>> {
let Some((user_data, bytes)) = self.wait()? else {
return Ok(None);
};
Ok(Some((user_data, bytes.try_cast_bytemuck().unwrap())))
}
}