use crate::String; use algebra::Field; use r1cs_core::{ConstraintSystem, Index, LinearCombination, SynthesisError, Variable}; /// Constraint counter for testing purposes. pub struct TestConstraintCounter { pub num_inputs: usize, pub num_aux: usize, pub num_constraints: usize, } impl TestConstraintCounter { pub fn new() -> TestConstraintCounter { TestConstraintCounter { num_aux: 0, num_inputs: 0, num_constraints: 0, } } pub fn num_constraints(&self) -> usize { self.num_constraints } } impl ConstraintSystem for TestConstraintCounter { type Root = Self; fn alloc(&mut self, _: A, _: F) -> Result where F: FnOnce() -> Result, A: FnOnce() -> AR, AR: Into, { let var = Variable::new_unchecked(Index::Aux(self.num_aux)); self.num_aux += 1; Ok(var) } fn alloc_input(&mut self, _: A, _: F) -> Result where F: FnOnce() -> Result, A: FnOnce() -> AR, AR: Into, { let var = Variable::new_unchecked(Index::Input(self.num_inputs)); self.num_inputs += 1; Ok(var) } fn enforce(&mut self, _: A, _: LA, _: LB, _: LC) where A: FnOnce() -> AR, AR: Into, LA: FnOnce(LinearCombination) -> LinearCombination, LB: FnOnce(LinearCombination) -> LinearCombination, LC: FnOnce(LinearCombination) -> LinearCombination, { self.num_constraints += 1; } fn push_namespace(&mut self, _: N) where NR: Into, N: FnOnce() -> NR, {} fn pop_namespace(&mut self) { } fn get_root(&mut self) -> &mut Self::Root { self } fn num_constraints(&self) -> usize { self.num_constraints } }