goud_engine/ecs/sparse_set/
tick_tracking.rs1use super::super::Entity;
7use super::core::SparseSet;
8
9impl<T> SparseSet<T> {
10 pub fn insert_with_tick(&mut self, entity: Entity, value: T, change_tick: u32) -> Option<T> {
21 assert!(
22 !entity.is_placeholder(),
23 "Cannot insert with placeholder entity"
24 );
25
26 let index = entity.index() as usize;
27
28 if index >= self.sparse.len() {
30 self.sparse.resize(index + 1, None);
31 }
32
33 if let Some(dense_index) = self.sparse[index] {
34 let old_value = std::mem::replace(&mut self.values[dense_index], value);
36 self.changed_ticks[dense_index] = change_tick;
37 Some(old_value)
38 } else {
39 let dense_index = self.dense.len();
41 self.sparse[index] = Some(dense_index);
42 self.dense.push(entity);
43 self.values.push(value);
44 self.added_ticks.push(change_tick);
45 self.changed_ticks.push(change_tick);
46 None
47 }
48 }
49
50 #[inline]
52 pub fn get_added_tick(&self, entity: Entity) -> Option<u32> {
53 let dense_index = self.dense_index_of(entity)?;
54 Some(self.added_ticks[dense_index])
55 }
56
57 #[inline]
59 pub fn get_changed_tick(&self, entity: Entity) -> Option<u32> {
60 let dense_index = self.dense_index_of(entity)?;
61 Some(self.changed_ticks[dense_index])
62 }
63
64 #[inline]
68 pub fn set_changed_tick(&mut self, entity: Entity, tick: u32) {
69 if let Some(dense_index) = self.dense_index_of(entity) {
70 self.changed_ticks[dense_index] = tick;
71 }
72 }
73
74 #[inline]
76 pub(crate) fn dense_index_of(&self, entity: Entity) -> Option<usize> {
77 if entity.is_placeholder() {
78 return None;
79 }
80 let index = entity.index() as usize;
81 if index >= self.sparse.len() {
82 return None;
83 }
84 self.sparse[index]
85 }
86}