diff options
| author | HampusM <hampus@hampusmat.com> | 2026-08-10 21:18:18 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-08-10 21:18:18 +0200 |
| commit | b732fa6378964ab9ca23fd71d7a82f39f6ae0009 (patch) | |
| tree | 38e0fd63b633bdde679356cd1e7a2dae9b75eaf4 /engine/src/util.rs | |
| parent | 9a303edb56fb460f2b60aef0bfca15a242381ba0 (diff) | |
fix(engine): prevent ignored mouse button input when main loop is slow
Diffstat (limited to 'engine/src/util.rs')
| -rw-r--r-- | engine/src/util.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/engine/src/util.rs b/engine/src/util.rs index a8ee893..bd69734 100644 --- a/engine/src/util.rs +++ b/engine/src/util.rs @@ -21,6 +21,15 @@ impl<Key: Ord, Value> MapVec<Key, Value> .insert_at_part_pt_by_key((key, value), |(a_key, _)| a_key); } + pub fn insert_mut(&mut self, key: Key, value: Value) -> &mut Value + { + let insert_index = self + .inner + .partition_point(|(other_key, _other_value)| other_key <= &key); + + &mut self.inner.insert_mut(insert_index, (key, value)).1 + } + pub fn remove(&mut self, key: Key) -> Option<Value> { let index = self @@ -61,6 +70,21 @@ impl<Key: Ord, Value> MapVec<Key, Value> Some(value) } + pub fn entry(&mut self, key: Key) -> MapVecEntry<'_, Key, Value> + { + let index = self + .inner + .binary_search_by_key(&&key, |(a_key, _)| a_key) + .ok(); + + MapVecEntry { map: self, key, index } + } + + pub fn iter_mut(&mut self) -> impl Iterator<Item = (&mut Key, &mut Value)> + { + self.inner.iter_mut().map(|(key, value)| (key, value)) + } + pub fn values(&self) -> impl Iterator<Item = &Value> { self.inner.iter().map(|(_, value)| value) @@ -89,6 +113,28 @@ impl<Key: Ord, Value> Default for MapVec<Key, Value> } } +pub struct MapVecEntry<'map, Key: Ord, Value> +{ + map: &'map mut MapVec<Key, Value>, + key: Key, + index: Option<usize>, +} + +impl<'map, Key: Ord, Value> MapVecEntry<'map, Key, Value> +{ + pub fn or_insert_with(self, func: impl FnOnce() -> Value) -> &'map mut Value + { + match self.index { + Some(index) => { + let (_, value) = unsafe { self.map.inner.get_unchecked_mut(index) }; + + value + } + None => self.map.insert_mut(self.key, func()), + } + } +} + pub trait OptionExt<T> { /// Substitute for the currently experimental function |
