use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum OptTier {
O0,
O1,
O2,
O3,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TiePolicy {
Reject,
}
impl TiePolicy {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Reject => "reject",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct OptimizationBudget {
pub tier: OptTier,
pub candidate_budget: u32,
pub emitted_size_epsilon_pct: u32,
pub reactive_edge_epsilon_pct: u32,
pub update_path_epsilon_pct: u32,
pub required_improvements_min: u32,
pub tie_policy: TiePolicy,
}
impl OptTier {
pub const ALL: [Self; 4] = [Self::O0, Self::O1, Self::O2, Self::O3];
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::O0 => "O0",
Self::O1 => "O1",
Self::O2 => "O2",
Self::O3 => "O3",
}
}
#[must_use]
pub const fn from_str(value: &str) -> Option<Self> {
match value.as_bytes() {
b"O0" => Some(Self::O0),
b"O1" => Some(Self::O1),
b"O2" => Some(Self::O2),
b"O3" => Some(Self::O3),
_ => None,
}
}
#[must_use]
pub const fn budget(self) -> OptimizationBudget {
let (candidate_budget, required_improvements_min) = match self {
Self::O0 => (0, 0),
Self::O1 => (8, 1),
Self::O2 => (32, 1),
Self::O3 => (128, 1),
};
OptimizationBudget {
tier: self,
candidate_budget,
emitted_size_epsilon_pct: 0,
reactive_edge_epsilon_pct: 0,
update_path_epsilon_pct: 0,
required_improvements_min,
tie_policy: TiePolicy::Reject,
}
}
}
impl fmt::Display for OptTier {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}