equal
deleted
inserted
replaced
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 } |