#[derive(Clone)]
pub struct ConditionStack {
m_stack_size: u32,
m_first_false_pos: u32,
}
impl ConditionStack {
const NO_FALSE: u32 = u32::MAX;
pub fn new() -> Self {
Self {
m_stack_size: 0,
m_first_false_pos: Self::NO_FALSE,
}
}
pub fn empty(&self) -> bool {
self.m_stack_size == 0
}
pub fn all_true(&self) -> bool {
self.m_first_false_pos == Self::NO_FALSE
}
pub fn push_back(&mut self, f: bool) {
if self.m_first_false_pos == Self::NO_FALSE && !f {
self.m_first_false_pos = self.m_stack_size;
}
self.m_stack_size += 1;
}
pub fn pop_back(&mut self) {
self.m_stack_size -= 1;
if self.m_first_false_pos == self.m_stack_size {
self.m_first_false_pos = Self::NO_FALSE;
}
}
pub fn toggle_top(&mut self) {
if self.m_first_false_pos == Self::NO_FALSE {
self.m_first_false_pos = self.m_stack_size - 1;
} else if self.m_first_false_pos == self.m_stack_size - 1 {
self.m_first_false_pos = Self::NO_FALSE;
} }
}