1 //! The `bitcast` and `bitflags_bits` macros. 2 3 #![allow(unused_macros)] 4 5 // Ensure that the source and destination types are both primitive integer 6 // types and the same size, and then bitcast. 7 macro_rules! bitcast { 8 ($x:expr) => {{ 9 if false { 10 // Ensure the source and destinations are primitive integer types. 11 let _ = !$x; 12 let _ = $x as u8; 13 0 14 } else if false { 15 // Ensure that the source and destinations are the same size. 16 // SAFETY: This code is under an `if false`. 17 #[allow(unsafe_code, unused_unsafe, clippy::useless_transmute)] 18 unsafe { 19 ::core::mem::transmute($x) 20 } 21 } else { 22 // Do the conversion. 23 $x as _ 24 } 25 }}; 26 } 27 28 /// Return a [`bitcast`] of the value of `$x.bits()`, where `$x` is a 29 /// `bitflags` type. 30 macro_rules! bitflags_bits { 31 ($x:expr) => {{ 32 bitcast!($x.bits()) 33 }}; 34 } 35