zinc_uair/
dummy_semiring.rs1use 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#[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();