use std::io::Read;
use std::io::Result;
use crate::Input;
use crate::traits::validate_read_count;
use crate::util::UncheckedSlice;
impl<R> Input for R
where
R: Read + ?Sized,
{
type Item = u8;
#[inline(always)]
unsafe fn read_unchecked(&mut self, output: &mut [u8], index: usize, count: usize) -> Result<usize> {
let target = unsafe { UncheckedSlice::subslice_mut(output, index, count) };
Read::read(self, target)
}
#[inline(always)]
fn read(&mut self, output: &mut [Self::Item]) -> Result<usize> {
let read = Read::read(self, output)?;
validate_read_count(read, output.len())?;
Ok(read)
}
fn read_vectored(&mut self, buffers: &mut [&mut [u8]]) -> Result<usize> {
let capacity = crate::util::requested_items(buffers.iter().map(|buffer| buffer.len()))?;
if capacity == 0 {
return Ok(0);
}
let mut slices = crate::util::io_slices_mut(buffers)?;
let count = Read::read_vectored(self, &mut slices)?;
validate_read_count(count, capacity)?;
Ok(count)
}
}