Skip to main content

zinc_utils/
ops_macros.rs

1#[macro_export]
2macro_rules! neg {
3    ($a:expr) => {
4        neg!($a, "Negation overflow")
5    };
6    ($a:expr, $msg:expr) => {
7        num_traits::CheckedNeg::checked_neg(&$a).expect($msg)
8    };
9}
10
11#[macro_export]
12macro_rules! add {
13    ($a:expr, $b:expr) => {
14        add!($a, $b, "Addition overflow")
15    };
16    ($a:expr, $b:expr, $msg:expr) => {
17        num_traits::CheckedAdd::checked_add(&$a, &$b).expect($msg)
18    };
19}
20
21#[macro_export]
22macro_rules! sub {
23    ($a:expr, $b:expr) => {
24        sub!($a, $b, "Subtraction overflow")
25    };
26    ($a:expr, $b:expr, $msg:expr) => {
27        num_traits::CheckedSub::checked_sub(&$a, &$b).expect($msg)
28    };
29}
30
31#[macro_export]
32macro_rules! mul {
33    ($a:expr, $b:expr) => {
34        mul!($a, $b, "Multiplication overflow")
35    };
36    ($a:expr, $b:expr, $msg:expr) => {
37        num_traits::CheckedMul::checked_mul(&$a, &$b).expect($msg)
38    };
39}
40
41#[macro_export]
42macro_rules! div {
43    ($a:expr, $b:expr) => {
44        div!($a, $b, "Division by zero")
45    };
46    ($a:expr, $b:expr, $msg:expr) => {
47        num_traits::CheckedDiv::checked_div(&$a, &$b).expect($msg)
48    };
49}
50
51#[macro_export]
52macro_rules! rem {
53    ($a:expr, $b:expr) => {
54        rem!($a, $b, "Division by zero")
55    };
56    ($a:expr, $b:expr, $msg:expr) => {
57        num_traits::CheckedRem::checked_rem(&$a, &$b).expect($msg)
58    };
59}
60
61#[macro_export]
62macro_rules! ilog_round_up {
63    ($a:expr, $tp: ty) => {{
64        let res = if $a.is_power_of_two() {
65            $a.ilog2()
66        } else {
67            add!($a.ilog2(), 1)
68        };
69        <$tp>::try_from(res).expect(concat!("ilog doesn't fit ", stringify!($tp)))
70    }};
71}