Struct vmap::io::BufWriter

source ·
pub struct BufWriter<W: Write> { /* private fields */ }
Expand description

The BufWriter adds buffering to any writer using a specialized buffer.

This is very similar std::io::BufWriter, but it uses a Ring for the internal the buffer.

§Examples

use vmap::io::{BufReader, BufWriter};

let recv = TcpStream::connect(srv.local_addr().unwrap())?;
let send = /* accepted socked */

let mut wr = BufWriter::new(send, 4000).unwrap();
wr.write_all(b"hello\nworld\n")?;
wr.flush()?;

let mut rd = BufReader::new(recv, 4000).unwrap();
let mut line = String::new();
let len = rd.read_line(&mut line)?;
assert_eq!(line, "hello\n");

Implementations§

source§

impl<W: Write> BufWriter<W>

source

pub fn new(inner: W, capacity: usize) -> Result<Self>

Creates a new BufWriter.

source

pub fn from_parts(inner: W, buf: Ring) -> Self

Creates a new BufWriter using an allocated, and possibly populated, Ring instance. Consider calling Ring::clear() prior if the contents of the ring should be discarded.

source

pub fn get_ref(&self) -> &W

Gets a reference to the underlying writer.

source

pub fn get_mut(&mut self) -> &mut W

Gets a mutable reference to the underlying writer.

source

pub fn into_inner(self) -> Result<W, IntoInnerError<W>>

Unwraps this BufWriter, returning the underlying writer.

On Err, the result is a tuple combining the error that occurred while flusing the buffer, and the buffer object.

§Examples
use std::io::{self, Write, ErrorKind};
use vmap::io::BufWriter;

struct ErringWriter(usize);
impl Write for ErringWriter {
  fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
    // eventually fails with BrokenPipe
  }
  fn flush(&mut self) -> io::Result<()> { Ok(()) }
}

let mut stream = BufWriter::new(ErringWriter(6), 4096)?;
stream.write_all(b"hello\nworld\n")?;

// flush the buffer and get the original stream back
let stream = match stream.into_inner() {
    Ok(s) => s,
    Err(e) => {
        assert_eq!(e.error().kind(), ErrorKind::BrokenPipe);

        // You can forcefully obtain the stream, however it is in an
        // failing state.
        let (recovered_writer, ring) = e.into_inner().into_parts();
        assert_eq!(ring.unwrap().as_ref(), b"world\n");
        recovered_writer
    }
};
source

pub fn into_parts(self) -> (W, Result<Ring, WriterPanicked>)

Disassembles this BufWriter into the underlying writer and the Ring used for buffering, containing any buffered but unwritted data.

If the underlying writer panicked during the previous write, the Ring will be wrapped in a WriterPanicked error. In this case, the content still buffered within the Ring may or may not have been written.

§Example
use std::io::{self, Write};
use std::panic::{catch_unwind, AssertUnwindSafe};
use vmap::io::BufWriter;

struct PanickingWriter;
impl Write for PanickingWriter {
  fn write(&mut self, buf: &[u8]) -> io::Result<usize> { panic!() }
  fn flush(&mut self) -> io::Result<()> { panic!() }
}

let mut stream = BufWriter::new(PanickingWriter, 4096)?;
stream.write_all(b"testing")?;
let result = catch_unwind(AssertUnwindSafe(|| {
    stream.flush().unwrap()
}));
assert!(result.is_err());
let (recovered_writer, ring) = stream.into_parts();
assert!(matches!(recovered_writer, PanickingWriter));
assert_eq!(ring.unwrap_err().into_inner().as_ref(), b"testing");

Trait Implementations§

source§

impl<W> AsMut<W> for BufWriter<W>
where W: Write, <BufWriter<W> as Deref>::Target: AsMut<W>,

source§

fn as_mut(&mut self) -> &mut W

Converts this type into a mutable reference of the (usually inferred) input type.
source§

impl<W> AsRef<W> for BufWriter<W>
where W: Write, <BufWriter<W> as Deref>::Target: AsRef<W>,

source§

fn as_ref(&self) -> &W

Converts this type into a shared reference of the (usually inferred) input type.
source§

impl<W: Write> Deref for BufWriter<W>

§

type Target = W

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl<W: Write> DerefMut for BufWriter<W>

source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
source§

impl<W: Write> Drop for BufWriter<W>

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl<W: Write + Read> Read for BufWriter<W>

source§

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

Pull some bytes from this source into the specified buffer, returning how many bytes were read. Read more
source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>

Like read, except that it reads into a slice of buffers. Read more
source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>

Read all bytes until EOF in this source, placing them into buf. Read more
source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize>

Read all bytes until EOF in this source, appending them to buf. Read more
source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>

Read the exact number of bytes required to fill buf. Read more
source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored implementation. Read more
source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Read the exact number of bytes required to fill cursor. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · source§

fn bytes(self) -> Bytes<Self>
where Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where R: Read, Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · source§

fn take(self, limit: u64) -> Take<Self>
where Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
source§

impl<W: Write> Write for BufWriter<W>

source§

fn write(&mut self, buf: &[u8]) -> Result<usize>

Write a buffer into this writer, returning how many bytes were written. Read more
source§

fn flush(&mut self) -> Result<()>

Flush this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
1.36.0 · source§

fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

Like write, except that it writes from a slice of buffers. Read more
source§

fn is_write_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Writer has an efficient write_vectored implementation. Read more
1.0.0 · source§

fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

Attempts to write an entire buffer into this writer. Read more
source§

fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

🔬This is a nightly-only experimental API. (write_all_vectored)
Attempts to write multiple buffers into this writer. Read more
1.0.0 · source§

fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<(), Error>

Writes a formatted string into this writer, returning any error encountered. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adapter for this instance of Write. Read more

Auto Trait Implementations§

§

impl<W> Freeze for BufWriter<W>
where W: Freeze,

§

impl<W> RefUnwindSafe for BufWriter<W>
where W: RefUnwindSafe,

§

impl<W> !Send for BufWriter<W>

§

impl<W> !Sync for BufWriter<W>

§

impl<W> Unpin for BufWriter<W>
where W: Unpin,

§

impl<W> UnwindSafe for BufWriter<W>
where W: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.