mod iona;
pub use iona::IonaBuffer;
pub use zerocopy;
#[cfg(feature = "derive")]
pub use iona_derive::iona;
#[cfg(feature = "derive")]
pub use zerocopy_derive;
#[cfg(test)]
mod test {
use super::*;
use std::iter::Sum;
#[test]
fn create_new_circular_buffer() {
#[iona]
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
struct Test {
x: usize,
y: usize,
}
impl Sum for Test {
fn sum<I: Iterator<Item = Self>>(iter: I) -> Self {
iter.fold(Test { x: 0, y: 0 }, |acc, test| Test {
x: acc.x + test.x,
y: acc.y + test.y,
})
}
}
impl<'a> Sum<&'a Test> for Test {
fn sum<I: Iterator<Item = &'a Self>>(iter: I) -> Self {
iter.fold(Test { x: 0, y: 0 }, |acc, t| Test {
x: acc.x + t.x,
y: acc.y + t.y,
})
}
}
let mut buffer: IonaBuffer<Test> = IonaBuffer::new().unwrap();
assert_eq!(buffer.capacity(), 256);
buffer.push_back(&Test { x: 0, y: 0 });
buffer.push_back(&Test { x: 1, y: 0 });
assert_eq!(buffer.get(0), Some(&Test { x: 0, y: 0 }));
assert_eq!(buffer.get(1), Some(&Test { x: 1, y: 0 }));
assert_eq!(
buffer.get_slice(0..2),
&[Test { x: 0, y: 0 }, Test { x: 1, y: 0 }]
);
assert_eq!(&buffer[..=1], &[Test { x: 0, y: 0 }, Test { x: 1, y: 0 }]);
assert_eq!(&buffer[0..=1], &[Test { x: 0, y: 0 }, Test { x: 1, y: 0 }]);
assert_eq!(
buffer.get_slice(buffer.capacity() - 1..buffer.capacity() + 2),
&[
Test { x: 0, y: 0 },
Test { x: 0, y: 0 },
Test { x: 1, y: 0 }
]
);
assert_eq!(
&buffer[buffer.capacity() - 1..buffer.capacity() + 2],
&[
Test { x: 0, y: 0 },
Test { x: 0, y: 0 },
Test { x: 1, y: 0 }
]
);
}
#[test]
fn buff_to_iter() {
let mut buffer: IonaBuffer<usize> = IonaBuffer::new().unwrap();
buffer.push_back(&1);
assert_eq!(buffer[..].iter().last().unwrap(), &1);
assert_eq!(buffer.iter().last().unwrap(), &1);
assert_eq!(buffer.iter_mut().last().unwrap(), &mut 1);
buffer.push_back(&1);
}
}