#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub(crate) enum WireData {
Left(usize),
Right(usize),
Output(usize),
Fourth(usize),
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct Witness {
index: usize,
}
impl Default for Witness {
fn default() -> Self {
crate::composer::Composer::ZERO
}
}
impl Witness {
pub const ONE: Witness = Witness::new(1);
pub const ZERO: Witness = Witness::new(0);
pub(crate) const fn new(index: usize) -> Self {
Self { index }
}
pub const fn index(&self) -> usize {
self.index
}
}
#[cfg(feature = "zeroize")]
impl zeroize::DefaultIsZeroes for Witness {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn witness_constants_and_default_are_consistent() {
assert_eq!(Witness::ZERO.index(), 0);
assert_eq!(Witness::ONE.index(), 1);
assert_eq!(Witness::default(), Witness::ZERO);
}
#[test]
fn wire_data_variants_are_distinct_and_debuggable() {
let a = WireData::Left(0);
let b = WireData::Right(0);
let c = WireData::Output(0);
let d = WireData::Fourth(0);
assert_ne!(a, b);
assert_ne!(b, c);
assert_ne!(c, d);
let _ = format!("{a:?}{b:?}{c:?}{d:?}");
match a {
WireData::Left(i) => assert_eq!(i, 0),
_ => panic!("expected Left"),
}
}
}