libzeropool_zkbob/native/
boundednum.rs1
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}