pub struct Align( ::Alignment ) where Self: Aligned; pub trait Aligned { type Alignment; } impl Align where Self: Aligned { pub const fn new() -> Self { unsafe { core::mem::zeroed() } } } unsafe impl crate::data::Zeroed for Align where Self: Aligned {} impl Default for Align where Self: Aligned { fn default() -> Self { Self::new() } } macro_rules! gen_alignment { ($($alignment:literal),+) => { $( const _: () = { #[repr(align($alignment))] pub struct Anon; impl Aligned for Align<$alignment> { type Alignment = Anon; } assert!(align_of::>() == $alignment) }; )+ }; } gen_alignment!( 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912);