libzeropool_zkbob/native/
boundednum.rs

1
2use crate::fawkes_crypto::ff_uint::{PrimeField, Num, NumRepr};
3
4
5#[derive(Clone, Debug)]
6pub struct BoundedNum<Fr:PrimeField, const L: usize>(pub(crate)Num<Fr>);
7
8impl<Fr:PrimeField, const L: usize> Copy for BoundedNum<Fr, L> {}
9
10impl<Fr:PrimeField, const L: usize> Eq for BoundedNum<Fr, L> {}
11
12impl<Fr:PrimeField, const L: usize> PartialEq for BoundedNum<Fr, L> {
13    #[inline]
14    fn eq(&self, other: &Self) -> bool {
15        self.0.eq(&other.0)
16    }
17}
18
19
20impl<Fr:PrimeField, const L: usize> BoundedNum<Fr, L> {
21    pub const ONE: Self = BoundedNum(Num::<Fr>::ONE);
22    pub const ZERO: Self = BoundedNum(Num::<Fr>::ZERO);
23
24    pub fn new(n:Num<Fr>) -> Self {
25        assert!(L < Fr::MODULUS_BITS as usize && n.to_uint() < (NumRepr::<Fr::Inner>::ONE << L as u32));
26        Self::new_unchecked(n)
27    }
28
29    pub fn new_trimmed(n:Num<Fr>) -> Self {
30        assert!((L as u32) < Fr::MODULUS_BITS);
31        let t = Num::from_uint_unchecked(n.to_uint() & ((NumRepr::<Fr::Inner>::ONE << L as u32) - NumRepr::<Fr::Inner>::ONE));
32        Self::new_unchecked(t)
33    }
34
35    pub fn new_unchecked(n:Num<Fr>) -> Self {
36        Self(n)
37    }
38
39    pub fn as_num(&self) -> &Num<Fr> {
40        &self.0
41    }
42
43    pub fn to_num(&self) -> Num<Fr> {
44        self.0
45    }
46}