use crate::dump::Dump;
use super::{AnalysisEvent, FailEvent, PassEvent, PassObserver, Pipeline};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Dump)]
pub struct BudgetObserver {
pub walks: u32,
pub passes: u32,
pub analyses: u32,
pub pipelines: u32,
pub failures: u32,
}
impl BudgetObserver {
#[must_use]
pub const fn new() -> Self {
Self {
walks: 0,
passes: 0,
analyses: 0,
pipelines: 0,
failures: 0,
}
}
pub const fn reset(&mut self) {
*self = Self::new();
}
#[must_use]
pub const fn fusion_ratio_hundredths(&self) -> Option<u32> {
if self.walks == 0 {
return None;
}
Some((self.passes * 100) / self.walks)
}
}
impl PassObserver for BudgetObserver {
fn before_pipeline(&mut self, _pipeline: &Pipeline) {
self.pipelines += 1;
}
fn before_pass(&mut self, event: &PassEvent<'_>) {
if event.is_group_entry() {
self.walks += 1;
}
self.passes += 1;
}
fn before_analysis(&mut self, _event: &AnalysisEvent<'_>) {
self.analyses += 1;
}
fn on_fail(&mut self, _event: &FailEvent<'_>) {
self.failures += 1;
}
}