use std::rc::Rc;
use crate::{
db::LevelIndex,
dispatch::Dispatch,
structures::literal::{self, abLiteral},
};
#[doc(hidden)]
mod level;
pub use level::*;
#[allow(dead_code)]
pub struct LiteralDB {
level_stack: Vec<Level>,
dispatcher: Option<Rc<dyn Fn(Dispatch)>>,
}
impl LiteralDB {
pub fn new(tx: Option<Rc<dyn Fn(Dispatch)>>) -> Self {
LiteralDB {
level_stack: Vec::default(),
dispatcher: tx,
}
}
pub fn note_decision(&mut self, decision: abLiteral) {
self.level_stack.push(Level::new(decision));
}
pub unsafe fn last_decision_unchecked(&self) -> abLiteral {
self.level_stack
.get_unchecked(self.level_stack.len() - 1)
.decision()
}
pub unsafe fn decision_at_level_unchecked(&self, level: LevelIndex) -> abLiteral {
self.level_stack.get_unchecked(level as usize).decision()
}
pub fn last_consequences_unchecked(&self) -> &[(literal::Source, abLiteral)] {
unsafe {
self.level_stack
.get_unchecked(self.level_stack.len() - 1)
.consequences()
}
}
pub fn consequences_at_level_unchecked(
&self,
level: LevelIndex,
) -> &[(literal::Source, abLiteral)] {
unsafe {
self.level_stack
.get_unchecked(level as usize)
.consequences()
}
}
pub fn forget_last_decision(&mut self) {
self.level_stack.pop();
}
pub fn decision_made(&self) -> bool {
!self.level_stack.is_empty()
}
pub fn decision_count(&self) -> LevelIndex {
self.level_stack.len() as LevelIndex
}
pub unsafe fn top_mut_unchecked(&mut self) -> &mut Level {
let last_decision_index = self.level_stack.len().saturating_sub(1);
self.level_stack.get_unchecked_mut(last_decision_index)
}
}