#[derive(Debug)]
pub struct ConditionStack {
stack_size: u32,
first_false_pos: u32,
}
impl Default for ConditionStack {
fn default() -> Self {
Self {
stack_size: 0,
first_false_pos: Self::NO_FALSE,
}
}
}
impl ConditionStack {
const NO_FALSE: u32 = u32::MAX;
pub fn is_empty(&self) -> bool {
self.stack_size == 0
}
pub fn all_true(&self) -> bool {
self.first_false_pos == Self::NO_FALSE
}
pub fn push_back(&mut self, b: bool) {
if (self.first_false_pos == Self::NO_FALSE) && !b {
self.first_false_pos = self.stack_size;
}
self.stack_size += 1;
}
pub fn pop_back(&mut self) -> Option<()> {
if self.stack_size == 0 {
return None;
}
self.stack_size -= 1;
if self.first_false_pos == self.stack_size {
self.first_false_pos = Self::NO_FALSE;
}
Some(())
}
pub fn toggle_top(&mut self) -> Option<()> {
if self.stack_size == 0 {
return None;
}
if self.first_false_pos == Self::NO_FALSE {
self.first_false_pos = self.stack_size - 1;
} else if self.first_false_pos == self.stack_size - 1 {
self.first_false_pos = Self::NO_FALSE;
} else {
}
Some(())
}
}