use crate::pairing::ff::Field;
use crate::pairing::Engine;
use crate::SynthesisError;
use std::marker::PhantomData;
pub mod gates;
pub mod variable;
use self::gates::*;
use self::variable::*;
pub trait Circuit<E: Engine> {
fn synthesize<CS: ConstraintSystem<E>>(&self, cs: &mut CS) -> Result<(), SynthesisError>;
}
pub trait ConstraintSystem<E: Engine> {
fn alloc<F>(&mut self, value: F) -> Result<Variable, SynthesisError>
where
F: FnOnce() -> Result<E::Fr, SynthesisError>;
fn alloc_input<F>(&mut self, value: F) -> Result<Variable, SynthesisError>
where
F: FnOnce() -> Result<E::Fr, SynthesisError>;
fn enforce_boolean(&mut self, variable: Variable) -> Result<(), SynthesisError>;
fn new_gate(&mut self, variables: (Variable, Variable, Variable), coeffs: (E::Fr, E::Fr, E::Fr, E::Fr, E::Fr)) -> Result<(), SynthesisError>;
fn enforce_constant(&mut self, variable: Variable, constant: E::Fr) -> Result<(), SynthesisError>;
fn enforce_mul_2(&mut self, variables: (Variable, Variable)) -> Result<(), SynthesisError>;
fn enforce_mul_3(&mut self, variables: (Variable, Variable, Variable)) -> Result<(), SynthesisError>;
fn enforce_zero_2(&mut self, variables: (Variable, Variable), coeffs: (E::Fr, E::Fr)) -> Result<(), SynthesisError>;
fn enforce_zero_3(&mut self, variables: (Variable, Variable, Variable), coeffs: (E::Fr, E::Fr, E::Fr)) -> Result<(), SynthesisError>;
fn get_value(&self, _variable: Variable) -> Result<E::Fr, SynthesisError> {
Err(SynthesisError::AssignmentMissing)
}
fn get_dummy_variable(&self) -> Variable;
}