Skip to main content

leodos_libcfs/macros/
asserts.rs

1//! Compile-time assertions for type size and alignment.
2
3/// Asserts at compile-time that `size_of::<T>() <= limit`.
4/// Works inside generic functions with const generics.
5#[macro_export]
6macro_rules! comptime_assert_size_le {
7    ($type:ty, $limit:expr) => {{
8        trait SizeCheck {
9            const CHECK: ();
10        }
11        impl<T, const N: usize> SizeCheck for (T, [(); N]) {
12            const CHECK: () = {
13                if core::mem::size_of::<T>() > N {
14                    panic!("type size exceeds limit");
15                }
16            };
17        }
18        let _ = <($type, [(); $limit]) as SizeCheck>::CHECK;
19    }};
20}
21
22/// Asserts at compile-time that `align_of::<T>() <= limit`.
23/// Works inside generic functions with const generics.
24#[macro_export]
25macro_rules! comptime_assert_align_le {
26    ($type:ty, $limit:expr) => {{
27        trait AlignCheck {
28            const CHECK: ();
29        }
30        impl<T, const N: usize> AlignCheck for (T, [(); N]) {
31            const CHECK: () = {
32                if core::mem::align_of::<T>() > N {
33                    panic!("type alignment exceeds limit");
34                }
35            };
36        }
37        let _ = <($type, [(); $limit]) as AlignCheck>::CHECK;
38    }};
39}