# HG changeset patch # User alfadur # Date 1567022020 -10800 # Node ID 27915135f87fcfbe54680a13939d8eb712d47877 # Parent 6f4c14dfa4297ba7a85d149187a1e3ca34a957ed allow iterating with gear id diff -r 6f4c14dfa429 -r 27915135f87f rust/hwphysics/src/data.rs --- a/rust/hwphysics/src/data.rs Wed Aug 28 18:36:37 2019 +0200 +++ b/rust/hwphysics/src/data.rs Wed Aug 28 22:53:40 2019 +0300 @@ -11,7 +11,7 @@ pub trait TypeTuple: Sized { fn get_types(types: &mut Vec); - unsafe fn iter(slices: &[*mut u8], count: usize, mut f: F); + unsafe fn iter(slices: &[*mut u8], count: usize, mut f: F); } macro_rules! type_tuple_impl { @@ -21,10 +21,11 @@ $(types.push(TypeId::of::<$t>()));+ } - unsafe fn iter(slices: &[*mut u8], count: usize, mut f: F) { + unsafe fn iter(slices: &[*mut u8], count: usize, mut f: F) { for i in 0..count { unsafe { - f(($(&*(*slices.get_unchecked($n) as *mut $t).add(i)),+,)); + f(*(*slices.get_unchecked(0) as *const GearId).add(i), + ($(&*(*slices.get_unchecked($n + 1) as *mut $t).add(i)),+,)); } } } @@ -35,10 +36,11 @@ $(types.push(TypeId::of::<$t>()));+ } - unsafe fn iter(slices: &[*mut u8], count: usize, mut f: F) { + unsafe fn iter(slices: &[*mut u8], count: usize, mut f: F) { for i in 0..count { unsafe { - f(($(&mut *(*slices.get_unchecked($n) as *mut $t).add(i)),+,)); + f(*(*slices.get_unchecked(0) as *const GearId).add(i), + ($(&mut *(*slices.get_unchecked($n + 1) as *mut $t).add(i)),+,)); } } } @@ -155,7 +157,7 @@ } #[derive(Clone, Copy, Debug, Default)] -pub struct LookupEntry { +struct LookupEntry { index: Option, block_index: u16, } @@ -380,7 +382,12 @@ } } - pub fn iter(&self, mut f: F) { + + pub fn iter(&mut self, mut f: F) { + self.iter_id(|_, x| f(x)); + } + + pub fn iter_id(&mut self, mut f: F) { let mut arg_types = Vec::with_capacity(64); T::get_types(&mut arg_types); @@ -397,20 +404,21 @@ None => panic!("Unregistered type"), } } - let mut slices = vec![null_mut(); arg_types.len()]; + let mut slices = vec![null_mut(); arg_types.len() + 1]; for (block_index, mask) in self.block_masks.iter().enumerate() { if mask & selector == selector { - let block = &self.blocks[block_index]; - block.elements_count; + let block = &mut self.blocks[block_index]; + slices[0] = block.data.as_mut_ptr(); + for (arg_index, type_index) in type_indices.iter().cloned().enumerate() { - slices[arg_index as usize] = block.component_blocks[type_index as usize] + slices[arg_index as usize + 1] = block.component_blocks[type_index as usize] .unwrap() .as_ptr() } unsafe { - T::iter(&slices[..], block.elements_count as usize, |x| f(x)); + T::iter(&slices[..], block.elements_count as usize, |id, x| f(id, x)); } } }