use super::*;
#[derive(Debug)]
pub struct I64Sort;
impl BaseSort for I64Sort {
type Base = i64;
fn name(&self) -> &str {
"i64"
}
#[rustfmt::skip]
fn register_primitives(&self, eg: &mut EGraph) {
add_primitive!(eg, "+" = |a: i64, b: i64| -?> i64 { a.checked_add(b) });
add_primitive!(eg, "-" = |a: i64, b: i64| -?> i64 { a.checked_sub(b) });
add_primitive!(eg, "*" = |a: i64, b: i64| -?> i64 { a.checked_mul(b) });
add_primitive!(eg, "/" = |a: i64, b: i64| -?> i64 { a.checked_div(b) });
add_primitive!(eg, "%" = |a: i64, b: i64| -?> i64 { a.checked_rem(b) });
add_primitive!(eg, "&" = |a: i64, b: i64| -> i64 { a & b });
add_primitive!(eg, "|" = |a: i64, b: i64| -> i64 { a | b });
add_primitive!(eg, "^" = |a: i64, b: i64| -> i64 { a ^ b });
add_primitive!(eg, "<<" = |a: i64, b: i64| -?> i64 { b.try_into().ok().and_then(|b| a.checked_shl(b)) });
add_primitive!(eg, ">>" = |a: i64, b: i64| -?> i64 { b.try_into().ok().and_then(|b| a.checked_shr(b)) });
add_primitive!(eg, "not-i64" = |a: i64| -> i64 { !a });
add_primitive!(eg, "log2" = |a: i64| -> i64 { a.ilog2() as i64 });
add_primitive!(eg, "<" = |a: i64, b: i64| -?> () { (a < b).then_some(()) });
add_primitive!(eg, ">" = |a: i64, b: i64| -?> () { (a > b).then_some(()) });
add_primitive!(eg, "<=" = |a: i64, b: i64| -?> () { (a <= b).then_some(()) });
add_primitive!(eg, ">=" = |a: i64, b: i64| -?> () { (a >= b).then_some(()) });
add_primitive!(eg, "bool-=" = |a: i64, b: i64| -> bool { a == b });
add_primitive!(eg, "bool-<" = |a: i64, b: i64| -> bool { a < b });
add_primitive!(eg, "bool->" = |a: i64, b: i64| -> bool { a > b });
add_primitive!(eg, "bool-<=" = |a: i64, b: i64| -> bool { a <= b });
add_primitive!(eg, "bool->=" = |a: i64, b: i64| -> bool { a >= b });
add_primitive!(eg, "min" = |a: i64, b: i64| -> i64 { a.min(b) });
add_primitive!(eg, "max" = |a: i64, b: i64| -> i64 { a.max(b) });
add_primitive!(eg, "to-string" = |a: i64| -> S { S::new(a.to_string()) });
add_primitive!(eg, "count-matches" = |a: S, b: S| -> i64 {
a.as_str().matches(b.as_str()).count() as i64
});
}
fn reconstruct_termdag(
&self,
base_values: &BaseValues,
value: Value,
termdag: &mut TermDag,
) -> TermId {
let i = base_values.unwrap::<i64>(value);
termdag.lit(Literal::Int(i))
}
}