support IntCmp with primitive integer types
This commit is contained in:
parent
422330d195
commit
5707ede2ae
|
@ -784,38 +784,17 @@ macro_rules! cmp_op {
|
|||
CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>,
|
||||
CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>,
|
||||
>,
|
||||
Rhs: Value<Type = RhsType>,
|
||||
Lhs: Value<Type = LhsType>,
|
||||
> IntCmp<Expr<Rhs>> for Expr<Lhs>
|
||||
{
|
||||
type Output = Expr<UInt<1>>;
|
||||
|
||||
$(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output {
|
||||
$CmpOp::<LhsType, RhsType, UIntType<1>>::new_unchecked(
|
||||
self.canonical(),
|
||||
rhs.canonical(),
|
||||
).to_expr()
|
||||
})*
|
||||
}
|
||||
|
||||
impl<
|
||||
LhsType: IntTypeTrait<
|
||||
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||
>,
|
||||
RhsType: IntTypeTrait<
|
||||
Signed = LhsType::Signed,
|
||||
CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>,
|
||||
CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>,
|
||||
>,
|
||||
Rhs: Value<Type = RhsType>,
|
||||
Rhs: ToExpr<Type = RhsType>,
|
||||
Lhs: Value<Type = LhsType>,
|
||||
> IntCmp<Rhs> for Expr<Lhs>
|
||||
{
|
||||
type Output = Expr<UInt<1>>;
|
||||
|
||||
$(fn $fn(self, rhs: Rhs) -> Self::Output {
|
||||
self.$fn(rhs.to_expr())
|
||||
$CmpOp::<LhsType, RhsType, UIntType<1>>::new_unchecked(
|
||||
self.canonical(),
|
||||
rhs.to_expr().canonical(),
|
||||
).to_expr()
|
||||
})*
|
||||
}
|
||||
|
||||
|
@ -829,11 +808,11 @@ macro_rules! cmp_op {
|
|||
CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>,
|
||||
CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>,
|
||||
>,
|
||||
Rhs: Value<Type = RhsType>,
|
||||
> IntCmp<Expr<Rhs>> for IntValue<LhsType> {
|
||||
Rhs: ToExpr<Type = RhsType>,
|
||||
> IntCmp<Rhs> for IntValue<LhsType> {
|
||||
type Output = Expr<UInt<1>>;
|
||||
|
||||
$(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output {
|
||||
$(fn $fn(self, rhs: Rhs) -> Self::Output {
|
||||
self.to_expr().$fn(rhs)
|
||||
})*
|
||||
}
|
||||
|
|
|
@ -860,6 +860,47 @@ pub trait IntCmp<Rhs> {
|
|||
fn cmp_ge(self, rhs: Rhs) -> Self::Output;
|
||||
}
|
||||
|
||||
macro_rules! forward_prim_int_cmp {
|
||||
($prim_ty:ident) => {
|
||||
impl<Rhs> IntCmp<Rhs> for $prim_ty
|
||||
where
|
||||
IntValue<<$prim_ty as ToExpr>::Type>: IntCmp<Rhs>,
|
||||
{
|
||||
type Output = <IntValue<<$prim_ty as ToExpr>::Type> as IntCmp<Rhs>>::Output;
|
||||
fn cmp_eq(self, rhs: Rhs) -> Self::Output {
|
||||
IntValue::<<$prim_ty as ToExpr>::Type>::from(self).cmp_eq(rhs)
|
||||
}
|
||||
fn cmp_ne(self, rhs: Rhs) -> Self::Output {
|
||||
IntValue::<<$prim_ty as ToExpr>::Type>::from(self).cmp_ne(rhs)
|
||||
}
|
||||
fn cmp_lt(self, rhs: Rhs) -> Self::Output {
|
||||
IntValue::<<$prim_ty as ToExpr>::Type>::from(self).cmp_lt(rhs)
|
||||
}
|
||||
fn cmp_le(self, rhs: Rhs) -> Self::Output {
|
||||
IntValue::<<$prim_ty as ToExpr>::Type>::from(self).cmp_le(rhs)
|
||||
}
|
||||
fn cmp_gt(self, rhs: Rhs) -> Self::Output {
|
||||
IntValue::<<$prim_ty as ToExpr>::Type>::from(self).cmp_gt(rhs)
|
||||
}
|
||||
fn cmp_ge(self, rhs: Rhs) -> Self::Output {
|
||||
IntValue::<<$prim_ty as ToExpr>::Type>::from(self).cmp_ge(rhs)
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
forward_prim_int_cmp!(bool);
|
||||
forward_prim_int_cmp!(u8);
|
||||
forward_prim_int_cmp!(u16);
|
||||
forward_prim_int_cmp!(u32);
|
||||
forward_prim_int_cmp!(u64);
|
||||
forward_prim_int_cmp!(u128);
|
||||
forward_prim_int_cmp!(i8);
|
||||
forward_prim_int_cmp!(i16);
|
||||
forward_prim_int_cmp!(i32);
|
||||
forward_prim_int_cmp!(i64);
|
||||
forward_prim_int_cmp!(i128);
|
||||
|
||||
mod sealed {
|
||||
pub trait Sealed {}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue