use std::sync::Arc;
use smol_str::SmolStr;
use super::term_type::TermType;
use super::type_abbrevs::*;
#[derive(Clone, Debug, PartialEq, Eq, Ord, PartialOrd)]
pub struct Uuf {
pub id: SmolStr,
pub arg: TermType,
pub out: TermType,
}
#[derive(Clone, Debug, PartialEq, Eq, Ord, PartialOrd)]
#[expect(missing_docs, reason = "self-explanatory")]
pub enum ExtOp {
DecimalVal,
IpaddrIsV4,
IpaddrAddrV4,
IpaddrPrefixV4,
IpaddrAddrV6,
IpaddrPrefixV6,
DatetimeVal,
DatetimeOfBitVec,
DurationVal,
DurationOfBitVec,
}
#[derive(Clone, Debug, PartialEq, Eq, Ord, PartialOrd)]
#[expect(missing_docs, reason = "existing code")]
pub enum Op {
And,
Bvneg,
Bvadd,
Bvsub,
Bvmul,
Bvsdiv,
Bvudiv,
Bvsrem,
Bvsmod,
Bvurem,
Bvshl,
Bvlshr,
Bvslt,
Bvsle,
Bvult,
Bvule,
Bvnego,
Bvsaddo,
Bvssubo,
Bvsmulo,
Eq, Ext(ExtOp), Ite, Not, OptionGet, Or, RecordGet(Attr),
SetMember,
SetSubset,
SetInter,
StringLike(OrdPattern), Uuf(Arc<Uuf>), ZeroExtend(u32), }
impl ExtOp {
pub fn mk_name(&self) -> &'static str {
match self {
ExtOp::DecimalVal => "decimal.val",
ExtOp::IpaddrIsV4 => "ipaddr.isV4",
ExtOp::IpaddrAddrV4 => "ipaddr.addrV4",
ExtOp::IpaddrPrefixV4 => "ipaddr.prefixV4",
ExtOp::IpaddrAddrV6 => "ipaddr.addrV6",
ExtOp::IpaddrPrefixV6 => "ipaddr.prefixV6",
ExtOp::DatetimeVal => "datetime.val",
ExtOp::DatetimeOfBitVec => "datetime.ofBitVec",
ExtOp::DurationVal => "duration.val",
ExtOp::DurationOfBitVec => "duration.ofBitVec",
}
}
}
impl Op {
pub fn mk_name(&self) -> &'static str {
match self {
Op::Not => "not",
Op::And => "and",
Op::Or => "or",
Op::Eq => "eq",
Op::Ite => "ite",
Op::Uuf(_) => "uuf",
Op::Bvneg => "bvneg",
Op::Bvadd => "bvadd",
Op::Bvsub => "bvsub",
Op::Bvmul => "bvmul",
Op::Bvsdiv => "bvsdiv",
Op::Bvudiv => "bvudiv",
Op::Bvsrem => "bvsrem",
Op::Bvsmod => "bvsmod",
Op::Bvurem => "bvurem",
Op::Bvshl => "bvshl",
Op::Bvlshr => "bvlshr",
Op::Bvslt => "bvslt",
Op::Bvsle => "bvsle",
Op::Bvult => "bvult",
Op::Bvule => "bvule",
Op::Bvnego => "bvnego",
Op::Bvsaddo => "bvsaddo",
Op::Bvssubo => "bvssubo",
Op::Bvsmulo => "bvsmulo",
Op::ZeroExtend(_) => "zero_extend",
Op::SetMember => "set.member",
Op::SetSubset => "set.subset",
Op::SetInter => "set.inter",
Op::OptionGet => "option.get",
Op::RecordGet(_) => "record.get",
Op::StringLike(_) => "string.like",
Op::Ext(_) => "ext",
}
}
}