vec-reg-common 0.7.1

Shared models and logics for the vec-reg
Documentation
use std::rc::Rc;

pub type PC = usize;
#[allow(dead_code)]
pub type SP = usize;
pub type GroupIndex = usize;
pub type GroupName = String;

pub enum Inst<I> {
    Begin,
    End,
    Check(Rc<dyn Fn(&I) -> bool + 'static>),
    Match,
    Jmp(PC),
    Split(PC, PC),
    SaveOpen(GroupIndex),
    SaveClose(GroupIndex),
    SaveNamedOpen(GroupName, GroupIndex),
    SaveNamedClose(GroupName, GroupIndex),
}

impl<I> std::fmt::Debug for Inst<I> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::Begin => write!(f, "Begin"),
            Self::End => write!(f, "End"),
            Self::Check(_arg0) => f.debug_tuple("Check").field(&"#<fn>").finish(),
            Self::Match => write!(f, "Match"),
            Self::Jmp(arg0) => f.debug_tuple("Jmp").field(arg0).finish(),
            Self::Split(arg0, arg1) => f.debug_tuple("Split").field(arg0).field(arg1).finish(),
            Self::SaveOpen(idx) => f.debug_tuple("SaveOpen").field(idx).finish(),
            Self::SaveClose(idx) => f.debug_tuple("SaveClose").field(idx).finish(),
            Self::SaveNamedOpen(name, idx) => f
                .debug_tuple("SaveOpenNamed")
                .field(name)
                .field(idx)
                .finish(),
            Self::SaveNamedClose(name, idx) => f
                .debug_tuple("SaveCloseNamed")
                .field(name)
                .field(idx)
                .finish(),
        }
    }
}

impl<I> Clone for Inst<I> {
    fn clone(&self) -> Self {
        match self {
            Self::Begin => Self::Begin,
            Self::End => Self::End,
            Self::Check(arg0) => Self::Check(arg0.clone()),
            Self::Match => Self::Match,
            Self::Jmp(arg0) => Self::Jmp(*arg0),
            Self::Split(arg0, arg1) => Self::Split(*arg0, *arg1),
            Self::SaveOpen(idx) => Self::SaveOpen(*idx),
            Self::SaveClose(idx) => Self::SaveClose(*idx),
            Self::SaveNamedOpen(name, idx) => Self::SaveNamedOpen(name.clone(), *idx),
            Self::SaveNamedClose(name, idx) => Self::SaveNamedClose(name.clone(), *idx),
        }
    }
}