Struct imbl_sized_chunks::ring_buffer::RingBuffer
source · 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>
impl<A, const N: usize> RingBuffer<A, N>
sourcepub fn drain_from(other: &mut Self) -> Self
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)
sourcepub fn collect_from<I>(iter: &mut I, count: usize) -> Selfwhere
I: Iterator<Item = A>,
pub fn collect_from<I>(iter: &mut I, count: usize) -> Selfwhere
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)
sourcepub fn from_front(other: &mut Self, count: usize) -> Self
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
sourcepub fn from_back(other: &mut Self, count: usize) -> Self
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
sourcepub fn iter(&self) -> Iter<'_, A, N> ⓘ
pub fn iter(&self) -> Iter<'_, A, N> ⓘ
Get an iterator over references to the items in the ring buffer in order.
sourcepub fn iter_mut(&mut self) -> IterMut<'_, A, N> ⓘ
pub fn iter_mut(&mut self) -> IterMut<'_, A, N> ⓘ
Get an iterator over mutable references to the items in the ring buffer in order.
sourcepub fn slice<R: RangeBounds<usize>>(&self, range: R) -> Slice<'_, A, N>
pub fn slice<R: RangeBounds<usize>>(&self, range: R) -> Slice<'_, A, N>
Get a Slice
for a subset of the ring buffer.
sourcepub fn slice_mut<R: RangeBounds<usize>>(
&mut self,
range: R
) -> SliceMut<'_, A, N>
pub fn slice_mut<R: RangeBounds<usize>>( &mut self, range: R ) -> SliceMut<'_, A, N>
Get a SliceMut
for a subset of the ring buffer.
sourcepub unsafe fn get_unchecked(&self, index: usize) -> &A
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.
sourcepub unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut A
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.
sourcepub fn push_back(&mut self, value: A)
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)
sourcepub fn push_front(&mut self, value: A)
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)
sourcepub fn pop_back(&mut self) -> Option<A>
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)
sourcepub fn pop_front(&mut self) -> Option<A>
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)
sourcepub fn drop_left(&mut self, index: usize)
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
sourcepub fn drop_right(&mut self, index: usize)
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
sourcepub fn split_off(&mut self, index: usize) -> Self
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
sourcepub fn append(&mut self, other: &mut Self)
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
sourcepub fn drain_from_front(&mut self, other: &mut Self, count: usize)
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
sourcepub fn drain_from_back(&mut self, other: &mut Self, count: usize)
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
sourcepub fn insert(&mut self, index: usize, value: A)
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
sourcepub fn insert_ordered(&mut self, value: A)where
A: Ord,
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.
sourcepub fn insert_from<Iterable, I>(&mut self, index: usize, iter: Iterable)where
Iterable: IntoIterator<Item = A, IntoIter = I>,
I: ExactSizeIterator<Item = A>,
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).
sourcepub fn remove(&mut self, index: usize) -> A
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
Trait Implementations§
source§impl<'a, A, const N: usize> Arbitrary<'a> for RingBuffer<A, N>
impl<'a, A, const N: usize> Arbitrary<'a> for RingBuffer<A, N>
source§fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self>
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self>
Self
from the given unstructured data. Read moresource§fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self>
fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self>
Self
from the entirety of the given
unstructured data. Read moresource§impl<A, const N: usize> Array for RingBuffer<A, N>
impl<A, const N: usize> Array for RingBuffer<A, N>
source§fn binary_search_by<F>(&self, compare: F) -> Result<usize, usize>
fn binary_search_by<F>(&self, compare: F) -> Result<usize, usize>
source§fn binary_search_by_key<K, F>(
&self,
key: &K,
extract: F
) -> Result<usize, usize>
fn binary_search_by_key<K, F>( &self, key: &K, extract: F ) -> Result<usize, usize>
source§fn is_sorted_by<F>(&self, compare: F) -> bool
fn is_sorted_by<F>(&self, compare: F) -> bool
source§fn is_sorted_by_key<K, F>(&self, extract: F) -> bool
fn is_sorted_by_key<K, F>(&self, extract: F) -> bool
source§impl<A, const N: usize> ArrayMut for RingBuffer<A, N>
impl<A, const N: usize> ArrayMut for RingBuffer<A, N>
source§fn get_mut(&mut self, index: usize) -> Option<&mut A>
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>
fn first_mut(&mut self) -> Option<&mut Self::Output>
source§impl<A, const N: usize> Default for RingBuffer<A, N>
impl<A, const N: usize> Default for RingBuffer<A, N>
source§impl<A, const N: usize> Drop for RingBuffer<A, N>
impl<A, const N: usize> Drop for RingBuffer<A, N>
source§impl<'a, A: Clone + 'a, const N: usize> Extend<&'a A> for RingBuffer<A, N>
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)
fn extend<I: IntoIterator<Item = &'a A>>(&mut self, iter: I)
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)source§impl<A, const N: usize> Extend<A> for RingBuffer<A, N>
impl<A, const N: usize> Extend<A> for RingBuffer<A, N>
source§fn extend<I: IntoIterator<Item = A>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = A>>(&mut self, iter: I)
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)source§impl<'a, A: 'a, const N: usize> From<&'a RingBuffer<A, N>> for Slice<'a, A, N>
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
fn from(buffer: &'a RingBuffer<A, N>) -> Self
source§impl<'a, A: 'a, const N: usize> From<&'a mut RingBuffer<A, N>> for SliceMut<'a, A, N>
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
fn from(buffer: &'a mut RingBuffer<A, N>) -> Self
source§impl<A, const N: usize> FromIterator<A> for RingBuffer<A, N>
impl<A, const N: usize> FromIterator<A> for RingBuffer<A, N>
source§fn from_iter<I: IntoIterator<Item = A>>(iter: I) -> Self
fn from_iter<I: IntoIterator<Item = A>>(iter: I) -> Self
source§impl<A, const N: usize> HasLength for RingBuffer<A, N>
impl<A, const N: usize> HasLength for RingBuffer<A, N>
source§impl<'a, A, const N: usize> IntoIterator for &'a RingBuffer<A, N>
impl<'a, A, const N: usize> IntoIterator for &'a RingBuffer<A, N>
source§impl<'a, A, const N: usize> IntoIterator for &'a mut RingBuffer<A, N>
impl<'a, A, const N: usize> IntoIterator for &'a mut RingBuffer<A, N>
source§impl<A, const N: usize> IntoIterator for RingBuffer<A, N>
impl<A, const N: usize> IntoIterator for RingBuffer<A, N>
source§impl<A: Ord, const N: usize> Ord for RingBuffer<A, N>
impl<A: Ord, const N: usize> Ord for RingBuffer<A, N>
source§impl<A, PrimSlice, const N: usize> PartialEq<PrimSlice> for RingBuffer<A, N>
impl<A, PrimSlice, const N: usize> PartialEq<PrimSlice> for RingBuffer<A, N>
source§fn eq(&self, other: &PrimSlice) -> bool
fn eq(&self, other: &PrimSlice) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<'a, A: PartialEq + 'a, const N: usize> PartialEq<RingBuffer<A, N>> for Slice<'a, A, N>
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
fn eq(&self, other: &RingBuffer<A, N>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<'a, A: PartialEq + 'a, const N: usize> PartialEq<RingBuffer<A, N>> for SliceMut<'a, A, N>
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
fn eq(&self, other: &RingBuffer<A, N>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<A, const N: usize> PartialEq<Slice<'_, A, N>> for RingBuffer<A, N>where
A: PartialEq,
impl<A, const N: usize> PartialEq<Slice<'_, A, N>> for RingBuffer<A, N>where
A: PartialEq,
source§impl<A, const N: usize> PartialEq<SliceMut<'_, A, N>> for RingBuffer<A, N>where
A: PartialEq,
impl<A, const N: usize> PartialEq<SliceMut<'_, A, N>> for RingBuffer<A, N>where
A: PartialEq,
source§impl<A: PartialEq, const N: usize> PartialEq for RingBuffer<A, N>
impl<A: PartialEq, const N: usize> PartialEq for RingBuffer<A, N>
source§impl<A: PartialOrd, const N: usize> PartialOrd for RingBuffer<A, N>
impl<A: PartialOrd, const N: usize> PartialOrd for RingBuffer<A, N>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read moresource§impl<A, const N: usize> PoolClone for RingBuffer<A, N>where
A: Clone,
impl<A, const N: usize> PoolClone for RingBuffer<A, N>where
A: Clone,
source§unsafe fn clone_uninit(&self, target: &mut MaybeUninit<Self>)
unsafe fn clone_uninit(&self, target: &mut MaybeUninit<Self>)
source§impl<A, const N: usize> PoolDefault for RingBuffer<A, N>
impl<A, const N: usize> PoolDefault for RingBuffer<A, N>
source§unsafe fn default_uninit(target: &mut MaybeUninit<Self>)
unsafe fn default_uninit(target: &mut MaybeUninit<Self>)
Self
to its default state. Read moresource§impl<const N: usize> Read for RingBuffer<u8, N>
impl<const N: usize> Read for RingBuffer<u8, N>
source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
1.36.0 · source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
read
, except that it reads into a slice of buffers. Read moresource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector
)1.0.0 · source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
buf
. Read more1.0.0 · source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
buf
. Read more1.6.0 · source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
buf
. Read moresource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf
)source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf
)cursor
. Read more1.0.0 · source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read
. Read moresource§impl<const N: usize> Write for RingBuffer<u8, N>
impl<const N: usize> Write for RingBuffer<u8, N>
source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector
)1.0.0 · source§fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
write_all_vectored
)