use crate::{ bits::{boolean::Boolean, uint8::UInt8}, Vec, }; use algebra::Field; use r1cs_core::SynthesisError; pub mod boolean; pub mod uint8; #[macro_use] pub mod uint; make_uint!(UInt16, 16, u16, uint16); make_uint!(UInt32, 32, u32, uint32); make_uint!(UInt64, 64, u64, uint64); pub trait ToBitsGadget { /// Outputs the canonical bit-wise representation of `self`. /// /// This is the correct default for 99% of use cases. fn to_bits(&self) -> Result>, SynthesisError>; /// Outputs a possibly non-unique bit-wise representation of `self`. /// /// If you're not absolutely certain that your usecase can get away with a /// non-canonical representation, please use `self.to_bits(cs)` instead. fn to_non_unique_bits(&self) -> Result>, SynthesisError> { self.to_bits() } } impl ToBitsGadget for Boolean { fn to_bits(&self) -> Result>, SynthesisError> { Ok(vec![self.clone()]) } } impl ToBitsGadget for [Boolean] { fn to_bits(&self) -> Result>, SynthesisError> { Ok(self.to_vec()) } } impl ToBitsGadget for Vec> { fn to_bits(&self) -> Result>, SynthesisError> { Ok(self.clone()) } } impl ToBitsGadget for UInt8 { fn to_bits(&self) -> Result>, SynthesisError> { Ok(self.into_bits_le()) } } impl ToBitsGadget for [UInt8] { fn to_bits(&self) -> Result>, SynthesisError> { let mut result = Vec::with_capacity(&self.len() * 8); for byte in self { result.extend_from_slice(&byte.into_bits_le()); } Ok(result) } } impl ToBitsGadget for Vec> { fn to_bits(&self) -> Result>, SynthesisError> { let mut result = Vec::with_capacity(&self.len() * 8); for byte in self { result.extend_from_slice(&byte.into_bits_le()); } Ok(result) } } pub trait ToBytesGadget { /// Outputs a canonical byte-wise representation of `self`. /// /// This is the correct default for 99% of use cases. fn to_bytes(&self) -> Result>, SynthesisError>; /// Outputs a possibly non-unique byte decomposition of `self`. /// /// If you're not absolutely certain that your usecase can get away with a /// non-canonical representation, please use `self.to_bytes(cs)` instead. fn to_non_unique_bytes(&self) -> Result>, SynthesisError> { self.to_bytes() } } impl ToBytesGadget for [UInt8] { fn to_bytes(&self) -> Result>, SynthesisError> { Ok(self.to_vec()) } } impl<'a, F: Field, T: 'a + ToBytesGadget> ToBytesGadget for &'a T { fn to_bytes(&self) -> Result>, SynthesisError> { (*self).to_bytes() } } impl<'a, F: Field> ToBytesGadget for &'a [UInt8] { fn to_bytes(&self) -> Result>, SynthesisError> { Ok(self.to_vec()) } }