[][src]Struct slice_ring_buf::SliceRB

pub struct SliceRB<T: Copy + Clone + Default> { /* fields omitted */ }

A fast ring buffer implementation optimized for working with slices. Copies/reads with slices are implemented with memcpy.

Implementations

impl<T: Copy + Clone + Default> SliceRB<T>[src]

pub fn from_len(len: usize) -> Self[src]

Creates a new SliceRB. All data will be initialized with the default value.

  • len - The length of the ring buffer.

Example

use slice_ring_buf::SliceRB;

let rb = SliceRB::<u32>::from_len(3);

assert_eq!(rb.len(), 3);

assert_eq!(rb[0], 0);
assert_eq!(rb[1], 0);
assert_eq!(rb[2], 0);

Panics

  • This will panic if len = 0.
  • This will panic if this tries to allocate more than isize::MAX bytes.

pub unsafe fn from_len_uninit(len: usize) -> Self[src]

Creates a new SliceRB without initializing data.

  • len - The length of the ring buffer.

Safety

  • Undefined behavior may occur if uninitialized data is read from. By using this you assume the responsibility of making sure any data is initialized before it is read.

Example

use slice_ring_buf::SliceRB;

unsafe {
    let rb = SliceRB::<u32>::from_len(3);
    assert_eq!(rb.len(), 3);
}

Panics

  • This will panic if len = 0.
  • This will panic if this tries to allocate more than isize::MAX bytes.

pub fn clear_set_len(&mut self, len: usize)[src]

Sets the length of the ring buffer while clearing all values to the default value.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(2);
rb[0] = 1;
rb[1] = 2;

rb.clear_set_len(4);

assert_eq!(rb.len(), 4);

assert_eq!(rb[0], 0);
assert_eq!(rb[1], 0);
assert_eq!(rb[2], 0);
assert_eq!(rb[3], 0);

Panics

  • This will panic if len = 0.
  • This will panic if this tries to allocate more than isize::MAX bytes.

pub fn set_len(&mut self, len: usize)[src]

Sets the length of the ring buffer.

  • If len is less than the current length, then the data will be truncated.
  • If len is larger than the current length, then all newly allocated elements appended to the end will be initialized with the default value.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(2);
rb[0] = 1;
rb[1] = 2;

rb.set_len(4);

assert_eq!(rb.len(), 4);

assert_eq!(rb[0], 1);
assert_eq!(rb[1], 2);
assert_eq!(rb[2], 0);
assert_eq!(rb[3], 0);

Panics

  • This will panic if len = 0.
  • This will panic if this tries to allocate more than isize::MAX bytes.

pub unsafe fn set_len_uninit(&mut self, len: usize)[src]

Sets the length of the ring buffer without initializing any newly allocated data.

  • If len is less than the current length, then the data will be truncated.
  • If len is larger than the current length, then all newly allocated elements appended to the end will be unitialized.

Safety

  • Undefined behavior may occur if uninitialized data is read from. By using this you assume the responsibility of making sure any data is initialized before it is read.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(2);
rb[0] = 1;
rb[1] = 2;

unsafe {
    rb.set_len_uninit(4);

    assert_eq!(rb.len(), 4);

    assert_eq!(rb[0], 1);
    assert_eq!(rb[1], 2);
}

Panics

  • This will panic if len = 0.
  • This will panic if this tries to allocate more than isize::MAX bytes.

pub fn clear(&mut self)[src]

Clears all values in the ring buffer to the default value.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(2);
rb[0] = 1;
rb[1] = 2;

rb.clear();

assert_eq!(rb[0], 0);
assert_eq!(rb[1], 0);

pub fn as_slices(&self, start: isize) -> (&[T], &[T])[src]

Returns two slices that contain all the data in the ring buffer starting at the index start.

Returns

  • The first slice is the starting chunk of data. This will never be empty.
  • The second slice is the second contiguous chunk of data. This may or may not be empty depending if the buffer needed to wrap around to the beginning of its internal memory layout.

Performance

Prefer to use this to manipulate data in bulk over reading individual elements one at a time. If you need to index multiple elements one at a time, prefer to use SliceRB::at(&mut i) over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(4);
rb[0] = 1;
rb[1] = 2;
rb[2] = 3;
rb[3] = 4;

let (s1, s2) = rb.as_slices(-4);
assert_eq!(s1, &[1, 2, 3, 4]);
assert_eq!(s2, &[]);

let (s1, s2) = rb.as_slices(3);
assert_eq!(s1, &[4]);
assert_eq!(s2, &[1, 2, 3]);

pub fn as_slices_len(&self, start: isize, len: usize) -> (&[T], &[T])[src]

Returns two slices of data in the ring buffer starting at the index start and with length len.

  • start - The starting index
  • len - The length of data to read. If len is greater than the length of the ring buffer, then that length will be used instead.

Returns

  • The first slice is the starting chunk of data.
  • The second slice is the second contiguous chunk of data. This may or may not be empty depending if the buffer needed to wrap around to the beginning of its internal memory layout.

Performance

Prefer to use this to manipulate data in bulk over reading individual elements one at a time. If you need to index multiple elements one at a time, prefer to use SliceRB::at(&mut i) over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(4);
rb[0] = 1;
rb[1] = 2;
rb[2] = 3;
rb[3] = 4;

let (s1, s2) = rb.as_slices_len(-4, 3);
assert_eq!(s1, &[1, 2, 3]);
assert_eq!(s2, &[]);

let (s1, s2) = rb.as_slices_len(3, 5);
assert_eq!(s1, &[4]);
assert_eq!(s2, &[1, 2, 3]);

pub fn as_mut_slices(&mut self, start: isize) -> (&mut [T], &mut [T])[src]

Returns two mutable slices that contain all the data in the ring buffer starting at the index start.

Returns

  • The first slice is the starting chunk of data. This will never be empty.
  • The second slice is the second contiguous chunk of data. This may or may not be empty depending if the buffer needed to wrap around to the beginning of its internal memory layout.

Performance

Prefer to use this to manipulate data in bulk over accessing individual elements one at a time. If you need to index multiple elements one at a time, prefer to use SliceRB::at(&mut i) over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(4);
rb[0] = 1;
rb[1] = 2;
rb[2] = 3;
rb[3] = 4;

let (s1, s2) = rb.as_mut_slices(-4);
assert_eq!(s1, &mut [1, 2, 3, 4]);
assert_eq!(s2, &mut []);

let (s1, s2) = rb.as_mut_slices(3);
assert_eq!(s1, &mut [4]);
assert_eq!(s2, &mut [1, 2, 3]);

pub fn as_mut_slices_len(
    &mut self,
    start: isize,
    len: usize
) -> (&mut [T], &mut [T])
[src]

Returns two mutable slices of data in the ring buffer starting at the index start and with length len.

  • start - The starting index
  • len - The length of data to read. If len is greater than the length of the ring buffer, then that length will be used instead.

Returns

  • The first slice is the starting chunk of data.
  • The second slice is the second contiguous chunk of data. This may or may not be empty depending if the buffer needed to wrap around to the beginning of its internal memory layout.

Performance

Prefer to use this to manipulate data in bulk over accessing individual elements one at a time. If you need to index multiple elements one at a time, prefer to use SliceRB::at(&mut i) over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(4);
rb[0] = 1;
rb[1] = 2;
rb[2] = 3;
rb[3] = 4;

let (s1, s2) = rb.as_mut_slices_len(-4, 3);
assert_eq!(s1, &mut [1, 2, 3]);
assert_eq!(s2, &mut []);

let (s1, s2) = rb.as_mut_slices_len(3, 5);
assert_eq!(s1, &mut [4]);
assert_eq!(s2, &mut [1, 2, 3]);

pub fn read_into(&self, slice: &mut [T], start: isize)[src]

Copies the data from the ring buffer starting from the index start into the given slice. If the length of slice is larger than the length of the ring buffer, then the data will be reapeated until the given slice is filled.

  • slice - This slice to copy the data into.
  • start - The index of the ring buffer to start copying from.

Performance

Prefer to use this to manipulate data in bulk over accessing individual elements one at a time. If you need to index multiple elements one at a time, prefer to use SliceRB::at(&mut i) over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(4);
rb[0] = 1;
rb[1] = 2;
rb[2] = 3;
rb[3] = 4;

let mut read_buf = [0u32; 3];
rb.read_into(&mut read_buf[..], -3);
assert_eq!(read_buf, [2, 3, 4]);

let mut read_buf = [0u32; 9];
rb.read_into(&mut read_buf[..], 2);
assert_eq!(read_buf, [3, 4, 1, 2, 3, 4, 1, 2, 3]);

pub fn write_latest(&mut self, slice: &[T], start: isize)[src]

Copies data from the given slice into the ring buffer starting from the index start.

Earlier data will not be copied if it will be overwritten by newer data, avoiding unecessary memcpy's. The correct placement of the newer data will still be preserved.

  • slice - This slice to copy data from.
  • start - The index of the ring buffer to start copying from.

Performance

Prefer to use this to manipulate data in bulk over accessing individual elements one at a time. If you need to index multiple elements one at a time, prefer to use SliceRB::at(&mut i) over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;

let mut rb = SliceRB::<u32>::from_len(4);

let input = [1u32, 2, 3];
rb.write_latest(&input[..], -3);
assert_eq!(rb[0], 0);
assert_eq!(rb[1], 1);
assert_eq!(rb[2], 2);
assert_eq!(rb[3], 3);

let input = [1u32, 2, 3, 4, 5, 6, 7, 8, 9];
rb.write_latest(&input[..], 2);
assert_eq!(rb[0], 7);
assert_eq!(rb[1], 8);
assert_eq!(rb[2], 9);
assert_eq!(rb[3], 6);

pub fn write_latest_2(&mut self, first: &[T], second: &[T], start: isize)[src]

Copies data from two given slices into the ring buffer starting from the index start. The first slice will be copied first then second will be copied next.

Earlier data will not be copied if it will be overwritten by newer data, avoiding unecessary memcpy's. The correct placement of the newer data will still be preserved.

  • first - This first slice to copy data from.
  • second - This second slice to copy data from.
  • start - The index of the ring buffer to start copying from.

Performance

Prefer to use this to manipulate data in bulk over accessing individual elements one at a time. If you need to index multiple elements one at a time, prefer to use SliceRB::at(&mut i) over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;

let mut input_rb = SliceRB::<u32>::from_len(4);
input_rb[0] = 1;
input_rb[1] = 2;
input_rb[2] = 3;
input_rb[3] = 4;

let mut output_rb = SliceRB::<u32>::from_len(4);
// s1 == &[1, 2], s2 == &[]
let (s1, s2) = input_rb.as_slices_len(0, 2);
output_rb.write_latest_2(s1, s2, -3);
assert_eq!(output_rb[0], 0);
assert_eq!(output_rb[1], 1);
assert_eq!(output_rb[2], 2);
assert_eq!(output_rb[3], 0);

let mut output_rb = SliceRB::<u32>::from_len(2);
// s1 == &[4],  s2 == &[1, 2, 3]
let (s1, s2) = input_rb.as_slices_len(3, 4);
// rb[1] = 4  ->  rb[0] = 1  ->  rb[1] = 2  ->  rb[0] = 3
output_rb.write_latest_2(s1, s2, 1);
assert_eq!(output_rb[0], 3);
assert_eq!(output_rb[1], 2);

pub fn len(&self) -> usize[src]

Returns the length of the ring buffer.

Example

use slice_ring_buf::SliceRB;
let rb = SliceRB::<u32>::from_len(4);

assert_eq!(rb.len(), 4);

pub fn capacity(&self) -> usize[src]

Returns the allocated capacity of the internal vector.

Example

use slice_ring_buf::SliceRB;
let rb = SliceRB::<u32>::from_len(4);

assert!(rb.capacity() >= 4);

pub fn constrain(&self, i: isize) -> isize[src]

Returns the actual index of the ring buffer from the given i index.

  • First, a bounds check will be performed. If it is within bounds, then it is simply returned.
  • If it is not in bounds, then performance will be limited by the modulo (remainder) operation on an isize value.

Performance

Prefer to manipulate data in bulk with methods that return slices. If you need to index multiple elements one at a time, prefer to use SliceRB::at(&mut i) over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;
let rb = SliceRB::<u32>::from_len(4);

assert_eq!(rb.constrain(2), 2);
assert_eq!(rb.constrain(4), 0);
assert_eq!(rb.constrain(-3), 1);
assert_eq!(rb.constrain(7), 3);

pub fn raw_data(&self) -> &[T][src]

Returns all the data in the buffer. The starting index will always be 0.

Example

use slice_ring_buf::SliceRB;
let mut rb = SliceRB::<u32>::from_len(4);
rb[0] = 1;
rb[1] = 2;
rb[2] = 3;
rb[3] = 4;

let raw_data = rb.raw_data();
assert_eq!(raw_data, &[1u32, 2, 3, 4]);

pub fn raw_data_mut(&mut self) -> &mut [T][src]

Returns all the data in the buffer as mutable. The starting index will always be 0.

Example

use slice_ring_buf::SliceRB;
let mut rb = SliceRB::<u32>::from_len(4);
rb[0] = 1;
rb[1] = 2;
rb[2] = 3;
rb[3] = 4;

let raw_data = rb.raw_data_mut();
assert_eq!(raw_data, &mut [1u32, 2, 3, 4]);

pub fn raw_at(&self, i: usize) -> &T[src]

Returns the element at the index of type usize.

Please note this does NOT wrap around. This is equivalent to indexing a normal Vec.

Example

use slice_ring_buf::SliceRB;
let mut rb = SliceRB::<u32>::from_len(4);
rb[0] = 1;
rb[3] = 4;

assert_eq!(*rb.raw_at(0), 1);
assert_eq!(*rb.raw_at(3), 4);

// These will panic!
// assert_eq!(*rb.raw_at(-3), 2);
// assert_eq!(*rb.raw_at(4), 1);

Panics

  • This will panic if i is out of bounds of the internal Vec.

pub fn raw_at_mut(&mut self, i: usize) -> &mut T[src]

Returns the element at the index of type usize as mutable.

Please note this does NOT wrap around. This is equivalent to indexing a normal Vec.

Example

use slice_ring_buf::SliceRB;
let mut rb = SliceRB::<u32>::from_len(4);

*rb.raw_at_mut(0) = 1;
*rb.raw_at_mut(3) = 4;

assert_eq!(rb[0], 1);
assert_eq!(rb[3], 4);

// These will panic!
// *rb.raw_at_mut(-3) = 2;
// *rb.raw_at_mut(4) = 1;

Panics

  • This will panic if i is out of bounds of the internal Vec.

pub fn at(&self, i: &mut isize) -> &T[src]

Returns the element at the index of type usize while also constraining the index i. This is more efficient than calling both methods individually.

Performance

Prefer to manipulate data in bulk with methods that return slices. If you need to index multiple elements one at a time, prefer to use this over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;
let mut rb = SliceRB::<u32>::from_len(4);
rb[0] = 1;
rb[1] = 2;
rb[2] = 3;
rb[3] = 4;

let mut i = -3;
assert_eq!(*rb.at(&mut i), 2);
assert_eq!(i, 1);

pub fn at_mut(&mut self, i: &mut isize) -> &mut T[src]

Returns the element at the index of type usize as mutable while also constraining the index i. This is more efficient than calling both methods individually.

Performance

Prefer to manipulate data in bulk with methods that return slices. If you need to index multiple elements one at a time, prefer to use this over SliceRB[i] to reduce the number of modulo operations to perform.

Example

use slice_ring_buf::SliceRB;
let mut rb = SliceRB::<u32>::from_len(4);

let mut i = -3;
*rb.at_mut(&mut i) = 2;

assert_eq!(rb[1], 2);
assert_eq!(i, 1);

Trait Implementations

impl<T: Clone + Copy + Default> Clone for SliceRB<T>[src]

impl<T: Debug + Copy + Clone + Default> Debug for SliceRB<T>[src]

impl<T: Copy + Clone + Default> Index<isize> for SliceRB<T>[src]

type Output = T

The returned type after indexing.

impl<T: Copy + Clone + Default> IndexMut<isize> for SliceRB<T>[src]

Auto Trait Implementations

impl<T> RefUnwindSafe for SliceRB<T> where
    T: RefUnwindSafe

impl<T> Send for SliceRB<T> where
    T: Send

impl<T> Sync for SliceRB<T> where
    T: Sync

impl<T> Unpin for SliceRB<T> where
    T: Unpin

impl<T> UnwindSafe for SliceRB<T> where
    T: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.