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
142
143
144
145
146
147
148
149
150
151
152
153
pub use snarkvm_gadgets::traits::utilities::integer::Integer as IntegerTrait;
#[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_unsigned_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,
_ => None,
}
};
}
#[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::unsigned(e, $span))?))
}
(Integer::U16($a), Integer::U16($b)) => {
Some(Integer::U16($expression.map_err(|e| IntegerError::unsigned(e, $span))?))
}
(Integer::U32($a), Integer::U32($b)) => {
Some(Integer::U32($expression.map_err(|e| IntegerError::unsigned(e, $span))?))
}
(Integer::U64($a), Integer::U64($b)) => {
Some(Integer::U64($expression.map_err(|e| IntegerError::unsigned(e, $span))?))
}
(Integer::U128($a), Integer::U128($b)) => Some(Integer::U128(
$expression.map_err(|e| IntegerError::unsigned(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,
}
};
}
macro_rules! allocate_type {
($rust_ty:ty, $gadget_ty:ty, $leo_ty:path, $cs:expr, $name:expr, $option:expr, $span:expr) => {{
let option = $option.map(|s| {
s.parse::<$rust_ty>()
.map_err(|_| IntegerError::invalid_integer(s, $span))
.unwrap()
});
let result = <$gadget_ty>::alloc(
$cs.ns(|| {
format!(
"`{}: {}` {}:{}",
$name,
stringify!($rust_ty),
$span.line_start,
$span.col_start
)
}),
|| option.ok_or(SynthesisError::AssignmentMissing),
)
.map_err(|_| IntegerError::missing_integer(format!("{}: {}", $name, stringify!($rust_ty)), $span))?;
$leo_ty(result)
}};
}