use {
crate::io::{ReadResult, Reader, read_size_limit},
core::mem::{MaybeUninit, transmute},
std::io::{self, BufReader, Read},
};
pub struct ReadAdapter<R: ?Sized>(R);
impl<R: Read> ReadAdapter<R> {
pub fn new(inner: R) -> Self {
Self(inner)
}
}
#[inline]
fn copy_into_slice<R: Read + ?Sized>(
reader: &mut R,
dst: &mut [MaybeUninit<u8>],
) -> ReadResult<()> {
#[cold]
fn maybe_eof_to_read_size_limit(err: io::Error, len: usize) -> ReadResult<()> {
if err.kind() == io::ErrorKind::UnexpectedEof {
Err(read_size_limit(len))
} else {
Err(err.into())
}
}
let buf = unsafe { transmute::<&mut [MaybeUninit<u8>], &mut [u8]>(dst) };
if let Err(e) = reader.read_exact(buf) {
return maybe_eof_to_read_size_limit(e, buf.len());
};
Ok(())
}
impl<R: Read + ?Sized> Reader<'_> for ReadAdapter<R> {
#[inline(always)]
fn copy_into_slice(&mut self, dst: &mut [MaybeUninit<u8>]) -> ReadResult<()> {
copy_into_slice(&mut self.0, dst)
}
}
impl<R: Read + ?Sized> Reader<'_> for BufReader<R> {
#[inline(always)]
fn copy_into_slice(&mut self, dst: &mut [MaybeUninit<u8>]) -> ReadResult<()> {
copy_into_slice(self, dst)
}
}