#![doc(test(attr(deny(warnings))))]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
use core::mem;
pub trait ReadBuf<T> {
type E;
fn read_buf<'buf>(&mut self, buf: &'buf mut [mem::MaybeUninit<T>]) -> (usize, Option<Self::E>);
#[inline]
fn read_buf_exact<'buf>(
&mut self,
mut buf: &'buf mut [mem::MaybeUninit<T>],
) -> Result<(), (usize, Self::E)> {
let mut all_read: usize = 0;
while !buf.is_empty() {
let (cur_read, err) = self.read_buf(buf);
all_read += cur_read;
if let Some(err) = err {
return Err((all_read, err));
}
buf = &mut buf[cur_read..];
}
Ok(())
}
}
pub trait ReadBufAtomic<T>: ReadBuf<T> {
fn read_buf_atomic<'buf>(&mut self, buf: &'buf mut [mem::MaybeUninit<T>]) -> Result<(), Self::E>;
}
pub trait PReadBuf<T> {
type E;
fn pread_buf<'buf>(&self, buf: &'buf mut [mem::MaybeUninit<T>]) -> (usize, Option<Self::E>);
}