use core::mem; #[doc(hidden)] pub struct Layout(T); #[doc(hidden)] pub trait LayoutUnsized { const SIZE: usize = usize::MAX; const ALIGN: usize = usize::MAX; } impl LayoutUnsized for Layout {} impl Layout { pub const SIZE: usize = mem::size_of::(); pub const ALIGN: usize = mem::align_of::(); } #[doc(hidden)] #[inline] pub fn assert_layout( name: &'static str, outer_size: usize, inner_size: usize, outer_align: usize, inner_align: usize, ) { if outer_size != inner_size { #[cfg(no_intrinsic_type_name)] panic!( "unexpected size in cast to {}: {} != {}", name, outer_size, inner_size, ); #[cfg(not(no_intrinsic_type_name))] panic!( "unexpected size in cast from {} to {}: {} != {}", core::any::type_name::(), core::any::type_name::(), inner_size, outer_size, ); } if outer_align != inner_align { #[cfg(no_intrinsic_type_name)] panic!( "unexpected alignment in cast to {}: {} != {}", name, outer_align, inner_align, ); #[cfg(not(no_intrinsic_type_name))] panic!( "unexpected alignment in cast from {} to {}: {} != {}", core::any::type_name::(), core::any::type_name::(), inner_align, outer_align, ); } #[cfg(not(no_intrinsic_type_name))] let _ = name; }