1#[doc(hidden)]
5#[macro_export]
6macro_rules! const_assert_n {
7    ($n:expr, $($arg:tt)*) => {{
8        mod __const_assert {
10            pub(super) struct Assert<const N: usize>;
11
12            impl<const N: usize> Assert<N> {
13                pub(super) const ASSERT: () = assert!($($arg)*);
14            }
15        }
16
17        __const_assert::Assert::<$n>::ASSERT
18    }};
19}
20
21#[macro_export]
27macro_rules! const_assert_eq {
28    ($left:expr, $right:expr $(,)?) => (
29        $crate::const_assert_n!($left, $left == $right)
30    );
31    ($left:expr, $right:expr, $($arg:tt)+) => (
32        $crate::const_assert_n!($left, $left == $right, $($arg)+)
33    );
34}
35
36#[macro_export]
42macro_rules! const_assert_ne {
43    ($left:expr, $right:expr $(,)?) => (
44        $crate::const_assert_n!($left, $left != $right)
45    );
46    ($left:expr, $right:expr, $($arg:tt)+) => (
47        $crate::const_assert_n!($left, $left != $right, $($arg)+)
48    );
49}
50
51#[macro_export]
54macro_rules! nlimbs {
55    ($bits:expr) => {
56        $bits / $crate::Limb::BITS
57    };
58}
59
60#[cfg(test)]
61mod tests {
62    #[cfg(target_pointer_width = "32")]
63    #[test]
64    fn nlimbs_for_bits_macro() {
65        assert_eq!(nlimbs!(64), 2);
66        assert_eq!(nlimbs!(128), 4);
67        assert_eq!(nlimbs!(192), 6);
68        assert_eq!(nlimbs!(256), 8);
69    }
70
71    #[cfg(target_pointer_width = "64")]
72    #[test]
73    fn nlimbs_for_bits_macro() {
74        assert_eq!(nlimbs!(64), 1);
75        assert_eq!(nlimbs!(128), 2);
76        assert_eq!(nlimbs!(192), 3);
77        assert_eq!(nlimbs!(256), 4);
78    }
79}