mod advice;
mod assembly_op;
use crate::utils::collections::Vec;
pub use advice::AdviceInjector;
pub use assembly_op::AssemblyOp;
use core::fmt;
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Decorator {
Advice(AdviceInjector),
AsmOp(AssemblyOp),
}
impl fmt::Display for Decorator {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Advice(injector) => write!(f, "advice({injector})"),
Self::AsmOp(assembly_op) => {
write!(
f,
"asmOp({}, {})",
assembly_op.op(),
assembly_op.num_cycles()
)
}
}
}
}
pub type DecoratorList = Vec<(usize, Decorator)>;
pub struct DecoratorIterator<'a> {
decorators: &'a DecoratorList,
idx: usize,
}
impl<'a> DecoratorIterator<'a> {
pub fn new(decorators: &'a DecoratorList) -> Self {
Self { decorators, idx: 0 }
}
#[inline(always)]
pub fn next(&mut self, pos: usize) -> Option<&Decorator> {
if self.idx < self.decorators.len() && self.decorators[self.idx].0 == pos {
self.idx += 1;
Some(&self.decorators[self.idx - 1].1)
} else {
None
}
}
}