use crate::{
curves::PrimeField,
gadgets::{
r1cs::ConstraintSystem,
utilities::{
arithmetic::{Add, Neg, Sub},
int::Int64,
},
},
};
use snarkvm_errors::gadgets::SignedIntegerError;
macro_rules! sub_int_impl {
($($gadget: ident)*) => ($(
impl<F: PrimeField> Sub<F> for $gadget {
type ErrorType = SignedIntegerError;
fn sub<CS: ConstraintSystem<F>>(&self, mut cs: CS, other: &Self) -> Result<Self, Self::ErrorType> {
let other_neg = other.neg(cs.ns(|| format!("negate")))?;
self.add(cs.ns(|| format!("add_complement")), &other_neg)
}
}
)*)
}
sub_int_impl!(Int64);