aboutsummaryrefslogtreecommitdiff
path: root/src/align16.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/align16.rs')
-rw-r--r--src/align16.rs27
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));
+}