make layer iter reversible

This commit is contained in:
2025-09-25 00:04:01 -04:00
parent 443e13f094
commit 57bfd2d348
2 changed files with 83 additions and 30 deletions

View File

@@ -141,14 +141,8 @@ impl<Ctx: UiCtx + 'static> SensorModule<Ctx> {
let mut layers = std::mem::take(&mut ctx.ui().layers);
let mut module = std::mem::take(ctx.ui().modules.get_mut::<Self>());
// TODO: temp, need to actually make reverse
let mut layer_idxs = Vec::new();
for (i, _) in layers.iter_mut() {
layer_idxs.push(i);
}
for l in &layer_idxs {
let Some(list) = module.active.get_mut(l) else {
for (i, _) in layers.iter_mut().rev() {
let Some(list) = module.active.get_mut(&i) else {
continue;
};
let mut ran = false;

View File

@@ -7,21 +7,24 @@ use crate::{
};
struct LayerNode {
next: Next,
child: Option<usize>,
next: Ptr,
prev: Ptr,
child: Option<Child>,
data: Layer,
}
#[derive(Clone, Copy)]
enum Next {
#[derive(Clone, Copy, Debug)]
enum Ptr {
/// continue on same level
Same(usize),
Next(usize),
/// go back to parent
Parent(usize),
/// end
None,
}
/// TODO: currently this does not ever free layers
/// is that realistically desired?
pub struct Layers {
vec: Vec<LayerNode>,
}
@@ -32,6 +35,12 @@ pub struct Layer {
pub primitives: Primitives,
}
#[derive(Clone, Copy)]
struct Child {
head: usize,
tail: usize,
}
impl Layers {
pub fn new() -> Layers {
Self {
@@ -51,26 +60,48 @@ impl Layers {
}
pub fn next(&mut self, i: usize) -> usize {
if let Next::Same(i) = self.vec[i].next {
if let Ptr::Next(i) = self.vec[i].next {
return i;
}
let i_next = self.push(LayerNode::new(Layer::default(), self.vec[i].next));
self.vec[i].next = Next::Same(i_next);
i_next
let i_new = self.push(LayerNode::new(
Layer::default(),
self.vec[i].next,
Ptr::Next(i),
));
self.vec[i].next = Ptr::Next(i_new);
self.vec[i_new].prev = Ptr::Next(i);
match self.vec[i_new].next {
Ptr::Next(i) => self.vec[i].prev = Ptr::Next(i_new),
Ptr::Parent(i) => self.vec[i].child.as_mut().unwrap().tail = i_new,
Ptr::None => (),
}
i_new
}
pub fn child(&mut self, i: usize) -> usize {
if let Some(i) = self.vec[i].child {
return i;
if let Some(c) = self.vec[i].child {
return c.head;
}
let i_next = self.push(LayerNode::new(Layer::default(), Next::Parent(i)));
self.vec[i].child = Some(i_next);
i_next
let i_child = self.push(LayerNode::new(
Layer::default(),
Ptr::Parent(i),
Ptr::Parent(i),
));
self.vec[i].child = Some(Child {
head: i_child,
tail: i_child,
});
i_child
}
pub fn iter_mut(&mut self) -> LayerIteratorMut<'_> {
let mut last = 0;
while let Some(c) = self.vec[last].child {
last = c.tail;
}
LayerIteratorMut {
next: Some(0),
next_back: Some(last),
vec: &mut self.vec,
}
}
@@ -111,21 +142,23 @@ impl IndexMut<usize> for Layers {
}
impl LayerNode {
pub fn new(data: Layer, next: Next) -> Self {
pub fn new(data: Layer, next: Ptr, prev: Ptr) -> Self {
Self {
next,
prev,
child: None,
data,
}
}
pub fn head() -> Self {
Self::new(Layer::default(), Next::None)
Self::new(Layer::default(), Ptr::None, Ptr::None)
}
}
pub struct LayerIteratorMut<'a> {
next: Option<usize>,
next_back: Option<usize>,
vec: &'a mut Vec<LayerNode>,
}
@@ -133,16 +166,16 @@ impl<'a> Iterator for LayerIteratorMut<'a> {
type Item = (usize, &'a mut Layer);
fn next(&mut self) -> Option<Self::Item> {
// chat are we cooked? (if it's not set up correctly this could be catastrophic)
let ret_i = self.next?;
// chat are we cooked? (if it's not set up correctly this could be catastrophic)
let node: &mut LayerNode = unsafe { std::mem::transmute(&mut self.vec[ret_i]) };
self.next = if let Some(i) = node.child {
self.next = if let Some(c) = node.child {
Some(c.head)
} else if let Ptr::Next(i) = node.next {
Some(i)
} else if let Next::Same(i) = node.next {
Some(i)
} else if let Next::Parent(i) = node.next {
} else if let Ptr::Parent(i) = node.next {
let node = &self.vec[i];
if let Next::Same(i) = node.next {
if let Ptr::Next(i) = node.next {
Some(i)
} else {
None
@@ -150,6 +183,32 @@ impl<'a> Iterator for LayerIteratorMut<'a> {
} else {
None
};
if self.next_back.unwrap() == ret_i {
self.next = None;
self.next_back = None;
}
Some((ret_i, &mut node.data))
}
}
impl<'a> DoubleEndedIterator for LayerIteratorMut<'a> {
fn next_back(&mut self) -> Option<Self::Item> {
let ret_i = self.next_back?;
let node: &mut LayerNode = unsafe { std::mem::transmute(&mut self.vec[ret_i]) };
self.next_back = if let Ptr::Next(mut i) = node.prev {
while let Some(c) = self.vec[i].child {
i = c.tail
}
Some(i)
} else if let Ptr::Parent(i) = node.prev {
Some(i)
} else {
None
};
if self.next.unwrap() == ret_i {
self.next = None;
self.next_back = None;
}
Some((ret_i, &mut node.data))
}
}