Add Array::get_sub_array(). This is useful when you only need to access a portion of the array.
diff --git a/src/lib.rs b/src/lib.rs index 9a21d2a..ff5d00b 100644 --- a/src/lib.rs +++ b/src/lib.rs
@@ -715,6 +715,24 @@ ptr: self.ptr, } } + + #[inline(always)] + pub fn get_sub_array<const NEW_LEN: usize>( + &self, + start_index: usize, + ) -> Option<Array<NEW_LEN, TItem>> { + assert!(NEW_LEN <= LEN); + let Some(end_index) = start_index.checked_add(NEW_LEN) else { + return None; + }; + if end_index > LEN { + return None; + } + Some(Array { + mmio: self.mmio, + ptr: unsafe { self.ptr.add(start_index) }, + }) + } } impl<const LEN: usize, TMmio: Mmio + Default, TItem: FromMmioPtr<TMmio = TMmio>> Array<LEN, TItem> { /// Creates a new Array from a raw register pointer. @@ -1078,6 +1096,40 @@ } #[test] + pub fn test_reg_array_subarray() { + let mut fake_mem = [0, 1, 2, 3, 4, 5, 6]; + let reg_array = unsafe { + Array::<4, RegRef<ReadWriteReg32<0, u32, u32>, RealMmioMut>>::new(fake_mem.as_mut_ptr()) + }; + let sub_array = reg_array.get_sub_array::<3>(1).unwrap(); + assert_eq!(sub_array.read(), [1, 2, 3]); + + let sub_array = reg_array.get_sub_array::<2>(2).unwrap(); + assert_eq!(sub_array.read(), [2, 3]); + + let sub_array = reg_array.get_sub_array::<4>(0).unwrap(); + assert_eq!(sub_array.read(), [0, 1, 2, 3]); + + let sub_array = reg_array.get_sub_array::<0>(0).unwrap(); + assert_eq!(sub_array.read(), []); + + assert!(reg_array.get_sub_array::<4>(1).is_none()); + + assert!(reg_array.get_sub_array::<1>(usize::MAX).is_none()); + assert!(reg_array.get_sub_array::<2>(usize::MAX).is_none()); + } + + #[test] + #[should_panic] + pub fn test_reg_array_subarray_panic() { + let mut fake_mem = [0, 1, 2, 3, 4, 5, 6]; + let reg_array = unsafe { + Array::<4, RegRef<ReadWriteReg32<0, u32, u32>, RealMmioMut>>::new(fake_mem.as_mut_ptr()) + }; + assert!(reg_array.get_sub_array::<5>(0).is_none()); + } + + #[test] pub fn test_reg_array_of_arrays() { let mut fake_mem = [0, 1, 2, 3, 4, 5, 6]; let reg_array = unsafe {