pub struct CircularBuffer<T> { /* private fields */ }
Expand description
CircularBuffer is used to store the last elements of an endless sequence. Oldest elements will be overwritten. The implementation focus on speed. So memory allocations are avoided.
Usage example:
extern crate tui_logger;
use tui_logger::CircularBuffer;
let mut cb : CircularBuffer<u64> = CircularBuffer::new(5);
cb.push(1);
cb.push(2);
cb.push(3);
cb.push(4);
cb.push(5);
cb.push(6); // This will overwrite the first element
// Total elements pushed into the buffer is 6.
assert_eq!(6,cb.total_elements());
// Thus the buffer has wrapped around.
assert_eq!(true,cb.has_wrapped());
/// Iterate through the elements:
{
let mut iter = cb.iter();
assert_eq!(Some(&2), iter.next());
assert_eq!(Some(&3), iter.next());
assert_eq!(Some(&4), iter.next());
assert_eq!(Some(&5), iter.next());
assert_eq!(Some(&6), iter.next());
assert_eq!(None, iter.next());
}
/// Iterate backwards through the elements:
{
let mut iter = cb.rev_iter();
assert_eq!(Some(&6), iter.next());
assert_eq!(Some(&5), iter.next());
assert_eq!(Some(&4), iter.next());
assert_eq!(Some(&3), iter.next());
assert_eq!(Some(&2), iter.next());
assert_eq!(None, iter.next());
}
// The elements in the buffer are now:
assert_eq!(vec![2,3,4,5,6],cb.take());
// After taking all elements, the buffer is empty.
let now_empty : Vec<u64> = vec![];
assert_eq!(now_empty,cb.take());
Implementations§
Source§impl<T> CircularBuffer<T>
impl<T> CircularBuffer<T>
Sourcepub fn new(max_depth: usize) -> CircularBuffer<T>
pub fn new(max_depth: usize) -> CircularBuffer<T>
Create a new CircularBuffer, which can hold max_depth elements
pub fn is_empty(&self) -> bool
pub fn capacity(&self) -> usize
Sourcepub fn push(&mut self, elem: T)
pub fn push(&mut self, elem: T)
Push a new element into the buffer. Until the capacity is reached, elements are pushed. Afterwards the oldest elements will be overwritten.
Sourcepub fn take(&mut self) -> Vec<T>
pub fn take(&mut self) -> Vec<T>
Take out all elements from the buffer, leaving an empty buffer behind
Sourcepub fn total_elements(&self) -> usize
pub fn total_elements(&self) -> usize
Total number of elements pushed into the buffer.
Sourcepub fn has_wrapped(&self) -> bool
pub fn has_wrapped(&self) -> bool
If has_wrapped() is true, then elements have been overwritten
Auto Trait Implementations§
impl<T> Freeze for CircularBuffer<T>
impl<T> RefUnwindSafe for CircularBuffer<T>where
T: RefUnwindSafe,
impl<T> Send for CircularBuffer<T>where
T: Send,
impl<T> Sync for CircularBuffer<T>where
T: Sync,
impl<T> Unpin for CircularBuffer<T>where
T: Unpin,
impl<T> UnwindSafe for CircularBuffer<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more