use std::cell::UnsafeCell;
use crate::set::MemberSet;
use crate::DomTree;
pub trait DominanceFrontier: DomTree {
type FrontierSet: MemberSet<Self::Identifier>;
type NodeIter<'a>: Iterator<Item = Self::Identifier>
where
Self: 'a;
fn frontiers_cell(&self, id: Self::Identifier) -> &UnsafeCell<Self::FrontierSet>;
fn frontiers(&self, id: Self::Identifier) -> &Self::FrontierSet {
unsafe { &*self.frontiers_cell(id).get() }
}
fn node_iter(&self) -> Self::NodeIter<'_>;
fn populate_frontiers(&mut self) {
for i in self.node_iter() {
for mut p in self.predecessor_iter(i) {
if let Some(dom) = self.dom(i) {
while p != dom {
unsafe {
(*self.frontiers_cell(p).get()).insert(i);
}
if let Some(pdom) = self.dom(p) {
p = pdom;
} else {
break;
}
}
}
}
}
}
}