#[derive(Debug)]
pub struct BMRingBufRef<'a, T: Copy + Clone + Default> {
data: &'a mut [T],
mask: isize,
}
impl<'a, T: Copy + Clone + Default> BMRingBufRef<'a, T> {
pub fn new(slice: &'a mut [T]) -> Self {
assert_eq!(slice.len(), crate::next_pow_of_2(slice.len()));
let mask = (slice.len() as isize) - 1;
Self { data: slice, mask }
}
pub fn clear(&mut self) {
for n in self.data.iter_mut() {
*n = Default::default();
}
}
pub fn as_slices(&self, start: isize) -> (&[T], &[T]) {
let start = self.constrain(start) as usize;
unsafe {
let self_data_ptr = self.data.as_ptr();
(
&*std::ptr::slice_from_raw_parts(self_data_ptr.add(start), self.data.len() - start),
&*std::ptr::slice_from_raw_parts(self_data_ptr, start),
)
}
}
pub fn as_slices_len(&self, start: isize, len: usize) -> (&[T], &[T]) {
let start = self.constrain(start) as usize;
unsafe {
let self_data_ptr = self.data.as_ptr();
let first_portion_len = self.data.len() - start;
if len > first_portion_len {
let second_portion_len = std::cmp::min(len - first_portion_len, start);
(
&*std::ptr::slice_from_raw_parts(self_data_ptr.add(start), first_portion_len),
&*std::ptr::slice_from_raw_parts(self_data_ptr, second_portion_len),
)
} else {
(
&*std::ptr::slice_from_raw_parts(self_data_ptr.add(start), len),
&[],
)
}
}
}
pub fn as_slices_latest(&self, start: isize, len: usize) -> (&[T], &[T]) {
let mut start = self.constrain(start) as usize;
unsafe {
let self_data_ptr = self.data.as_ptr();
let mut first_portion_len = self.data.len() - start;
if len > first_portion_len {
let second_portion_len = if len > self.data.len() {
let end_index = (start + len) as isize;
start = self.constrain(end_index - self.data.len() as isize) as usize;
first_portion_len = self.data.len() - start;
start
} else {
std::cmp::min(len - first_portion_len, start)
};
(
&*std::ptr::slice_from_raw_parts(self_data_ptr.add(start), first_portion_len),
&*std::ptr::slice_from_raw_parts(self_data_ptr, second_portion_len),
)
} else {
(
&*std::ptr::slice_from_raw_parts(self_data_ptr.add(start), len),
&[],
)
}
}
}
pub fn as_mut_slices(&mut self, start: isize) -> (&mut [T], &mut [T]) {
let start = self.constrain(start) as usize;
unsafe {
let self_data_ptr = self.data.as_mut_ptr();
(
&mut *std::ptr::slice_from_raw_parts_mut(
self_data_ptr.add(start),
self.data.len() - start,
),
&mut *std::ptr::slice_from_raw_parts_mut(self_data_ptr, start),
)
}
}
pub fn as_mut_slices_len(&mut self, start: isize, len: usize) -> (&mut [T], &mut [T]) {
let start = self.constrain(start) as usize;
unsafe {
let self_data_ptr = self.data.as_mut_ptr();
let first_portion_len = self.data.len() - start;
if len > first_portion_len {
let second_portion_len = std::cmp::min(len - first_portion_len, start);
(
&mut *std::ptr::slice_from_raw_parts_mut(
self_data_ptr.add(start),
first_portion_len,
),
&mut *std::ptr::slice_from_raw_parts_mut(self_data_ptr, second_portion_len),
)
} else {
(
&mut *std::ptr::slice_from_raw_parts_mut(self_data_ptr.add(start), len),
&mut [],
)
}
}
}
pub fn as_mut_slices_latest(&mut self, start: isize, len: usize) -> (&mut [T], &mut [T]) {
let mut start = self.constrain(start) as usize;
unsafe {
let self_data_ptr = self.data.as_mut_ptr();
let mut first_portion_len = self.data.len() - start;
if len > first_portion_len {
let second_portion_len = if len > self.data.len() {
let end_index = (start + len) as isize;
start = self.constrain(end_index - self.data.len() as isize) as usize;
first_portion_len = self.data.len() - start;
start
} else {
std::cmp::min(len - first_portion_len, start)
};
(
&mut *std::ptr::slice_from_raw_parts_mut(
self_data_ptr.add(start),
first_portion_len,
),
&mut *std::ptr::slice_from_raw_parts_mut(self_data_ptr, second_portion_len),
)
} else {
(
&mut *std::ptr::slice_from_raw_parts_mut(self_data_ptr.add(start), len),
&mut [],
)
}
}
}
pub fn read_into(&self, slice: &mut [T], start: isize) {
let start = self.constrain(start) as usize;
unsafe {
let self_data_ptr = self.data.as_ptr();
let mut slice_ptr = slice.as_mut_ptr();
let mut slice_len = slice.len();
let first_portion_len = self.data.len() - start;
while slice_len > first_portion_len {
std::ptr::copy_nonoverlapping(
self_data_ptr.add(start),
slice_ptr,
first_portion_len,
);
slice_ptr = slice_ptr.add(first_portion_len);
slice_len -= first_portion_len;
let second_portion_len = std::cmp::min(slice_len, start);
std::ptr::copy_nonoverlapping(self_data_ptr, slice_ptr, second_portion_len);
slice_ptr = slice_ptr.add(second_portion_len);
slice_len -= second_portion_len;
}
std::ptr::copy_nonoverlapping(self_data_ptr.add(start), slice_ptr, slice_len);
}
}
pub fn write_latest(&mut self, slice: &[T], start: isize) {
let (slice, start_i) = if slice.len() > self.data.len() {
let end_i = start + slice.len() as isize;
(
&slice[slice.len() - self.data.len()..],
self.constrain(end_i - self.data.len() as isize) as usize,
)
} else {
(&slice[..], self.constrain(start) as usize)
};
unsafe {
let slice_ptr = slice.as_ptr();
let self_data_ptr = self.data.as_mut_ptr();
if start_i + slice.len() > self.data.len() {
let first_portion_len = self.data.len() - start_i;
std::ptr::copy_nonoverlapping(
slice_ptr,
self_data_ptr.add(start_i),
first_portion_len,
);
let second_portion_len = slice.len() - first_portion_len;
std::ptr::copy_nonoverlapping(
slice_ptr.add(first_portion_len),
self_data_ptr,
second_portion_len,
);
} else {
std::ptr::copy_nonoverlapping(slice_ptr, self_data_ptr.add(start_i), slice.len());
}
}
}
pub fn write_latest_2(&mut self, first: &[T], second: &[T], start: isize) {
if first.len() + second.len() <= self.data.len() {
self.write_latest(first, start);
} else if second.len() < self.data.len() {
let first_end_part_len = self.data.len() - second.len();
let first_end_part_start = first.len() - first_end_part_len;
let first_end_part = &first[first_end_part_start..];
self.write_latest(first_end_part, start + first_end_part_start as isize);
}
self.write_latest(second, start + first.len() as isize);
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn constrain(&self, i: isize) -> isize {
i & self.mask
}
pub fn raw_data(&self) -> &[T] {
self.data
}
pub fn raw_data_mut(&mut self) -> &mut [T] {
self.data
}
#[inline]
pub fn raw_at(&self, i: usize) -> &T {
&self.data[i]
}
#[inline]
pub fn raw_at_mut(&mut self, i: usize) -> &mut T {
&mut self.data[i]
}
#[inline]
pub fn at(&self, i: &mut isize) -> &T {
*i = *i & self.mask;
unsafe { &*self.data.as_ptr().offset(*i) }
}
#[inline]
pub fn at_mut(&mut self, i: &mut isize) -> &mut T {
*i = *i & self.mask;
unsafe { &mut *self.data.as_mut_ptr().offset(*i) }
}
}
impl<'a, T: Copy + Clone + Default> std::ops::Index<isize> for BMRingBufRef<'a, T> {
type Output = T;
fn index(&self, i: isize) -> &T {
unsafe { &*self.data.as_ptr().offset(i & self.mask) }
}
}
impl<'a, T: Copy + Clone + Default> std::ops::IndexMut<isize> for BMRingBufRef<'a, T> {
fn index_mut(&mut self, i: isize) -> &mut T {
unsafe { &mut *self.data.as_mut_ptr().offset(i & self.mask) }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn bit_mask_ring_buf_ref_initialize() {
let mut data = [0.0; 4];
let ring_buf = BMRingBufRef::new(&mut data);
assert_eq!(&ring_buf.data[..], &[0.0, 0.0, 0.0, 0.0]);
}
#[test]
fn bit_mask_ring_buf_ref_constrain() {
let mut data = [0.0; 4];
let ring_buf = BMRingBufRef::new(&mut data);
assert_eq!(&ring_buf.data[..], &[0.0, 0.0, 0.0, 0.0]);
assert_eq!(ring_buf.constrain(-8), 0);
assert_eq!(ring_buf.constrain(-7), 1);
assert_eq!(ring_buf.constrain(-6), 2);
assert_eq!(ring_buf.constrain(-5), 3);
assert_eq!(ring_buf.constrain(-4), 0);
assert_eq!(ring_buf.constrain(-3), 1);
assert_eq!(ring_buf.constrain(-2), 2);
assert_eq!(ring_buf.constrain(-1), 3);
assert_eq!(ring_buf.constrain(0), 0);
assert_eq!(ring_buf.constrain(1), 1);
assert_eq!(ring_buf.constrain(2), 2);
assert_eq!(ring_buf.constrain(3), 3);
assert_eq!(ring_buf.constrain(4), 0);
assert_eq!(ring_buf.constrain(5), 1);
assert_eq!(ring_buf.constrain(6), 2);
assert_eq!(ring_buf.constrain(7), 3);
assert_eq!(ring_buf.constrain(8), 0);
}
#[test]
fn bit_mask_ring_buf_ref_clear() {
let mut data = [0.0; 4];
let mut ring_buf = BMRingBufRef::new(&mut data);
assert_eq!(&ring_buf.data[..], &[0.0, 0.0, 0.0, 0.0]);
ring_buf.write_latest(&[1.0f32, 2.0, 3.0, 4.0], 0);
assert_eq!(ring_buf.data, &[1.0, 2.0, 3.0, 4.0]);
ring_buf.clear();
assert_eq!(ring_buf.data, &[0.0, 0.0, 0.0, 0.0]);
}
#[test]
fn bit_mask_ring_buf_ref_index() {
let mut data = [0.0f32, 1.0, 2.0, 3.0];
let ring_buf = BMRingBufRef::new(&mut data);
let ring_buf = &ring_buf;
assert_eq!(ring_buf[-8], 0.0);
assert_eq!(ring_buf[-7], 1.0);
assert_eq!(ring_buf[-6], 2.0);
assert_eq!(ring_buf[-5], 3.0);
assert_eq!(ring_buf[-4], 0.0);
assert_eq!(ring_buf[-3], 1.0);
assert_eq!(ring_buf[-2], 2.0);
assert_eq!(ring_buf[-1], 3.0);
assert_eq!(ring_buf[0], 0.0);
assert_eq!(ring_buf[1], 1.0);
assert_eq!(ring_buf[2], 2.0);
assert_eq!(ring_buf[3], 3.0);
assert_eq!(ring_buf[4], 0.0);
assert_eq!(ring_buf[5], 1.0);
assert_eq!(ring_buf[6], 2.0);
assert_eq!(ring_buf[7], 3.0);
assert_eq!(ring_buf[8], 0.0);
}
#[test]
fn bit_mask_ring_buf_ref_index_mut() {
let mut data = [0.0f32, 1.0, 2.0, 3.0];
let mut ring_buf = BMRingBufRef::new(&mut data);
assert_eq!(&mut ring_buf[-8], &mut 0.0);
assert_eq!(&mut ring_buf[-7], &mut 1.0);
assert_eq!(&mut ring_buf[-6], &mut 2.0);
assert_eq!(&mut ring_buf[-5], &mut 3.0);
assert_eq!(&mut ring_buf[-4], &mut 0.0);
assert_eq!(&mut ring_buf[-3], &mut 1.0);
assert_eq!(&mut ring_buf[-2], &mut 2.0);
assert_eq!(&mut ring_buf[-1], &mut 3.0);
assert_eq!(&mut ring_buf[0], &mut 0.0);
assert_eq!(&mut ring_buf[1], &mut 1.0);
assert_eq!(&mut ring_buf[2], &mut 2.0);
assert_eq!(&mut ring_buf[3], &mut 3.0);
assert_eq!(&mut ring_buf[4], &mut 0.0);
assert_eq!(&mut ring_buf[5], &mut 1.0);
assert_eq!(&mut ring_buf[6], &mut 2.0);
assert_eq!(&mut ring_buf[7], &mut 3.0);
assert_eq!(&mut ring_buf[8], &mut 0.0);
}
#[test]
fn bit_mask_ring_buf_ref_as_slices() {
let mut data = [1.0f32, 2.0, 3.0, 4.0];
let ring_buf = BMRingBufRef::new(&mut data);
let (s1, s2) = ring_buf.as_slices(0);
assert_eq!(s1, &[1.0, 2.0, 3.0, 4.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices(1);
assert_eq!(s1, &[2.0, 3.0, 4.0]);
assert_eq!(s2, &[1.0]);
let (s1, s2) = ring_buf.as_slices(2);
assert_eq!(s1, &[3.0, 4.0]);
assert_eq!(s2, &[1.0, 2.0]);
let (s1, s2) = ring_buf.as_slices(3);
assert_eq!(s1, &[4.0]);
assert_eq!(s2, &[1.0, 2.0, 3.0]);
let (s1, s2) = ring_buf.as_slices(4);
assert_eq!(s1, &[1.0, 2.0, 3.0, 4.0]);
assert_eq!(s2, &[]);
}
#[test]
fn bit_mask_ring_buf_ref_as_mut_slices() {
let mut data = [1.0f32, 2.0, 3.0, 4.0];
let mut ring_buf = BMRingBufRef::new(&mut data);
let (s1, s2) = ring_buf.as_mut_slices(0);
assert_eq!(s1, &[1.0, 2.0, 3.0, 4.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices(1);
assert_eq!(s1, &[2.0, 3.0, 4.0]);
assert_eq!(s2, &[1.0]);
let (s1, s2) = ring_buf.as_mut_slices(2);
assert_eq!(s1, &[3.0, 4.0]);
assert_eq!(s2, &[1.0, 2.0]);
let (s1, s2) = ring_buf.as_mut_slices(3);
assert_eq!(s1, &[4.0]);
assert_eq!(s2, &[1.0, 2.0, 3.0]);
let (s1, s2) = ring_buf.as_mut_slices(4);
assert_eq!(s1, &[1.0, 2.0, 3.0, 4.0]);
assert_eq!(s2, &[]);
}
#[repr(C, align(1))]
struct Aligned1([f32; 8]);
#[repr(C, align(2))]
struct Aligned2([f32; 8]);
#[repr(C, align(4))]
struct Aligned4([f32; 8]);
#[repr(C, align(8))]
struct Aligned8([f32; 8]);
#[repr(C, align(16))]
struct Aligned16([f32; 8]);
#[repr(C, align(32))]
struct Aligned32([f32; 8]);
#[repr(C, align(64))]
struct Aligned64([f32; 8]);
#[repr(C, align(32))]
struct Aligned324([f32; 4]);
#[test]
fn bit_mask_ring_buf_ref_write_latest_2() {
let mut data = Aligned324([0.0f32; 4]);
let mut ring_buf = BMRingBufRef::new(&mut data.0);
ring_buf.write_latest_2(&[], &[0.0, 1.0, 2.0, 3.0, 4.0], 1);
assert_eq!(ring_buf.data, &[3.0, 4.0, 1.0, 2.0]);
ring_buf.write_latest_2(&[-1.0], &[0.0, 1.0, 2.0, 3.0, 4.0], 1);
assert_eq!(ring_buf.data, &[2.0, 3.0, 4.0, 1.0]);
ring_buf.write_latest_2(&[-2.0, -1.0], &[0.0, 1.0, 2.0, 3.0, 4.0], 1);
assert_eq!(ring_buf.data, &[1.0, 2.0, 3.0, 4.0]);
ring_buf.write_latest_2(&[-2.0, -1.0], &[0.0, 1.0], 3);
assert_eq!(ring_buf.data, &[-1.0, 0.0, 1.0, -2.0]);
ring_buf.write_latest_2(&[0.0, 1.0], &[2.0], 3);
assert_eq!(ring_buf.data, &[1.0, 2.0, 1.0, 0.0]);
ring_buf.write_latest_2(&[1.0, 2.0, 3.0, 4.0], &[], 0);
assert_eq!(ring_buf.data, &[1.0, 2.0, 3.0, 4.0]);
ring_buf.write_latest_2(&[1.0, 2.0], &[], 2);
assert_eq!(ring_buf.data, &[1.0, 2.0, 1.0, 2.0]);
ring_buf.write_latest_2(&[], &[], 2);
assert_eq!(ring_buf.data, &[1.0, 2.0, 1.0, 2.0]);
ring_buf.write_latest_2(&[1.0, 2.0, 3.0, 4.0, 5.0], &[], 1);
assert_eq!(ring_buf.data, &[4.0, 5.0, 2.0, 3.0]);
ring_buf.write_latest_2(&[1.0, 2.0, 3.0, 4.0, 5.0], &[6.0], 2);
assert_eq!(ring_buf.data, &[3.0, 4.0, 5.0, 6.0]);
ring_buf.write_latest_2(&[1.0, 2.0, 3.0, 4.0, 5.0], &[6.0, 7.0], 2);
assert_eq!(ring_buf.data, &[7.0, 4.0, 5.0, 6.0]);
ring_buf.write_latest_2(&[1.0, 2.0, 3.0, 4.0, 5.0], &[6.0, 7.0, 8.0, 9.0, 10.0], 3);
assert_eq!(ring_buf.data, &[10.0, 7.0, 8.0, 9.0]);
}
#[test]
fn bit_mask_ring_buf_ref_write_latest() {
let mut data = Aligned324([0.0f32; 4]);
let mut ring_buf = BMRingBufRef::new(&mut data.0);
let input = [0.0f32, 1.0, 2.0, 3.0];
ring_buf.write_latest(&input, 0);
assert_eq!(ring_buf.data, &[0.0, 1.0, 2.0, 3.0]);
ring_buf.write_latest(&input, 1);
assert_eq!(ring_buf.data, &[3.0, 0.0, 1.0, 2.0]);
ring_buf.write_latest(&input, 2);
assert_eq!(ring_buf.data, &[2.0, 3.0, 0.0, 1.0]);
ring_buf.write_latest(&input, 3);
assert_eq!(ring_buf.data, &[1.0, 2.0, 3.0, 0.0]);
ring_buf.write_latest(&input, 4);
assert_eq!(ring_buf.data, &[0.0, 1.0, 2.0, 3.0]);
let input = [0.0f32, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0];
ring_buf.write_latest(&input, 0);
assert_eq!(ring_buf.data, &[4.0, 5.0, 6.0, 7.0]);
ring_buf.write_latest(&input, 1);
assert_eq!(ring_buf.data, &[7.0, 4.0, 5.0, 6.0]);
ring_buf.write_latest(&input, 2);
assert_eq!(ring_buf.data, &[6.0, 7.0, 4.0, 5.0]);
ring_buf.write_latest(&input, 3);
assert_eq!(ring_buf.data, &[5.0, 6.0, 7.0, 4.0]);
ring_buf.write_latest(&input, 4);
assert_eq!(ring_buf.data, &[4.0, 5.0, 6.0, 7.0]);
let input = [0.0f32, 1.0];
ring_buf.write_latest(&input, 0);
assert_eq!(ring_buf.data, &[0.0, 1.0, 6.0, 7.0]);
ring_buf.write_latest(&input, 1);
assert_eq!(ring_buf.data, &[0.0, 0.0, 1.0, 7.0]);
ring_buf.write_latest(&input, 2);
assert_eq!(ring_buf.data, &[0.0, 0.0, 0.0, 1.0]);
ring_buf.write_latest(&input, 3);
assert_eq!(ring_buf.data, &[1.0, 0.0, 0.0, 0.0]);
ring_buf.write_latest(&input, 4);
assert_eq!(ring_buf.data, &[0.0, 1.0, 0.0, 0.0]);
let aligned_input = Aligned1([8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]);
ring_buf.write_latest(&aligned_input.0, 0);
assert_eq!(ring_buf.data, &[12.0, 13.0, 14.0, 15.0]);
let aligned_input = Aligned2([8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]);
ring_buf.write_latest(&aligned_input.0, 0);
assert_eq!(ring_buf.data, &[12.0, 13.0, 14.0, 15.0]);
let aligned_input = Aligned4([8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]);
ring_buf.write_latest(&aligned_input.0, 0);
assert_eq!(ring_buf.data, &[12.0, 13.0, 14.0, 15.0]);
let aligned_input = Aligned8([8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]);
ring_buf.write_latest(&aligned_input.0, 0);
assert_eq!(ring_buf.data, &[12.0, 13.0, 14.0, 15.0]);
let aligned_input = Aligned16([8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]);
ring_buf.write_latest(&aligned_input.0, 0);
assert_eq!(ring_buf.data, &[12.0, 13.0, 14.0, 15.0]);
let aligned_input = Aligned32([8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]);
ring_buf.write_latest(&aligned_input.0, 0);
assert_eq!(ring_buf.data, &[12.0, 13.0, 14.0, 15.0]);
let aligned_input = Aligned64([8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]);
ring_buf.write_latest(&aligned_input.0, 0);
assert_eq!(ring_buf.data, &[12.0, 13.0, 14.0, 15.0]);
}
#[test]
fn bit_mask_ring_buf_ref_as_slices_len() {
let mut data = [0.0f32, 1.0, 2.0, 3.0];
let ring_buf = BMRingBufRef::new(&mut data);
let (s1, s2) = ring_buf.as_slices_len(0, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(0, 1);
assert_eq!(s1, &[0.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(0, 2);
assert_eq!(s1, &[0.0, 1.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(0, 3);
assert_eq!(s1, &[0.0, 1.0, 2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(0, 4);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(0, 5);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(1, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(1, 1);
assert_eq!(s1, &[1.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(1, 2);
assert_eq!(s1, &[1.0, 2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(1, 3);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(1, 4);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_len(1, 5);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_len(2, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(2, 1);
assert_eq!(s1, &[2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(2, 2);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(2, 3);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_len(2, 4);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_len(2, 5);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_len(3, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(3, 1);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(3, 2);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_len(3, 3);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_len(3, 4);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_slices_len(3, 5);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_slices_len(4, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(4, 1);
assert_eq!(s1, &[0.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(4, 2);
assert_eq!(s1, &[0.0, 1.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(4, 3);
assert_eq!(s1, &[0.0, 1.0, 2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(4, 4);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_len(4, 5);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
}
#[test]
fn bit_mask_ring_buf_ref_as_slices_latest() {
let mut data = [0.0f32, 1.0, 2.0, 3.0];
let ring_buf = BMRingBufRef::new(&mut data);
let (s1, s2) = ring_buf.as_slices_latest(0, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(0, 1);
assert_eq!(s1, &[0.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(0, 2);
assert_eq!(s1, &[0.0, 1.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(0, 3);
assert_eq!(s1, &[0.0, 1.0, 2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(0, 4);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(0, 5);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_latest(0, 6);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_latest(0, 7);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_slices_latest(0, 10);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_latest(1, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(1, 1);
assert_eq!(s1, &[1.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(1, 2);
assert_eq!(s1, &[1.0, 2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(1, 3);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(1, 4);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_latest(1, 5);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_latest(1, 6);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_slices_latest(1, 7);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(1, 10);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_slices_latest(2, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(2, 1);
assert_eq!(s1, &[2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(2, 2);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(2, 3);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_latest(2, 4);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_latest(2, 5);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_slices_latest(2, 6);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(2, 7);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_latest(2, 10);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(3, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(3, 1);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(3, 2);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_latest(3, 3);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_latest(3, 4);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_slices_latest(3, 5);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(3, 6);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_latest(3, 7);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_latest(3, 10);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_latest(4, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(4, 1);
assert_eq!(s1, &[0.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(4, 2);
assert_eq!(s1, &[0.0, 1.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(4, 3);
assert_eq!(s1, &[0.0, 1.0, 2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(4, 4);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_slices_latest(4, 5);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_slices_latest(4, 6);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_slices_latest(4, 7);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_slices_latest(4, 10);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
}
#[test]
fn bit_mask_ring_buf_ref_as_mut_slices_len() {
let mut data = [0.0f32, 1.0, 2.0, 3.0];
let mut ring_buf = BMRingBufRef::new(&mut data);
let (s1, s2) = ring_buf.as_mut_slices_len(0, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(0, 1);
assert_eq!(s1, &[0.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(0, 2);
assert_eq!(s1, &[0.0, 1.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(0, 3);
assert_eq!(s1, &[0.0, 1.0, 2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(0, 4);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(0, 5);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(1, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(1, 1);
assert_eq!(s1, &[1.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(1, 2);
assert_eq!(s1, &[1.0, 2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(1, 3);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(1, 4);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_mut_slices_len(1, 5);
assert_eq!(s1, &[1.0, 2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_mut_slices_len(2, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(2, 1);
assert_eq!(s1, &[2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(2, 2);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(2, 3);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_mut_slices_len(2, 4);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_len(2, 5);
assert_eq!(s1, &[2.0, 3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_len(3, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(3, 1);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(3, 2);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0]);
let (s1, s2) = ring_buf.as_mut_slices_len(3, 3);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_len(3, 4);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_mut_slices_len(3, 5);
assert_eq!(s1, &[3.0]);
assert_eq!(s2, &[0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_mut_slices_len(4, 0);
assert_eq!(s1, &[]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(4, 1);
assert_eq!(s1, &[0.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(4, 2);
assert_eq!(s1, &[0.0, 1.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(4, 3);
assert_eq!(s1, &[0.0, 1.0, 2.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(4, 4);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
let (s1, s2) = ring_buf.as_mut_slices_len(4, 5);
assert_eq!(s1, &[0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &[]);
}
#[test]
fn bit_mask_ring_buf_ref_as_mut_slices_latest() {
let mut data = [0.0f32, 1.0, 2.0, 3.0];
let mut ring_buf = BMRingBufRef::new(&mut data);
let (s1, s2) = ring_buf.as_mut_slices_latest(0, 0);
assert_eq!(s1, &mut []);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(0, 1);
assert_eq!(s1, &mut [0.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(0, 2);
assert_eq!(s1, &mut [0.0, 1.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(0, 3);
assert_eq!(s1, &mut [0.0, 1.0, 2.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(0, 4);
assert_eq!(s1, &mut [0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(0, 5);
assert_eq!(s1, &mut [1.0, 2.0, 3.0]);
assert_eq!(s2, &mut [0.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(0, 6);
assert_eq!(s1, &mut [2.0, 3.0]);
assert_eq!(s2, &mut [0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(0, 7);
assert_eq!(s1, &mut [3.0]);
assert_eq!(s2, &mut [0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(0, 10);
assert_eq!(s1, &mut [2.0, 3.0]);
assert_eq!(s2, &mut [0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(1, 0);
assert_eq!(s1, &mut []);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(1, 1);
assert_eq!(s1, &mut [1.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(1, 2);
assert_eq!(s1, &mut [1.0, 2.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(1, 3);
assert_eq!(s1, &mut [1.0, 2.0, 3.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(1, 4);
assert_eq!(s1, &mut [1.0, 2.0, 3.0]);
assert_eq!(s2, &mut [0.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(1, 5);
assert_eq!(s1, &mut [2.0, 3.0]);
assert_eq!(s2, &mut [0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(1, 6);
assert_eq!(s1, &mut [3.0]);
assert_eq!(s2, &mut [0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(1, 7);
assert_eq!(s1, &mut [0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(1, 10);
assert_eq!(s1, &mut [3.0]);
assert_eq!(s2, &mut [0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(2, 0);
assert_eq!(s1, &mut []);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(2, 1);
assert_eq!(s1, &mut [2.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(2, 2);
assert_eq!(s1, &mut [2.0, 3.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(2, 3);
assert_eq!(s1, &mut [2.0, 3.0]);
assert_eq!(s2, &mut [0.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(2, 4);
assert_eq!(s1, &mut [2.0, 3.0]);
assert_eq!(s2, &mut [0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(2, 5);
assert_eq!(s1, &mut [3.0]);
assert_eq!(s2, &mut [0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(2, 6);
assert_eq!(s1, &mut [0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(2, 7);
assert_eq!(s1, &mut [1.0, 2.0, 3.0]);
assert_eq!(s2, &mut [0.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(2, 10);
assert_eq!(s1, &mut [0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(3, 0);
assert_eq!(s1, &mut []);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(3, 1);
assert_eq!(s1, &mut [3.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(3, 2);
assert_eq!(s1, &mut [3.0]);
assert_eq!(s2, &mut [0.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(3, 3);
assert_eq!(s1, &mut [3.0]);
assert_eq!(s2, &mut [0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(3, 4);
assert_eq!(s1, &mut [3.0]);
assert_eq!(s2, &mut [0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(3, 5);
assert_eq!(s1, &mut [0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(3, 6);
assert_eq!(s1, &mut [1.0, 2.0, 3.0]);
assert_eq!(s2, &mut [0.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(3, 7);
assert_eq!(s1, &mut [2.0, 3.0]);
assert_eq!(s2, &mut [0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(3, 10);
assert_eq!(s1, &mut [1.0, 2.0, 3.0]);
assert_eq!(s2, &mut [0.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(4, 0);
assert_eq!(s1, &mut []);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(4, 1);
assert_eq!(s1, &mut [0.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(4, 2);
assert_eq!(s1, &mut [0.0, 1.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(4, 3);
assert_eq!(s1, &mut [0.0, 1.0, 2.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(4, 4);
assert_eq!(s1, &mut [0.0, 1.0, 2.0, 3.0]);
assert_eq!(s2, &mut []);
let (s1, s2) = ring_buf.as_mut_slices_latest(4, 5);
assert_eq!(s1, &mut [1.0, 2.0, 3.0]);
assert_eq!(s2, &mut [0.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(4, 6);
assert_eq!(s1, &mut [2.0, 3.0]);
assert_eq!(s2, &mut [0.0, 1.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(4, 7);
assert_eq!(s1, &mut [3.0]);
assert_eq!(s2, &mut [0.0, 1.0, 2.0]);
let (s1, s2) = ring_buf.as_mut_slices_latest(4, 10);
assert_eq!(s1, &mut [2.0, 3.0]);
assert_eq!(s2, &mut [0.0, 1.0]);
}
#[test]
fn bit_mask_ring_buf_ref_read_into() {
let mut data = Aligned324([0.0f32, 1.0, 2.0, 3.0]);
let ring_buf = BMRingBufRef::new(&mut data.0);
let mut output = [0.0f32; 4];
ring_buf.read_into(&mut output, 0);
assert_eq!(output, [0.0, 1.0, 2.0, 3.0]);
ring_buf.read_into(&mut output, 1);
assert_eq!(output, [1.0, 2.0, 3.0, 0.0]);
ring_buf.read_into(&mut output, 2);
assert_eq!(output, [2.0, 3.0, 0.0, 1.0]);
ring_buf.read_into(&mut output, 3);
assert_eq!(output, [3.0, 0.0, 1.0, 2.0]);
ring_buf.read_into(&mut output, 4);
assert_eq!(output, [0.0, 1.0, 2.0, 3.0]);
let mut output = [0.0f32; 3];
ring_buf.read_into(&mut output, 0);
assert_eq!(output, [0.0, 1.0, 2.0]);
ring_buf.read_into(&mut output, 1);
assert_eq!(output, [1.0, 2.0, 3.0]);
ring_buf.read_into(&mut output, 2);
assert_eq!(output, [2.0, 3.0, 0.0]);
ring_buf.read_into(&mut output, 3);
assert_eq!(output, [3.0, 0.0, 1.0]);
ring_buf.read_into(&mut output, 4);
assert_eq!(output, [0.0, 1.0, 2.0]);
let mut output = [0.0f32; 5];
ring_buf.read_into(&mut output, 0);
assert_eq!(output, [0.0, 1.0, 2.0, 3.0, 0.0]);
ring_buf.read_into(&mut output, 1);
assert_eq!(output, [1.0, 2.0, 3.0, 0.0, 1.0]);
ring_buf.read_into(&mut output, 2);
assert_eq!(output, [2.0, 3.0, 0.0, 1.0, 2.0]);
ring_buf.read_into(&mut output, 3);
assert_eq!(output, [3.0, 0.0, 1.0, 2.0, 3.0]);
ring_buf.read_into(&mut output, 4);
assert_eq!(output, [0.0, 1.0, 2.0, 3.0, 0.0]);
let mut output = [0.0f32; 10];
ring_buf.read_into(&mut output, 0);
assert_eq!(output, [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0, 0.0, 1.0]);
ring_buf.read_into(&mut output, 3);
assert_eq!(output, [3.0, 0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0, 0.0]);
let mut aligned_output = Aligned1([0.0; 8]);
ring_buf.read_into(&mut aligned_output.0, 0);
assert_eq!(aligned_output.0, [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0]);
let mut aligned_output = Aligned2([0.0; 8]);
ring_buf.read_into(&mut aligned_output.0, 0);
assert_eq!(aligned_output.0, [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0]);
let mut aligned_output = Aligned4([0.0; 8]);
ring_buf.read_into(&mut aligned_output.0, 0);
assert_eq!(aligned_output.0, [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0]);
let mut aligned_output = Aligned8([0.0; 8]);
ring_buf.read_into(&mut aligned_output.0, 0);
assert_eq!(aligned_output.0, [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0]);
let mut aligned_output = Aligned16([0.0; 8]);
ring_buf.read_into(&mut aligned_output.0, 0);
assert_eq!(aligned_output.0, [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0]);
let mut aligned_output = Aligned32([0.0; 8]);
ring_buf.read_into(&mut aligned_output.0, 0);
assert_eq!(aligned_output.0, [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0]);
let mut aligned_output = Aligned64([0.0; 8]);
ring_buf.read_into(&mut aligned_output.0, 0);
assert_eq!(aligned_output.0, [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0]);
}
}