use crate::messaging::aligned_buffer::AlignedBuffer;
use crate::messaging::message::Message;
pub(crate) struct BruteForceBuffer {
pub(crate) data: AlignedBuffer,
pub(crate) finalised: bool,
}
impl BruteForceBuffer {
pub(crate) fn new(item_size: usize, item_align: usize, capacity: usize) -> Self {
BruteForceBuffer {
data: AlignedBuffer::with_capacity(item_size, item_align, capacity),
finalised: false,
}
}
pub(crate) fn begin_tick(&mut self) {
self.data.clear();
self.finalised = false;
}
pub(crate) fn finalise(&mut self) {
self.finalised = true;
}
}
pub struct BruteForceIter<'a, M> {
slice: &'a [M],
index: usize,
}
impl<'a, M: Message> BruteForceIter<'a, M> {
pub(crate) fn new(buf: &'a BruteForceBuffer) -> Self {
let slice: &'a [M] = if buf.data.is_empty() {
&[]
} else {
unsafe { buf.data.as_slice::<M>() }
};
BruteForceIter { slice, index: 0 }
}
pub(crate) fn empty() -> Self {
BruteForceIter {
slice: &[],
index: 0,
}
}
}
impl<'a, M: Copy> Iterator for BruteForceIter<'a, M> {
type Item = M;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.slice.len() {
let item = self.slice[self.index];
self.index += 1;
Some(item)
} else {
None
}
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.slice.len() - self.index;
(remaining, Some(remaining))
}
}
impl<'a, M: Copy> ExactSizeIterator for BruteForceIter<'a, M> {}