rust/hwphysics/src/data.rs
changeset 15395 a87b5e16b863
parent 15393 0ef770a40e75
child 15426 a027e60d7820
equal deleted inserted replaced
15394:b7e40129dbdb 15395:a87b5e16b863
   241     fn get_tag_index<T: 'static>(&self) -> Option<usize> {
   241     fn get_tag_index<T: 'static>(&self) -> Option<usize> {
   242         let type_id = TypeId::of::<T>();
   242         let type_id = TypeId::of::<T>();
   243         self.tags.iter().position(|id| *id == type_id)
   243         self.tags.iter().position(|id| *id == type_id)
   244     }
   244     }
   245 
   245 
   246     fn move_between_blocks(&mut self, src_block_index: u16, src_index: u16, dest_block_index: u16) {
   246     fn move_between_blocks(
       
   247         &mut self,
       
   248         src_block_index: u16,
       
   249         src_index: u16,
       
   250         dest_block_index: u16,
       
   251     ) -> u16 {
   247         debug_assert!(src_block_index != dest_block_index);
   252         debug_assert!(src_block_index != dest_block_index);
   248         let src_mask = self.block_masks[src_block_index as usize];
   253         let src_mask = self.block_masks[src_block_index as usize];
   249         let dest_mask = self.block_masks[dest_block_index as usize];
   254         let dest_mask = self.block_masks[dest_block_index as usize];
   250         debug_assert!(src_mask.type_mask & dest_mask.type_mask == src_mask.type_mask);
   255         debug_assert!(src_mask.type_mask & dest_mask.type_mask == src_mask.type_mask);
   251 
   256 
   295         let dest_index = dest_block.elements_count;
   300         let dest_index = dest_block.elements_count;
   296 
   301 
   297         dest_block.gear_ids_mut()[dest_index as usize] = gear_id;
   302         dest_block.gear_ids_mut()[dest_index as usize] = gear_id;
   298         self.lookup[gear_id.get() as usize - 1] = LookupEntry::new(dest_block_index, dest_index);
   303         self.lookup[gear_id.get() as usize - 1] = LookupEntry::new(dest_block_index, dest_index);
   299         dest_block.elements_count += 1;
   304         dest_block.elements_count += 1;
       
   305         dest_block.elements_count - 1
   300     }
   306     }
   301 
   307 
   302     fn add_to_block<T: Clone>(&mut self, gear_id: GearId, block_index: u16, value: &T) {
   308     fn add_to_block<T: Clone>(&mut self, gear_id: GearId, block_index: u16, value: &T) {
   303         debug_assert!(
   309         debug_assert!(
   304             self.block_masks[block_index as usize]
   310             self.block_masks[block_index as usize]
   309 
   315 
   310         let block = &mut self.blocks[block_index as usize];
   316         let block = &mut self.blocks[block_index as usize];
   311         debug_assert!(block.elements_count < block.max_elements);
   317         debug_assert!(block.elements_count < block.max_elements);
   312 
   318 
   313         unsafe {
   319         unsafe {
   314             let slice = slice::from_raw_parts_mut(
   320             *(block.component_blocks[0].unwrap().as_ptr() as *mut T)
   315                 block.component_blocks[0].unwrap().as_ptr() as *mut T,
   321                 .add(block.elements_count as usize) = value.clone();
   316                 block.max_elements as usize,
       
   317             );
       
   318             *slice.get_unchecked_mut(block.elements_count as usize) = value.clone();
       
   319         };
   322         };
   320 
   323 
   321         let index = block.elements_count;
   324         let index = block.elements_count;
   322         self.lookup[gear_id.get() as usize - 1] = LookupEntry::new(block_index, index);
   325         self.lookup[gear_id.get() as usize - 1] = LookupEntry::new(block_index, index);
   323         block.gear_ids_mut()[index as usize] = gear_id;
   326         block.gear_ids_mut()[index as usize] = gear_id;
   351             gear_ids[index as usize] = gear_ids[relocated_index];
   354             gear_ids[index as usize] = gear_ids[relocated_index];
   352             self.lookup[gear_ids[relocated_index].get() as usize - 1] =
   355             self.lookup[gear_ids[relocated_index].get() as usize - 1] =
   353                 LookupEntry::new(block_index, index);
   356                 LookupEntry::new(block_index, index);
   354         }
   357         }
   355         block.elements_count -= 1;
   358         block.elements_count -= 1;
       
   359     }
       
   360 
       
   361     fn write_component<T: Clone>(
       
   362         &mut self,
       
   363         block_index: u16,
       
   364         index: u16,
       
   365         type_index: usize,
       
   366         value: &T,
       
   367     ) {
       
   368         debug_assert!(type_index < self.types.len());
       
   369         let block = &mut self.blocks[block_index as usize];
       
   370         debug_assert!(index < block.elements_count);
       
   371 
       
   372         unsafe {
       
   373             *(block.component_blocks[type_index].unwrap().as_ptr() as *mut T).add(index as usize) =
       
   374                 value.clone();
       
   375         };
   356     }
   376     }
   357 
   377 
   358     #[inline]
   378     #[inline]
   359     fn ensure_block(&mut self, mask: BlockMask) -> u16 {
   379     fn ensure_block(&mut self, mask: BlockMask) -> u16 {
   360         if let Some(index) = self
   380         if let Some(index) = self
   383                 let mask = self.block_masks[entry.block_index as usize];
   403                 let mask = self.block_masks[entry.block_index as usize];
   384                 let new_mask = mask.with_type(type_bit);
   404                 let new_mask = mask.with_type(type_bit);
   385 
   405 
   386                 if new_mask != mask {
   406                 if new_mask != mask {
   387                     let dest_block_index = self.ensure_block(new_mask);
   407                     let dest_block_index = self.ensure_block(new_mask);
   388                     self.move_between_blocks(entry.block_index, index.get() - 1, dest_block_index);
   408                     let dest_index = self.move_between_blocks(
       
   409                         entry.block_index,
       
   410                         index.get() - 1,
       
   411                         dest_block_index,
       
   412                     );
       
   413                     self.write_component(dest_block_index, dest_index, type_index, value);
   389                 }
   414                 }
   390             } else {
   415             } else {
   391                 let dest_block_index = self.ensure_block(BlockMask::new(type_bit, 0));
   416                 let dest_block_index = self.ensure_block(BlockMask::new(type_bit, 0));
   392                 self.add_to_block(gear_id, dest_block_index, value);
   417                 self.add_to_block(gear_id, dest_block_index, value);
   393             }
   418             }