/// Asserts that the types' alignments are equal. /// /// This is useful when ensuring that pointer arithmetic is done correctly, or /// when [FFI] requires a type to have the same alignment as some foreign type. /// /// # Examples /// /// A `usize` has the same alignment as any pointer type: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_eq!(usize, *const u8, *mut u8); /// ``` /// /// The following passes because `[i32; 4]` has the same alignment as `i32`: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_eq!([i32; 4], i32); /// ``` /// /// The following example fails to compile because `i32x4` explicitly has 4 /// times the alignment as `[i32; 4]`: /// /// ```compile_fail /// # #[macro_use] extern crate static_assertions; fn main() {} /// # #[allow(non_camel_case_types)] /// #[repr(align(16))] /// struct i32x4([i32; 4]); /// /// assert_align_eq!(i32x4, [i32; 4]); /// ``` /// /// [FFI]: https://en.wikipedia.org/wiki/Foreign_function_interface #[macro_export(local_inner_macros)] macro_rules! assert_align_eq { ($x:ty, $($y:ty),+ $(,)?) => { const _: fn() = || { use $crate::_core::mem::align_of; const_assert_eq_usize!(align_of::<$x>() $(, align_of::<$y>())+); }; }; } /// Asserts that the types' alignments are equal. /// /// This macro has been deprecated in favor of /// [`assert_align_eq!`](macro.assert_align_eq.html). #[deprecated( since = "1.2.0", note = "Please use the 'assert_align_eq' macro instead" )] #[macro_export(local_inner_macros)] macro_rules! assert_eq_align { ($($t:tt)*) => { assert_align_eq!($($t)*); }; } /// Asserts that the types' alignments are **not** equal. /// /// # Examples /// /// A `u8` does not have the same alignment as a pointer: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_ne!(u8, *const u8); /// ``` /// /// The following example fails to compile because a `usize` has the same /// alignment as a pointer: /// /// ```compile_fail /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_ne!(*const u8, usize); /// ``` #[macro_export(local_inner_macros)] macro_rules! assert_align_ne { ($x:ty, $($y:ty),+ $(,)?) => { const _: fn() = || { use $crate::_core::mem::align_of; const_assert_ne!(align_of::<$x>() $(, align_of::<$y>())+); }; }; } /// Asserts that the types' alignments are less than each other. /// /// # Examples /// /// A `u8` has smaller alignment than `u16`, which has smaller alignment than /// a pointer: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_lt!(u8, u16, *const u8); /// ``` /// /// The following example fails to compile because a `usize` has the same /// alignment as a pointer: /// /// ```compile_fail /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_lt!(*const u8, usize); /// ``` #[macro_export(local_inner_macros)] macro_rules! assert_align_lt { ($x:ty, $($y:ty),+ $(,)?) => { const _: fn() = || { use $crate::_core::mem::align_of; const_assert_lt!(align_of::<$x>() $(, align_of::<$y>())+); }; }; } /// Asserts that the types' alignments are less than or equal to each other. /// /// # Examples /// /// A `u8` and `i8` have smaller alignment than any pointer type: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_le!(u8, i8, *const u8); /// ``` /// /// The following example fails to compile because a `usize` has greater /// alignment than `u8`: /// /// ```compile_fail /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_le!(usize, u8); /// ``` #[macro_export(local_inner_macros)] macro_rules! assert_align_le { ($x:ty, $($y:ty),+ $(,)?) => { const _: fn() = || { use $crate::_core::mem::align_of; const_assert_le!(align_of::<$x>() $(, align_of::<$y>())+); }; }; } /// Asserts that the types' alignments are greater than each other. /// /// # Examples /// /// A pointer has greater alignment than `u16`, which has greater alignment than /// `u8`: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_gt!(*const u8, u16, u8); /// ``` /// /// The following example fails to compile because a `usize` has the same /// alignment as a pointer: /// /// ```compile_fail /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_gt!(*const u8, usize); /// ``` #[macro_export(local_inner_macros)] macro_rules! assert_align_gt { ($x:ty, $($y:ty),+ $(,)?) => { const _: fn() = || { use $crate::_core::mem::align_of; const_assert_gt!(align_of::<$x>() $(, align_of::<$y>())+); }; }; } /// Asserts that the types' alignments are greater than or equal to each other. /// /// # Examples /// /// A pointer has greater alignment than `u8` and `i8`: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_ge!(*const u8, u8, i8); /// ``` /// /// The following example fails to compile because a `u8` has smaller alignment /// than `usize`: /// /// ```compile_fail /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_align_ge!(u8, usize); /// ``` #[macro_export(local_inner_macros)] macro_rules! assert_align_ge { ($x:ty, $($y:ty),+ $(,)?) => { const _: fn() = || { use $crate::_core::mem::align_of; const_assert_ge!(align_of::<$x>() $(, align_of::<$y>())+); }; }; }