1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
use leo_gadgets::signed_integer::*;
use snarkos_models::gadgets::utilities::{
boolean::Boolean,
uint::{UInt128, UInt16, UInt32, UInt64, UInt8},
};
use std::fmt::Debug;
pub trait IntegerTrait: Sized + Clone + Debug {
fn get_value(&self) -> Option<String>;
fn get_bits(&self) -> Vec<Boolean>;
}
macro_rules! integer_trait_impl {
($($gadget: ident)*) => ($(
impl IntegerTrait for $gadget {
fn get_value(&self) -> Option<String> {
self.value.map(|num| num.to_string())
}
fn get_bits(&self) -> Vec<Boolean> {
self.bits.clone()
}
}
)*)
}
integer_trait_impl!(UInt8 UInt16 UInt32 UInt64 UInt128 Int8 Int16 Int32 Int64 Int128);
#[macro_export]
macro_rules! match_integer {
($integer: ident => $expression: expr) => {
match $integer {
Integer::U8($integer) => $expression,
Integer::U16($integer) => $expression,
Integer::U32($integer) => $expression,
Integer::U64($integer) => $expression,
Integer::U128($integer) => $expression,
Integer::I8($integer) => $expression,
Integer::I16($integer) => $expression,
Integer::I32($integer) => $expression,
Integer::I64($integer) => $expression,
Integer::I128($integer) => $expression,
}
};
}
#[macro_export]
macro_rules! match_signed_integer {
($integer: ident, $span: ident => $expression: expr) => {
match $integer {
Integer::I8($integer) => Some(Integer::I8($expression.map_err(|e| IntegerError::signed(e, $span))?)),
Integer::I16($integer) => Some(Integer::I16($expression.map_err(|e| IntegerError::signed(e, $span))?)),
Integer::I32($integer) => Some(Integer::I32($expression.map_err(|e| IntegerError::signed(e, $span))?)),
Integer::I64($integer) => Some(Integer::I64($expression.map_err(|e| IntegerError::signed(e, $span))?)),
Integer::I128($integer) => Some(Integer::I128($expression.map_err(|e| IntegerError::signed(e, $span))?)),
_ => None,
}
};
}
#[macro_export]
macro_rules! match_integers {
(($a: ident, $b: ident) => $expression:expr) => {
match ($a, $b) {
(Integer::U8($a), Integer::U8($b)) => Some($expression?),
(Integer::U16($a), Integer::U16($b)) => Some($expression?),
(Integer::U32($a), Integer::U32($b)) => Some($expression?),
(Integer::U64($a), Integer::U64($b)) => Some($expression?),
(Integer::U128($a), Integer::U128($b)) => Some($expression?),
(Integer::I8($a), Integer::I8($b)) => Some($expression?),
(Integer::I16($a), Integer::I16($b)) => Some($expression?),
(Integer::I32($a), Integer::I32($b)) => Some($expression?),
(Integer::I64($a), Integer::I64($b)) => Some($expression?),
(Integer::I128($a), Integer::I128($b)) => Some($expression?),
(_, _) => None,
}
};
}
#[macro_export]
macro_rules! match_integers_span {
(($a: ident, $b: ident), $span: ident => $expression:expr) => {
match ($a, $b) {
(Integer::U8($a), Integer::U8($b)) => {
Some(Integer::U8($expression.map_err(|e| IntegerError::synthesis(e, $span))?))
}
(Integer::U16($a), Integer::U16($b)) => Some(Integer::U16(
$expression.map_err(|e| IntegerError::synthesis(e, $span))?,
)),
(Integer::U32($a), Integer::U32($b)) => Some(Integer::U32(
$expression.map_err(|e| IntegerError::synthesis(e, $span))?,
)),
(Integer::U64($a), Integer::U64($b)) => Some(Integer::U64(
$expression.map_err(|e| IntegerError::synthesis(e, $span))?,
)),
(Integer::U128($a), Integer::U128($b)) => Some(Integer::U128(
$expression.map_err(|e| IntegerError::synthesis(e, $span))?,
)),
(Integer::I8($a), Integer::I8($b)) => {
Some(Integer::I8($expression.map_err(|e| IntegerError::signed(e, $span))?))
}
(Integer::I16($a), Integer::I16($b)) => {
Some(Integer::I16($expression.map_err(|e| IntegerError::signed(e, $span))?))
}
(Integer::I32($a), Integer::I32($b)) => {
Some(Integer::I32($expression.map_err(|e| IntegerError::signed(e, $span))?))
}
(Integer::I64($a), Integer::I64($b)) => {
Some(Integer::I64($expression.map_err(|e| IntegerError::signed(e, $span))?))
}
(Integer::I128($a), Integer::I128($b)) => {
Some(Integer::I128($expression.map_err(|e| IntegerError::signed(e, $span))?))
}
(_, _) => None,
}
};
}