use std::collections::HashMap;
use onnx_runtime_ir::ValueId;
#[derive(Clone, Debug, Default)]
pub struct ViewMap {
edges: HashMap<ValueId, ValueId>,
}
impl ViewMap {
pub fn new() -> Self {
Self::default()
}
pub fn from_pairs(pairs: impl IntoIterator<Item = (ValueId, ValueId)>) -> Self {
let mut m = Self::new();
for (view, source) in pairs {
m.insert(view, source);
}
m
}
pub fn insert(&mut self, view: ValueId, source: ValueId) {
self.edges.insert(view, source);
}
pub fn is_view(&self, value: ValueId) -> bool {
self.edges.contains_key(&value)
}
pub fn source_of(&self, value: ValueId) -> Option<ValueId> {
self.edges.get(&value).copied()
}
pub fn root(&self, value: ValueId) -> ValueId {
let mut seen: Vec<ValueId> = Vec::new();
let mut cur = value;
while let Some(&next) = self.edges.get(&cur) {
if seen.contains(&cur) {
break;
}
seen.push(cur);
cur = next;
}
cur
}
pub fn len(&self) -> usize {
self.edges.len()
}
pub fn is_empty(&self) -> bool {
self.edges.is_empty()
}
}