use vize_l0::{FxHashMap, String};
use super::{AlphaExport, Demand, FactGroup, FactTable, ids};
use crate::dump::Dump;
use crate::pass::AnalysisId;
pub struct ExpressionFacts;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ExpressionFact {
pub references: String,
pub exact: bool,
pub constant: bool,
}
impl FactGroup for ExpressionFacts {
const ID: AnalysisId = ids::EXPRESSION_FACTS;
const NAME: &'static str = "expression-facts";
const STRATUM: u8 = 0;
const DEPENDS: Demand = Demand::NONE;
type Key = u32;
type Value = ExpressionFact;
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Dump)]
pub struct ExpressionFactsAlpha {
pub references: FxHashMap<u32, String>,
pub exact: FxHashMap<u32, bool>,
pub constant: FxHashMap<u32, bool>,
}
impl AlphaExport for ExpressionFacts {
const ALPHA_SCHEMA: u16 = 1;
type Alpha = ExpressionFactsAlpha;
fn export(table: &FactTable<Self>) -> ExpressionFactsAlpha {
let mut alpha = ExpressionFactsAlpha::default();
for (id, fact) in table.iter() {
alpha.references.insert(*id, fact.references.clone());
alpha.exact.insert(*id, fact.exact);
alpha.constant.insert(*id, fact.constant);
}
alpha
}
fn import(alpha: ExpressionFactsAlpha) -> FactTable<Self> {
let mut ids: alloc::collections::BTreeSet<u32> = alpha.references.keys().copied().collect();
ids.extend(alpha.exact.keys().copied());
ids.extend(alpha.constant.keys().copied());
ids.into_iter()
.map(|id| {
let fact = ExpressionFact {
references: alpha.references.get(&id).cloned().unwrap_or_default(),
exact: alpha.exact.get(&id).copied().unwrap_or(false),
constant: alpha.constant.get(&id).copied().unwrap_or(false),
};
(id, fact)
})
.collect()
}
}