1
1
use crate :: {
2
- change_detection:: MaybeLocation , component:: { CheckChangeTicks , ComponentId , ComponentInfo , ComponentTicks , Tick , TickCells } , entity:: { Entity , EntityRow } , query:: DebugCheckedUnwrap , storage:: { AbortOnPanic , TableRow , ThinColumn } ,
2
+ change_detection:: MaybeLocation ,
3
+ component:: { CheckChangeTicks , ComponentId , ComponentInfo , ComponentTicks , Tick , TickCells } ,
4
+ entity:: { Entity , EntityRow } ,
5
+ query:: DebugCheckedUnwrap ,
3
6
storage:: VecExtensions ,
7
+ storage:: { AbortOnPanic , TableRow , ThinColumn } ,
4
8
} ;
5
9
use alloc:: { boxed:: Box , vec:: Vec } ;
6
10
use bevy_ptr:: { OwningPtr , Ptr } ;
@@ -333,19 +337,32 @@ impl ComponentSparseSet {
333
337
// SAFETY: TODO
334
338
unsafe { self . entities . set_len ( dense_index. index ( ) ) } ;
335
339
// SAFETY: TODO
336
- unsafe { self . dense . get_data_unchecked ( dense_index) . assert_unique ( ) . promote ( ) }
340
+ unsafe {
341
+ self . dense
342
+ . get_data_unchecked ( dense_index)
343
+ . assert_unique ( )
344
+ . promote ( )
345
+ }
337
346
} else {
338
347
// SAFETY: TODO
339
- unsafe { self . entities . swap_remove_nonoverlapping_unchecked ( dense_index. index ( ) ) } ;
348
+ unsafe {
349
+ self . entities
350
+ . swap_remove_nonoverlapping_unchecked ( dense_index. index ( ) ) ;
351
+ } ;
340
352
// SAFETY: TODO
341
353
let swapped_entity = unsafe { self . entities . get_unchecked ( dense_index. index ( ) ) } ;
342
354
#[ cfg( not( debug_assertions) ) ]
343
355
let index = swapped_entity;
344
356
#[ cfg( debug_assertions) ]
345
357
let index = swapped_entity. row ( ) ;
346
- unsafe { * self . sparse . get_mut ( index) . debug_checked_unwrap ( ) = dense_index; }
358
+ unsafe {
359
+ * self . sparse . get_mut ( index) . debug_checked_unwrap ( ) = dense_index;
360
+ }
347
361
// SAFETY: dense_index was just removed from `sparse`, which ensures that it is valid
348
- unsafe { self . dense . swap_remove_and_forget_unchecked ( len, dense_index) }
362
+ unsafe {
363
+ self . dense
364
+ . swap_remove_and_forget_unchecked ( len, dense_index)
365
+ }
349
366
}
350
367
} )
351
368
}
@@ -354,31 +371,43 @@ impl ComponentSparseSet {
354
371
///
355
372
/// Returns `true` if `entity` had a component value in the sparse set.
356
373
pub ( crate ) fn remove ( & mut self , entity : Entity ) -> bool {
357
- self . sparse . remove ( entity. row ( ) ) . map ( |dense_index| {
358
- #[ cfg( debug_assertions) ]
359
- assert_eq ! ( entity, self . entities[ dense_index. index( ) ] ) ;
360
- let len = self . entities . len ( ) ;
361
- if dense_index. index ( ) >= len - 1 {
374
+ self . sparse
375
+ . remove ( entity. row ( ) )
376
+ . map ( |dense_index| {
362
377
#[ cfg( debug_assertions) ]
363
- assert_eq ! ( dense_index. index( ) , len - 1 ) ;
364
- // SAFETY: TODO
365
- unsafe { self . entities . set_len ( dense_index. index ( ) ) } ;
366
- // SAFETY: TODO
367
- unsafe { self . dense . drop_last_component ( dense_index. index ( ) ) } ;
368
- } else {
369
- // SAFETY: TODO
370
- unsafe { self . entities . swap_remove_nonoverlapping_unchecked ( dense_index. index ( ) ) } ;
371
- // SAFETY: TODO
372
- let swapped_entity = unsafe { self . entities . get_unchecked ( dense_index. index ( ) ) } ;
373
- #[ cfg( not( debug_assertions) ) ]
374
- let index = swapped_entity;
375
- #[ cfg( debug_assertions) ]
376
- let index = swapped_entity. row ( ) ;
377
- unsafe { * self . sparse . get_mut ( index) . debug_checked_unwrap ( ) = dense_index; }
378
- // SAFETY: TODO
379
- unsafe { self . dense . swap_remove_and_drop_unchecked_nonoverlapping ( len, dense_index) } ;
380
- }
381
- } ) . is_some ( )
378
+ assert_eq ! ( entity, self . entities[ dense_index. index( ) ] ) ;
379
+ let len = self . entities . len ( ) ;
380
+ if dense_index. index ( ) >= len - 1 {
381
+ #[ cfg( debug_assertions) ]
382
+ assert_eq ! ( dense_index. index( ) , len - 1 ) ;
383
+ // SAFETY: TODO
384
+ unsafe { self . entities . set_len ( dense_index. index ( ) ) } ;
385
+ // SAFETY: TODO
386
+ unsafe { self . dense . drop_last_component ( dense_index. index ( ) ) } ;
387
+ } else {
388
+ // SAFETY: TODO
389
+ unsafe {
390
+ self . entities
391
+ . swap_remove_nonoverlapping_unchecked ( dense_index. index ( ) ) ;
392
+ } ;
393
+ // SAFETY: TODO
394
+ let swapped_entity =
395
+ unsafe { self . entities . get_unchecked ( dense_index. index ( ) ) } ;
396
+ #[ cfg( not( debug_assertions) ) ]
397
+ let index = swapped_entity;
398
+ #[ cfg( debug_assertions) ]
399
+ let index = swapped_entity. row ( ) ;
400
+ unsafe {
401
+ * self . sparse . get_mut ( index) . debug_checked_unwrap ( ) = dense_index;
402
+ }
403
+ // SAFETY: TODO
404
+ unsafe {
405
+ self . dense
406
+ . swap_remove_and_drop_unchecked_nonoverlapping ( len, dense_index) ;
407
+ } ;
408
+ }
409
+ } )
410
+ . is_some ( )
382
411
}
383
412
384
413
pub ( crate ) fn check_change_ticks ( & mut self , check : CheckChangeTicks ) {
0 commit comments