diff --git a/lib/utils/src/array.rs b/lib/utils/src/array.rs new file mode 100644 index 0000000..92e591e --- /dev/null +++ b/lib/utils/src/array.rs @@ -0,0 +1,17 @@ +pub fn cast_arr_mut(slice: &mut [T]) -> &mut [U] { + assert_eq!(slice.len() % core::mem::align_of::(), 0); + + let len = core::mem::size_of_val(slice) / core::mem::size_of::(); + let ptr = slice.as_mut_ptr() as *mut U; + + unsafe { core::slice::from_raw_parts_mut(ptr, len) } +} + +pub fn cast_arr(slice: &[T]) -> &[U] { + assert_eq!(slice.len() % core::mem::align_of::(), 0); + + let len = core::mem::size_of_val(slice) / core::mem::size_of::(); + let ptr = slice.as_ptr() as *const U; + + unsafe { core::slice::from_raw_parts(ptr, len) } +} diff --git a/lib/utils/src/lib.rs b/lib/utils/src/lib.rs index 51c08a8..e8710b3 100644 --- a/lib/utils/src/lib.rs +++ b/lib/utils/src/lib.rs @@ -3,6 +3,7 @@ #![feature(step_trait)] pub mod addr; +pub mod array; pub mod assert; pub mod atomic; pub mod bin;