use crate::{index::*, *};
impl Op {
pub fn visit_results<V: VisitResults>(&mut self, visitor: &mut V) {
ResultsVisitor::host_visitor(self, visitor)
}
}
pub trait VisitResults {
fn visit_result_reg(&mut self, reg: &mut Slot);
fn visit_result_regs(&mut self, reg: &mut SlotSpan, len: Option<u16>);
}
pub trait ResultsVisitor {
fn host_visitor<V: VisitResults>(self, visitor: &mut V);
}
impl ResultsVisitor for &'_ mut Slot {
fn host_visitor<V: VisitResults>(self, visitor: &mut V) {
visitor.visit_result_reg(self);
}
}
impl ResultsVisitor for &'_ mut [Slot; 2] {
fn host_visitor<V: VisitResults>(self, _visitor: &mut V) {
}
}
impl ResultsVisitor for &'_ mut SlotSpan {
fn host_visitor<V: VisitResults>(self, visitor: &mut V) {
visitor.visit_result_regs(self, None);
}
}
impl ResultsVisitor for &'_ mut BoundedSlotSpan {
fn host_visitor<V: VisitResults>(self, visitor: &mut V) {
let len = self.len();
visitor.visit_result_regs(self.span_mut(), Some(len));
}
}
impl<const N: u16> ResultsVisitor for &'_ mut FixedSlotSpan<N> {
fn host_visitor<V: VisitResults>(self, visitor: &mut V) {
visitor.visit_result_regs(self.span_mut(), Some(N));
}
}