gmsol_utils/
dynamic_access.rs

1use std::mem::size_of;
2
3use bytemuck::Pod;
4
5/// Get at index.
6pub fn get<T: Pod>(data: &[u8], index: usize) -> Option<&T> {
7    let start = index.checked_mul(size_of::<T>())?;
8    let end = start.checked_add(size_of::<T>())?;
9    if data.len() < end {
10        None
11    } else {
12        Some(bytemuck::from_bytes(&data[start..end]))
13    }
14}
15
16/// Get mutablely at index.
17pub fn get_mut<T: Pod>(data: &mut [u8], index: usize) -> Option<&mut T> {
18    let start = index.checked_mul(size_of::<T>())?;
19    let end = start.checked_add(size_of::<T>())?;
20    if data.len() < end {
21        None
22    } else {
23        Some(bytemuck::from_bytes_mut(&mut data[start..end]))
24    }
25}