use crate::{
misc::log::targets::{self},
structures::literal::{CLiteral, Literal},
types::err::{self},
};
pub type FormulaIndex = u32;
pub type FormulaToken = u16;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ClauseKey {
OriginalUnit(CLiteral),
AdditionUnit(CLiteral),
OriginalBinary(FormulaIndex),
AdditionBinary(FormulaIndex),
Original(FormulaIndex),
Addition(FormulaIndex, FormulaToken),
}
impl ClauseKey {
pub fn index(&self) -> usize {
match self {
Self::OriginalUnit(l) | Self::AdditionUnit(l) => l.atom() as usize,
Self::OriginalBinary(i) | Self::AdditionBinary(i) => *i as usize,
Self::Original(i) => *i as usize,
Self::Addition(i, _) => *i as usize,
}
}
pub fn retoken(&self) -> Result<Self, err::ClauseDBError> {
match self {
Self::OriginalUnit(_) | Self::AdditionUnit(_) => {
log::error!(target: targets::CLAUSE_DB, "Unit keys have a unique token");
Err(err::ClauseDBError::InvalidKeyToken)
}
Self::Original(_) => {
log::error!(target: targets::CLAUSE_DB, "Formula keys have a unique token");
Err(err::ClauseDBError::InvalidKeyToken)
}
Self::OriginalBinary(_) | Self::AdditionBinary(_) => {
log::error!(target: targets::CLAUSE_DB, "Binary keys have a unique token");
Err(err::ClauseDBError::InvalidKeyToken)
}
Self::Addition(index, token) => {
if *token == FormulaToken::MAX {
return Err(err::ClauseDBError::StorageExhausted);
}
Ok(ClauseKey::Addition(*index, token + 1))
}
}
}
}
impl std::fmt::Display for ClauseKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::OriginalUnit(key) => write!(f, "OriginalUnit({key})"),
Self::AdditionUnit(key) => write!(f, "AdditionUnit({key})"),
Self::OriginalBinary(key) => write!(f, "OriginalBinary({key})"),
Self::AdditionBinary(key) => write!(f, "AdditionBinary({key})"),
Self::Original(key) => write!(f, "Formula({key})"),
Self::Addition(key, token) => write!(f, "Addition({key}, {token})"),
}
}
}