use crate::bitcode::{BitcodeElement, Block, Record, Signature};
use crate::BitStreamReader;
pub trait BitStreamVisitor {
fn validate(&self, _signature: Signature) -> bool {
true
}
fn should_enter_block(&mut self, id: u64) -> bool;
fn did_exit_block(&mut self);
fn visit(&mut self, record: Record);
}
pub struct CollectingVisitor {
stack: Vec<(u64, Vec<BitcodeElement>)>,
}
impl CollectingVisitor {
pub fn new() -> Self {
Self {
stack: vec![(BitStreamReader::TOP_LEVEL_BLOCK_ID, Vec::new())],
}
}
pub fn finalize_top_level_elements(mut self) -> Vec<BitcodeElement> {
assert_eq!(self.stack.len(), 1);
self.stack.pop().unwrap().1
}
}
impl BitStreamVisitor for CollectingVisitor {
fn should_enter_block(&mut self, id: u64) -> bool {
self.stack.push((id, Vec::new()));
true
}
fn did_exit_block(&mut self) {
if let Some((id, elements)) = self.stack.pop() {
let block = Block { id, elements };
let last = self.stack.last_mut().unwrap();
last.1.push(BitcodeElement::Block(block));
}
}
fn visit(&mut self, record: Record) {
let last = self.stack.last_mut().unwrap();
last.1.push(BitcodeElement::Record(record));
}
}