pub struct RingBuffer { /* private fields */ }
Expand description

Atomic reusable ringbuffer

This ringbuffer implementation is designed to be stored in a static, therefore all methods take &self and not &mut self.

It is “reusable”: when created it has no backing buffer, you can give it one with init and take it back with deinit, and init it again in the future if needed. This is very non-idiomatic, but helps a lot when storing it in a static.

One concurrent writer and one concurrent reader are supported, even at different execution priorities (like main and irq).

Implementations§

source§

impl RingBuffer

source

pub const fn new() -> Self

Create a new empty ringbuffer.

source

pub unsafe fn init(&self, buf: *mut u8, len: usize)

Initialize the ring buffer with a buffer.

§Safety
  • The buffer (buf .. buf+len) must be valid memory until deinit is called.
  • Must not be called concurrently with any other methods.
source

pub unsafe fn deinit(&self)

Deinitialize the ringbuffer.

After calling this, the ringbuffer becomes empty, as if it was just created with new().

§Safety
  • Must not be called concurrently with any other methods.
source

pub unsafe fn reader(&self) -> Reader<'_>

Create a reader.

§Safety

Only one reader can exist at a time.

source

pub unsafe fn writer(&self) -> Writer<'_>

Create a writer.

§Safety

Only one writer can exist at a time.

source

pub fn len(&self) -> usize

Return length of buffer.

source

pub fn is_full(&self) -> bool

Check if buffer is full.

source

pub fn is_empty(&self) -> bool

Check if buffer is empty.

Auto Trait Implementations§

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.