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}