diff options
Diffstat (limited to 'src/align16.rs')
-rw-r--r-- | src/align16.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/align16.rs b/src/align16.rs new file mode 100644 index 0000000..4e0e725 --- /dev/null +++ b/src/align16.rs @@ -0,0 +1,27 @@ +#[derive(Clone, Copy, Default, PartialEq, PartialOrd)] +#[repr(C, align(16))] +pub(crate) struct Align16<T>(pub T); + +impl<T> Align16<T> { + #[allow(dead_code)] + pub fn as_ptr(&self) -> *const T { + &self.0 + } + + #[allow(dead_code)] + pub fn as_mut_ptr(&mut self) -> *mut T { + &mut self.0 + } +} + +#[test] +fn test_align16() { + use core::{mem, ptr}; + let mut a = Align16::<f32>(1.0); + assert_eq!(mem::align_of_val(&a), 16); + unsafe { + assert_eq!(ptr::read(a.as_ptr()).to_bits(), f32::to_bits(1.0)); + ptr::write(a.as_mut_ptr(), -1.0); + } + assert_eq!(a.0.to_bits(), f32::to_bits(-1.0)); +} |