pub const COST_MODEL_VERSION: u16 = 2;
pub(crate) enum CostMeter<'a> {
CountOnly { used: &'a mut u64 },
FiniteBudget {
remaining: &'a mut i64,
used: &'a mut u64,
},
}
impl<'a> CostMeter<'a> {
pub(crate) fn count_only(used: &'a mut u64) -> Self {
Self::CountOnly { used }
}
pub(crate) fn finite_budget(remaining: &'a mut i64, used: &'a mut u64) -> Self {
Self::FiniteBudget { remaining, used }
}
#[inline(always)]
pub(crate) fn consume(&mut self, cost: u64) -> bool {
match self {
Self::CountOnly { used } => {
**used = (**used).saturating_add(cost);
true
}
Self::FiniteBudget { remaining, used } => {
if cost > 0 && **remaining <= 0 {
return false;
}
**remaining = (**remaining).saturating_sub_unsigned(cost);
**used = (**used).saturating_add(cost);
true
}
}
}
}