use crate::render::low_memory_pipeline::render_group::ChannelVec;
pub(super) fn get_distinct_indices<'a, T>(
vals: &'a mut [impl AsMut<[T]>],
idx: &[(usize, usize, usize)],
) -> ChannelVec<&'a mut T> {
let mut answer_buffer = ChannelVec::new();
for _ in 0..idx.len() {
answer_buffer.push(None);
}
let mut targets = idx.iter();
let mut target = targets.next().unwrap();
'outer: for (aa, bufs) in vals.iter_mut().enumerate() {
for (bb, buf) in bufs.as_mut().iter_mut().enumerate() {
let (a, b, pos) = target;
if aa == *a && bb == *b {
answer_buffer[*pos] = Some(buf);
if let Some(t) = targets.next() {
target = t;
} else {
break 'outer;
}
}
}
}
answer_buffer
.iter_mut()
.map(|x| std::mem::take(x).expect("Not all elements were found"))
.collect()
}
pub(super) fn mirror(mut v: isize, s: usize) -> usize {
loop {
if v < 0 {
v = -v - 1;
} else if v >= s as isize {
v = s as isize * 2 - v - 1;
} else {
return v as usize;
}
}
}