use super::{Ring, SeqRead, SeqWrite};
use crate::Result;
use std::{
fmt,
io::{self, BufRead, ErrorKind, Read, Write},
ops::{Deref, DerefMut},
};
pub struct BufReader<R> {
buf: Ring,
inner: R,
lowat: usize,
}
impl<R: Read> BufReader<R> {
pub fn new(inner: R, capacity: usize) -> Result<Self> {
Ok(Self {
buf: Ring::new(capacity)?,
inner,
lowat: 0,
})
}
#[inline]
pub fn lowat(&self) -> usize {
self.lowat
}
#[inline]
pub fn set_lowat(&mut self, val: usize) {
self.lowat = val
}
#[inline]
pub fn get_ref(&self) -> &R {
&self.inner
}
#[inline]
pub fn get_mut(&mut self) -> &mut R {
&mut self.inner
}
#[inline]
pub fn buffer(&self) -> &[u8] {
self.buf.as_read_slice(std::usize::MAX)
}
pub fn into_inner(self) -> R {
self.inner
}
}
impl<R: Read> Deref for BufReader<R> {
type Target = R;
#[inline]
fn deref(&self) -> &Self::Target {
self.get_ref()
}
}
impl<R: Read> DerefMut for BufReader<R> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
self.get_mut()
}
}
impl<R> AsRef<R> for BufReader<R>
where
R: Read,
<BufReader<R> as Deref>::Target: AsRef<R>,
{
fn as_ref(&self) -> &R {
self.deref()
}
}
impl<R> AsMut<R> for BufReader<R>
where
R: Read,
<BufReader<R> as Deref>::Target: AsMut<R>,
{
fn as_mut(&mut self) -> &mut R {
self.deref_mut()
}
}
impl<R: Read> Read for BufReader<R> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
if self.buf.read_len() == 0 && buf.len() >= self.buf.write_capacity() {
return self.inner.read(buf);
}
let nread = {
let mut rem = self.fill_buf()?;
rem.read(buf)?
};
self.consume(nread);
Ok(nread)
}
}
impl<R: Read + Write> Write for BufReader<R> {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.inner.write(buf)
}
#[inline]
fn write_vectored(&mut self, bufs: &[io::IoSlice<'_>]) -> io::Result<usize> {
self.inner.write_vectored(bufs)
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
self.inner.write_all(buf)
}
#[inline]
fn write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> io::Result<()> {
self.inner.write_fmt(fmt)
}
#[inline]
fn flush(&mut self) -> io::Result<()> {
self.inner.flush()
}
}
impl<R: Read> BufRead for BufReader<R> {
fn fill_buf(&mut self) -> io::Result<&[u8]> {
if self.buf.read_len() <= self.lowat {
let n = self.inner.read(self.buf.as_write_slice(std::usize::MAX))?;
self.buf.feed(n);
}
Ok(self.buffer())
}
fn consume(&mut self, amt: usize) {
self.buf.consume(amt);
}
}
pub struct BufWriter<W: Write> {
buf: Ring,
inner: W,
panicked: bool,
}
impl<W: Write> BufWriter<W> {
pub fn new(inner: W, capacity: usize) -> Result<Self> {
Ok(Self::from_parts(inner, Ring::new(capacity)?))
}
pub fn from_parts(inner: W, buf: Ring) -> Self {
Self {
buf,
inner,
panicked: false,
}
}
#[inline]
pub fn get_ref(&self) -> &W {
&self.inner
}
#[inline]
pub fn get_mut(&mut self) -> &mut W {
&mut self.inner
}
pub fn into_inner(mut self) -> std::result::Result<W, IntoInnerError<W>> {
match self.flush_buf() {
Err(e) => Err(IntoInnerError(self, e)),
Ok(()) => Ok(self.into_parts().0),
}
}
pub fn into_parts(self) -> (W, std::result::Result<Ring, WriterPanicked>) {
let inner = unsafe { std::ptr::read(&self.inner) };
let buf = unsafe { std::ptr::read(&self.buf) };
let buf = if self.panicked {
Err(WriterPanicked(buf))
} else {
Ok(buf)
};
std::mem::forget(self);
(inner, buf)
}
fn flush_buf(&mut self) -> io::Result<()> {
loop {
if self.buf.is_empty() {
break Ok(());
}
self.panicked = true;
let r = self.inner.write(self.buf.as_read_slice(std::usize::MAX));
self.panicked = false;
match r {
Ok(0) => {
break Err(ErrorKind::WriteZero.into());
}
Ok(n) => self.buf.consume(n),
Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
Err(e) => break Err(e),
}
}
}
}
impl<W: Write> Deref for BufWriter<W> {
type Target = W;
#[inline]
fn deref(&self) -> &Self::Target {
self.get_ref()
}
}
impl<W: Write> DerefMut for BufWriter<W> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
self.get_mut()
}
}
impl<W> AsRef<W> for BufWriter<W>
where
W: Write,
<BufWriter<W> as Deref>::Target: AsRef<W>,
{
fn as_ref(&self) -> &W {
self.deref()
}
}
impl<W> AsMut<W> for BufWriter<W>
where
W: Write,
<BufWriter<W> as Deref>::Target: AsMut<W>,
{
fn as_mut(&mut self) -> &mut W {
self.deref_mut()
}
}
impl<W: Write> Drop for BufWriter<W> {
fn drop(&mut self) {
if !self.panicked {
let _r = self.flush_buf();
}
}
}
impl<W: Write> Write for BufWriter<W> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
if buf.len() > self.buf.write_len() {
self.flush_buf()?;
}
if buf.len() >= self.buf.write_len() {
self.panicked = true;
let r = self.inner.write(buf);
self.panicked = false;
r
} else {
self.buf.write(buf)
}
}
fn flush(&mut self) -> io::Result<()> {
self.flush_buf().and_then(|()| self.get_mut().flush())
}
}
impl<W: Write + Read> Read for BufWriter<W> {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.inner.read(buf)
}
#[inline]
fn read_vectored(&mut self, bufs: &mut [io::IoSliceMut<'_>]) -> io::Result<usize> {
self.inner.read_vectored(bufs)
}
#[inline]
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
self.inner.read_to_end(buf)
}
#[inline]
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
self.inner.read_to_string(buf)
}
#[inline]
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
self.inner.read_exact(buf)
}
}
pub struct IntoInnerError<W: Write>(BufWriter<W>, io::Error);
impl<W: Write> IntoInnerError<W> {
pub fn error(&self) -> &io::Error {
&self.1
}
pub fn into_inner(self) -> BufWriter<W> {
self.0
}
pub fn into_error(self) -> io::Error {
self.1
}
pub fn into_parts(self) -> (io::Error, BufWriter<W>) {
(self.1, self.0)
}
}
pub struct WriterPanicked(Ring);
impl WriterPanicked {
pub fn into_inner(self) -> Ring {
self.0
}
const DESCRIPTION: &'static str = "writer panicked, unwritten data may remain";
}
impl fmt::Display for WriterPanicked {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", Self::DESCRIPTION)
}
}
impl fmt::Debug for WriterPanicked {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("WriterPanicked")
.field(
"buffer",
&format_args!("{}/{}", self.0.write_len(), self.0.write_capacity()),
)
.finish()
}
}