pub struct RingBuffer<A, const N: usize> { /* private fields */ }
Expand description

A fixed capacity ring buffer.

A ring buffer is an array where the first logical index is at some arbitrary location inside the array, and the indices wrap around to the start of the array once they overflow its bounds.

This gives us the ability to push to either the front or the end of the array in constant time, at the cost of losing the ability to get a single contiguous slice reference to the contents.

It differs from the Chunk in that the latter will have mostly constant time pushes, but may occasionally need to shift its contents around to make room. They both have constant time pop, and they both have linear time insert and remove.

The RingBuffer offers its own Slice and SliceMut types to compensate for the loss of being able to take a slice, but they’re somewhat less efficient, so the general rule should be that you shouldn’t choose a RingBuffer if you rely heavily on slices - but if you don’t, it’s probably a marginally better choice overall than Chunk.

Feature Flag

To use this data structure, you need to enable the ringbuffer feature.

Implementations§

source§

impl<A, const N: usize> RingBuffer<A, N>

source

pub const CAPACITY: usize = N

The capacity of this ring buffer, as a usize.

source

pub fn new() -> Self

Construct an empty ring buffer.

source

pub fn unit(value: A) -> Self

Construct a ring buffer with a single item.

source

pub fn pair(value1: A, value2: A) -> Self

Construct a ring buffer with two items.

source

pub fn drain_from(other: &mut Self) -> Self

Construct a new ring buffer and move every item from other into the new buffer.

Time: O(n)

source

pub fn collect_from<I>(iter: &mut I, count: usize) -> Self
where I: Iterator<Item = A>,

Construct a new ring buffer and populate it by taking count items from the iterator iter.

Panics if the iterator contains less than count items.

Time: O(n)

source

pub fn from_front(other: &mut Self, count: usize) -> Self

Construct a new ring buffer and populate it by taking count items from the front of other.

Time: O(n) for the number of items moved

source

pub fn from_back(other: &mut Self, count: usize) -> Self

Construct a new ring buffer and populate it by taking count items from the back of other.

Time: O(n) for the number of items moved

source

pub fn is_full(&self) -> bool

Test if the ring buffer is full.

source

pub fn iter(&self) -> Iter<'_, A, N>

Get an iterator over references to the items in the ring buffer in order.

source

pub fn iter_mut(&mut self) -> IterMut<'_, A, N>

Get an iterator over mutable references to the items in the ring buffer in order.

source

pub fn slice<R: RangeBounds<usize>>(&self, range: R) -> Slice<'_, A, N>

Get a Slice for a subset of the ring buffer.

source

pub fn slice_mut<R: RangeBounds<usize>>( &mut self, range: R ) -> SliceMut<'_, A, N>

Get a SliceMut for a subset of the ring buffer.

source

pub unsafe fn get_unchecked(&self, index: usize) -> &A

Get an unchecked reference to the value at the given index.

Safety

You must ensure the index is not out of bounds.

source

pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut A

Get an unchecked mutable reference to the value at the given index.

Safety

You must ensure the index is not out of bounds.

source

pub fn push_back(&mut self, value: A)

Push a value to the back of the buffer.

Panics if the capacity of the buffer is exceeded.

Time: O(1)

source

pub fn push_front(&mut self, value: A)

Push a value to the front of the buffer.

Panics if the capacity of the buffer is exceeded.

Time: O(1)

source

pub fn pop_back(&mut self) -> Option<A>

Pop a value from the back of the buffer.

Returns None if the buffer is empty.

Time: O(1)

source

pub fn pop_front(&mut self) -> Option<A>

Pop a value from the front of the buffer.

Returns None if the buffer is empty.

Time: O(1)

source

pub fn drop_left(&mut self, index: usize)

Discard all items up to but not including index.

Panics if index is out of bounds.

Time: O(n) for the number of items dropped

source

pub fn drop_right(&mut self, index: usize)

Discard all items from index onward.

Panics if index is out of bounds.

Time: O(n) for the number of items dropped

source

pub fn split_off(&mut self, index: usize) -> Self

Split a buffer into two, the original buffer containing everything up to index and the returned buffer containing everything from index onwards.

Panics if index is out of bounds.

Time: O(n) for the number of items in the new buffer

source

pub fn append(&mut self, other: &mut Self)

Remove all items from other and append them to the back of self.

Panics if the capacity of self is exceeded.

other will be an empty buffer after this operation.

Time: O(n) for the number of items moved

source

pub fn drain_from_front(&mut self, other: &mut Self, count: usize)

Remove count items from the front of other and append them to the back of self.

Panics if self doesn’t have count items left, or if other has fewer than count items.

Time: O(n) for the number of items moved

source

pub fn drain_from_back(&mut self, other: &mut Self, count: usize)

Remove count items from the back of other and append them to the front of self.

Panics if self doesn’t have count items left, or if other has fewer than count items.

Time: O(n) for the number of items moved

source

pub fn insert(&mut self, index: usize, value: A)

Insert a new value at index index, shifting all the following values to the right.

Panics if the index is out of bounds.

Time: O(n) for the number of items shifted

source

pub fn insert_ordered(&mut self, value: A)
where A: Ord,

Insert a new value into the buffer in sorted order.

This assumes every element of the buffer is already in sorted order. If not, the value will still be inserted but the ordering is not guaranteed.

Time: O(log n) to find the insert position, then O(n) for the number of elements shifted.

source

pub fn insert_from<Iterable, I>(&mut self, index: usize, iter: Iterable)
where Iterable: IntoIterator<Item = A, IntoIter = I>, I: ExactSizeIterator<Item = A>,

Insert multiple values at index index, shifting all the following values to the right.

Panics if the index is out of bounds or the chunk doesn’t have room for all the values.

Time: O(m+n) where m is the number of elements inserted and n is the number of elements following the insertion index. Calling insert repeatedly would be O(m*n).

source

pub fn remove(&mut self, index: usize) -> A

Remove the value at index index, shifting all the following values to the left.

Returns the removed value.

Panics if the index is out of bounds.

Time: O(n) for the number of items shifted

source

pub fn drain(&mut self) -> Drain<'_, A, N>

Construct an iterator that drains values from the front of the buffer.

source

pub fn clear(&mut self)

Discard the contents of the buffer.

Time: O(n)

Trait Implementations§

source§

impl<'a, A, const N: usize> Arbitrary<'a> for RingBuffer<A, N>
where A: Arbitrary<'a>, BitsImpl<N>: Bits,

source§

fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self>

Generate an arbitrary value of Self from the given unstructured data. Read more
source§

fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self>

Generate an arbitrary value of Self from the entirety of the given unstructured data. Read more
source§

fn size_hint(depth: usize) -> (usize, Option<usize>)

Get a size hint for how many bytes out of an Unstructured this type needs to construct itself. Read more
source§

impl<A, const N: usize> Array for RingBuffer<A, N>

source§

fn get(&self, index: usize) -> Option<&A>

Get a reference to the value at a given index.

source§

fn first(&self) -> Option<&Self::Output>

Get a reference to the first element in the array.
source§

fn last(&self) -> Option<&Self::Output>

Get a reference to the last element in the array.
source§

fn binary_search_by<F>(&self, compare: F) -> Result<usize, usize>
where F: FnMut(&Self::Output) -> Ordering,

Perform a binary search using a comparator function.
source§

fn binary_search_by_key<K, F>( &self, key: &K, extract: F ) -> Result<usize, usize>
where F: FnMut(&Self::Output) -> K, K: Ord,

Perform a binary search using a key and a key extractor function.
source§

fn is_sorted_by<F>(&self, compare: F) -> bool
where F: FnMut(&Self::Output, &Self::Output) -> Option<Ordering>,

Test whether the array is sorted using a comparator function.
source§

fn is_sorted_by_key<K, F>(&self, extract: F) -> bool
where F: FnMut(&Self::Output) -> K, K: PartialOrd,

Test whether the array is sorted using a key extractor function.
source§

impl<A, const N: usize> ArrayMut for RingBuffer<A, N>

source§

fn get_mut(&mut self, index: usize) -> Option<&mut A>

Get a mutable reference to the value at a given index.

source§

fn first_mut(&mut self) -> Option<&mut Self::Output>

Get a mutable reference to the first element in the array.
source§

fn last_mut(&mut self) -> Option<&mut Self::Output>

Get a mutable reference to the last element in the array.
source§

fn map_pair<F, A>(&mut self, index1: usize, index2: usize, f: F) -> A
where F: FnMut(&mut Self::Output, &mut Self::Output) -> A,

Get mutable references to the elements at two indexes and call a function on them. Read more
source§

impl<A: Clone, const N: usize> Clone for RingBuffer<A, N>

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<A: Debug, const N: usize> Debug for RingBuffer<A, N>

source§

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

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

impl<A, const N: usize> Default for RingBuffer<A, N>

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<A, const N: usize> Drop for RingBuffer<A, N>

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl<'a, A: Clone + 'a, const N: usize> Extend<&'a A> for RingBuffer<A, N>

source§

fn extend<I: IntoIterator<Item = &'a A>>(&mut self, iter: I)

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
source§

impl<A, const N: usize> Extend<A> for RingBuffer<A, N>

source§

fn extend<I: IntoIterator<Item = A>>(&mut self, iter: I)

Extends a collection with the contents of an iterator. Read more
source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
source§

impl<'a, A: 'a, const N: usize> From<&'a RingBuffer<A, N>> for Slice<'a, A, N>

source§

fn from(buffer: &'a RingBuffer<A, N>) -> Self

Converts to this type from the input type.
source§

impl<'a, A: 'a, const N: usize> From<&'a mut RingBuffer<A, N>> for SliceMut<'a, A, N>

source§

fn from(buffer: &'a mut RingBuffer<A, N>) -> Self

Converts to this type from the input type.
source§

impl<A, const N: usize> FromIterator<A> for RingBuffer<A, N>

source§

fn from_iter<I: IntoIterator<Item = A>>(iter: I) -> Self

Creates a value from an iterator. Read more
source§

impl<A, const N: usize> HasLength for RingBuffer<A, N>

source§

fn len(&self) -> usize

Get the length of the ring buffer.

source§

fn is_empty(&self) -> bool

Return whether the data structure is empty.
source§

impl<A: Hash, const N: usize> Hash for RingBuffer<A, N>

source§

fn hash<H: Hasher>(&self, hasher: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<A, const N: usize> Index<usize> for RingBuffer<A, N>

§

type Output = A

The returned type after indexing.
source§

fn index(&self, index: usize) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl<A, const N: usize> IndexMut<usize> for RingBuffer<A, N>

source§

fn index_mut(&mut self, index: usize) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl<'a, A, const N: usize> IntoIterator for &'a RingBuffer<A, N>

§

type Item = &'a A

The type of the elements being iterated over.
§

type IntoIter = Iter<'a, A, N>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl<'a, A, const N: usize> IntoIterator for &'a mut RingBuffer<A, N>

§

type Item = &'a mut A

The type of the elements being iterated over.
§

type IntoIter = IterMut<'a, A, N>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl<A, const N: usize> IntoIterator for RingBuffer<A, N>

§

type Item = A

The type of the elements being iterated over.
§

type IntoIter = OwnedIter<A, N>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
source§

impl<A: Ord, const N: usize> Ord for RingBuffer<A, N>

source§

fn cmp(&self, other: &Self) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl<A, PrimSlice, const N: usize> PartialEq<PrimSlice> for RingBuffer<A, N>
where PrimSlice: Borrow<[A]>, A: PartialEq,

source§

fn eq(&self, other: &PrimSlice) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'a, A: PartialEq + 'a, const N: usize> PartialEq<RingBuffer<A, N>> for Slice<'a, A, N>

source§

fn eq(&self, other: &RingBuffer<A, N>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'a, A: PartialEq + 'a, const N: usize> PartialEq<RingBuffer<A, N>> for SliceMut<'a, A, N>

source§

fn eq(&self, other: &RingBuffer<A, N>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<A, const N: usize> PartialEq<Slice<'_, A, N>> for RingBuffer<A, N>
where A: PartialEq,

source§

fn eq(&self, other: &Slice<'_, A, N>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<A, const N: usize> PartialEq<SliceMut<'_, A, N>> for RingBuffer<A, N>
where A: PartialEq,

source§

fn eq(&self, other: &SliceMut<'_, A, N>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<A: PartialEq, const N: usize> PartialEq for RingBuffer<A, N>

source§

fn eq(&self, other: &Self) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<A: PartialOrd, const N: usize> PartialOrd for RingBuffer<A, N>

source§

fn partial_cmp(&self, other: &Self) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl<A, const N: usize> PoolClone for RingBuffer<A, N>
where A: Clone,

source§

unsafe fn clone_uninit(&self, target: &mut MaybeUninit<Self>)

Clone an instance of Self into an uninitialised instance of Self. Read more
source§

impl<A, const N: usize> PoolDefault for RingBuffer<A, N>

source§

unsafe fn default_uninit(target: &mut MaybeUninit<Self>)

Initialise an instance of Self to its default state. Read more
source§

impl<const N: usize> Read for RingBuffer<u8, N>

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
1.36.0 · source§

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

Like read, except that it reads into a slice of buffers. 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
1.0.0 · source§

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

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

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

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

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

Read the exact number of bytes required to fill buf. 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<const N: usize> Write for RingBuffer<u8, N>

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
source§

impl<A: Eq, const N: usize> Eq for RingBuffer<A, N>

Auto Trait Implementations§

§

impl<A, const N: usize> RefUnwindSafe for RingBuffer<A, N>
where A: RefUnwindSafe,

§

impl<A, const N: usize> Send for RingBuffer<A, N>
where A: Send,

§

impl<A, const N: usize> Sync for RingBuffer<A, N>
where A: Sync,

§

impl<A, const N: usize> Unpin for RingBuffer<A, N>
where A: Unpin,

§

impl<A, const N: usize> UnwindSafe for RingBuffer<A, N>
where A: 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> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.