use core::{
pin::Pin,
task::{Context, Poll, Waker},
};
mod view;
pub use view::View;
mod cloneable;
pub use cloneable::Cloneable;
mod sequence;
use sequence::make_sequence;
pub use sequence::{First, Second};
pub unsafe trait SplittableViewImpl: Sized + Unpin {
type Item;
type Error: core::fmt::Debug;
unsafe fn set_reader_waker(&self, waker: impl Fn() + Send + Sync + 'static);
unsafe fn set_head(&self, index: u64);
unsafe fn compare_set_head(&self, index: u64);
fn poll_available(
self: Pin<&Self>,
cx: &mut Context,
register_wakeup: impl Fn(&Waker),
index: u64,
len: usize,
) -> Poll<Result<usize, Self::Error>>;
unsafe fn view(&self, index: u64, len: usize) -> &[Self::Item];
}
pub unsafe trait SplittableViewImplMut: SplittableViewImpl {
#[allow(clippy::mut_from_ref)]
unsafe fn view_mut(&self, index: u64, len: usize) -> &mut [Self::Item];
}
pub trait SplittableView: SplittableViewImpl {
fn into_view(self) -> View<Self> {
View::new(self)
}
fn into_cloneable_view(self) -> Cloneable<Self> {
Cloneable::new(self)
}
fn sequence(self) -> (First<Self>, Second<Self>) {
make_sequence(self)
}
}
pub trait SplittableViewMut: SplittableView + SplittableViewImplMut {}
impl<T> SplittableView for T where T: SplittableViewImpl {}
impl<T> SplittableViewMut for T where T: SplittableView + SplittableViewImplMut {}