use std::io::Result;
use std::io::Seek;
use std::io::SeekFrom;
use std::io::Write;
use crate::ByteOutput;
use crate::Output;
#[must_use]
#[repr(transparent)]
pub struct StdWrite<O> {
inner: O,
}
impl<O> StdWrite<O> {
#[inline]
pub const fn new(inner: O) -> Self {
Self { inner }
}
#[inline]
pub const fn get_ref(&self) -> &O {
&self.inner
}
#[inline]
pub fn get_mut(&mut self) -> &mut O {
&mut self.inner
}
#[inline]
pub fn into_inner(self) -> O {
self.inner
}
}
impl<O> Write for StdWrite<O>
where
O: ByteOutput,
{
#[inline]
fn write(&mut self, input: &[u8]) -> Result<usize> {
Output::write(&mut self.inner, input)
}
#[inline]
fn write_vectored(&mut self, buffers: &[std::io::IoSlice<'_>]) -> Result<usize> {
let capacity = crate::util::requested_items(buffers.iter().map(|buffer| buffer.len()))?;
if capacity == 0 {
return Ok(0);
}
let slices = crate::util::byte_slices(buffers)?;
let count = Output::write_vectored(&mut self.inner, &slices)?;
crate::traits::validate_write_count(count, capacity)?;
Ok(count)
}
#[inline]
fn flush(&mut self) -> Result<()> {
Output::flush(&mut self.inner)
}
}
impl<O> Seek for StdWrite<O>
where
O: ByteOutput + crate::Seekable<Unit = u8>,
{
#[inline]
fn seek(&mut self, position: SeekFrom) -> Result<u64> {
crate::Seekable::seek_to(&mut self.inner, position)
}
}