pub struct RingBuffer<T: Sized + Copy> { /* private fields */ }
Expand description

A RingBuffer that implements AsyncRead and AsyncWrite from the futures library.

This object is rather special in that it’s read and writes are connected to a single ringbuffer. It’s good for low level unit tests for (eg. framing a connection with a codec) and verifying that a codec writes the correct data, but it does not mock a full network connection. Subtle things can go wrong, like when using AsyncRead::split and dropping the WriteHalf, the ReadHalf cannot detect that and the task won’t be woken up.

If you want to mock a network connection, use Endpoint.

Implementations§

source§

impl<T: Sized + Copy> RingBuffer<T>

source

pub fn new(size: usize) -> Self

Create a new RingBuffer with a defined capacity. Note that capacity != length, similar to Vec.

source

pub fn capacity(&self) -> usize

The total capacity of the buffer

source

pub fn is_empty(&self) -> bool

Whether there is no data at all in the buffer.

source

pub fn is_full(&self) -> bool

Whether the buffer is completely full.

source

pub fn len(&self) -> usize

The length of the data in the buffer.

source

pub fn remaining(&self) -> usize

How much free space there is left in the container. On empty, remaining == capacity

Trait Implementations§

source§

impl AsyncRead for RingBuffer<u8>

source§

fn poll_read( self: Pin<&mut Self>, cx: &mut Context<'_>, dst: &mut [u8] ) -> Poll<Result<usize, Error>>

Will return Poll::Pending when the buffer is empty. Will be woken up by the AsyncWrite impl when new data is written or the writer is closed.

When the buffer (for network simulation) is closed and empty, or if you pass in a 0 byte buffer, this will return Poll::Ready( Ok(0) ).

This method is infallible.

§

fn poll_read_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &mut [IoSliceMut<'_>] ) -> Poll<Result<usize, Error>>

Attempt to read from the AsyncRead into bufs using vectored IO operations. Read more
source§

impl AsyncWrite for RingBuffer<u8>

source§

fn poll_write( self: Pin<&mut Self>, cx: &mut Context<'_>, src: &[u8] ) -> Poll<Result<usize, Error>>

Will return Poll::Pending when the buffer is full. AsyncRead impl will wake up this task when new place is made. This method returns a io::ErrorKind::NotConnected error if called after poll_close.

source§

fn poll_flush( self: Pin<&mut Self>, _cx: &mut Context<'_> ) -> Poll<Result<(), Error>>

We are always flushed, this is a noop. This method is infallible.

source§

fn poll_close( self: Pin<&mut Self>, _cx: &mut Context<'_> ) -> Poll<Result<(), Error>>

Closes the stream. After this no more data can be send into it. This method is infallible.

§

fn poll_write_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &[IoSlice<'_>] ) -> Poll<Result<usize, Error>>

Attempt to write bytes from bufs into the object using vectored IO operations. Read more
source§

impl<T: Sized + Copy> Debug for RingBuffer<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T: Sized + Copy> From<(Producer<T, Arc<SharedRb<T, Vec<MaybeUninit<T>, Global>>>>, Consumer<T, Arc<SharedRb<T, Vec<MaybeUninit<T>, Global>>>>)> for RingBuffer<T>

The compiler cannot verify that the producer/consumer are from the same RingBuffer object. Obviously if you abuse this things won’t work as expected.

I added this so you can seed a buffer before passing it to futures_ringbuf.

source§

fn from(buffer: (HeapProducer<T>, HeapConsumer<T>)) -> Self

Converts to this type from the input type.
source§

impl<T: Sized + Copy> From<SharedRb<T, Vec<MaybeUninit<T>, Global>>> for RingBuffer<T>

source§

fn from(buffer: SyncRingBuffer<T>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<T> RefUnwindSafe for RingBuffer<T>where T: RefUnwindSafe,

§

impl<T> Send for RingBuffer<T>where T: Send,

§

impl<T> Sync for RingBuffer<T>where T: Send + Sync,

§

impl<T> Unpin for RingBuffer<T>where T: Unpin,

§

impl<T> UnwindSafe for RingBuffer<T>where T: UnwindSafe + RefUnwindSafe,

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<R> AsyncReadExt for Rwhere R: AsyncRead + ?Sized,

§

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

Creates an adaptor which will chain this stream with another. Read more
§

fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where Self: Unpin,

Tries to read some bytes directly into the given buf in asynchronous manner, returning a future type. Read more
§

fn read_vectored<'a>( &'a mut self, bufs: &'a mut [IoSliceMut<'a>] ) -> ReadVectored<'a, Self>where Self: Unpin,

Creates a future which will read from the AsyncRead into bufs using vectored IO operations. Read more
§

fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where Self: Unpin,

Creates a future which will read exactly enough bytes to fill buf, returning an error if end of file (EOF) is hit sooner. Read more
§

fn read_to_end<'a>( &'a mut self, buf: &'a mut Vec<u8, Global> ) -> ReadToEnd<'a, Self>where Self: Unpin,

Creates a future which will read all the bytes from this AsyncRead. Read more
§

fn read_to_string<'a>( &'a mut self, buf: &'a mut String ) -> ReadToString<'a, Self>where Self: Unpin,

Creates a future which will read all the bytes from this AsyncRead. Read more
§

fn split(self) -> (ReadHalf<Self>, WriteHalf<Self>)where Self: AsyncWrite + Sized,

Helper method for splitting this read/write object into two halves. Read more
§

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

Creates an AsyncRead adapter which will read at most limit bytes from the underlying reader. Read more
§

impl<W> AsyncWriteExt for Wwhere W: AsyncWrite + ?Sized,

§

fn flush(&mut self) -> Flush<'_, Self>where Self: Unpin,

Creates a future which will entirely flush this AsyncWrite. Read more
§

fn close(&mut self) -> Close<'_, Self>where Self: Unpin,

Creates a future which will entirely close this AsyncWrite.
§

fn write<'a>(&'a mut self, buf: &'a [u8]) -> Write<'a, Self>where Self: Unpin,

Creates a future which will write bytes from buf into the object. Read more
§

fn write_vectored<'a>( &'a mut self, bufs: &'a [IoSlice<'a>] ) -> WriteVectored<'a, Self>where Self: Unpin,

Creates a future which will write bytes from bufs into the object using vectored IO operations. Read more
§

fn write_all<'a>(&'a mut self, buf: &'a [u8]) -> WriteAll<'a, Self>where Self: Unpin,

Write data into this object. Read more
§

fn into_sink<Item>(self) -> IntoSink<Self, Item>where Item: AsRef<[u8]>, Self: Sized,

Allow using an [AsyncWrite] as a Sink<Item: AsRef<[u8]>>. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere 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 Twhere 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 Twhere 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 Twhere 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.
§

impl<V, T> VZip<V> for Twhere V: MultiLane<T>,

§

fn vzip(self) -> V