Skip to main content

zinc_uair/
dummy_semiring.rs

1use std::{
2    fmt::{Debug, Display},
3    iter::{Product, Sum},
4    ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign},
5};
6
7use crypto_primitives::FixedConfig;
8use num_traits::{CheckedAdd, CheckedMul, CheckedSub, ConstOne, ConstZero, One, Pow, Zero};
9
10/// A dummy type implementing the `Semiring` trait.
11/// Used for `ConstraintCounter` to have something
12/// that implements `Semiring` (and hence bridges to a `SemiringConfig` via
13/// `FixedConfig`) but has zero-cost operations. Can be used in other contexts
14/// where operations on expression should be ignored.
15#[derive(Clone, Copy, Default, Debug, PartialEq, Eq, Hash)]
16pub struct DummySemiring;
17
18impl Display for DummySemiring {
19    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
20        Debug::fmt(&self, f)
21    }
22}
23
24macro_rules! impl_binary_op {
25    ($trait:ident, $op:ident) => {
26        impl $trait<&DummySemiring> for DummySemiring {
27            type Output = Self;
28
29            #[inline(always)]
30            fn $op(self, _rhs: &DummySemiring) -> Self::Output {
31                DummySemiring
32            }
33        }
34
35        impl $trait<DummySemiring> for DummySemiring {
36            type Output = Self;
37
38            #[inline(always)]
39            fn $op(self, _rhs: DummySemiring) -> Self::Output {
40                DummySemiring
41            }
42        }
43    };
44}
45
46impl_binary_op!(Add, add);
47impl_binary_op!(Sub, sub);
48impl_binary_op!(Mul, mul);
49
50macro_rules! impl_op_assign {
51    ($trait:ident, $op:ident) => {
52        impl $trait<&DummySemiring> for DummySemiring {
53            #[inline(always)]
54            fn $op(&mut self, _rhs: &DummySemiring) {}
55        }
56
57        impl $trait<DummySemiring> for DummySemiring {
58            #[inline(always)]
59            fn $op(&mut self, _rhs: DummySemiring) {}
60        }
61    };
62}
63
64impl_op_assign!(AddAssign, add_assign);
65impl_op_assign!(SubAssign, sub_assign);
66impl_op_assign!(MulAssign, mul_assign);
67
68macro_rules! impl_checked_op {
69    ($trait:ident, $op:ident) => {
70        impl $trait for DummySemiring {
71            #[inline(always)]
72            fn $op(&self, _rhs: &Self) -> Option<Self> {
73                Some(DummySemiring)
74            }
75        }
76    };
77}
78
79impl_checked_op!(CheckedAdd, checked_add);
80impl_checked_op!(CheckedSub, checked_sub);
81impl_checked_op!(CheckedMul, checked_mul);
82
83impl Pow<u32> for DummySemiring {
84    type Output = Self;
85
86    fn pow(self, _rhs: u32) -> Self::Output {
87        DummySemiring
88    }
89}
90
91impl Sum for DummySemiring {
92    #[inline(always)]
93    fn sum<I: Iterator<Item = Self>>(_iter: I) -> Self {
94        DummySemiring
95    }
96}
97
98impl Product for DummySemiring {
99    #[inline(always)]
100    fn product<I: Iterator<Item = Self>>(_iter: I) -> Self {
101        DummySemiring
102    }
103}
104
105impl<'a> Sum<&'a DummySemiring> for DummySemiring {
106    #[inline(always)]
107    fn sum<I: Iterator<Item = &'a DummySemiring>>(_iter: I) -> Self {
108        DummySemiring
109    }
110}
111
112impl<'a> Product<&'a DummySemiring> for DummySemiring {
113    #[inline(always)]
114    fn product<I: Iterator<Item = &'a DummySemiring>>(_iter: I) -> Self {
115        DummySemiring
116    }
117}
118
119impl Zero for DummySemiring {
120    fn zero() -> Self {
121        DummySemiring
122    }
123
124    fn is_zero(&self) -> bool {
125        true
126    }
127}
128
129impl One for DummySemiring {
130    fn one() -> Self {
131        DummySemiring
132    }
133}
134
135impl ConstZero for DummySemiring {
136    const ZERO: Self = DummySemiring;
137}
138
139impl ConstOne for DummySemiring {
140    const ONE: Self = DummySemiring;
141}
142
143impl From<bool> for DummySemiring {
144    fn from(_value: bool) -> Self {
145        DummySemiring
146    }
147}
148
149pub type DummySemiringConfig = FixedConfig<DummySemiring>;
150pub static DUMMY_SEMIRING_CONFIG: FixedConfig<DummySemiring> = FixedConfig::const_default();