From 697cd10958117de9c1ddaf92edcc64950e35fb07 Mon Sep 17 00:00:00 2001 From: "squi.dev" Date: Fri, 21 Aug 2026 19:00:36 +0200 Subject: [PATCH] maskset (untested version) --- src/lib.rs | 2 ++ src/maskset.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/maskset.rs diff --git a/src/lib.rs b/src/lib.rs index aaad6f8..3c3797b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,3 +5,5 @@ extern crate alloc; pub mod blob; pub mod entity; + +pub mod maskset; diff --git a/src/maskset.rs b/src/maskset.rs new file mode 100644 index 0000000..b23d570 --- /dev/null +++ b/src/maskset.rs @@ -0,0 +1,42 @@ +use alloc::vec::Vec; + +#[repr(C)] +pub struct Mask(pub u32, pub u32); + +pub struct MaskSet { + masks: Vec, +} + +impl MaskSet { + pub fn contains(&self, Mask(target, test): Mask) -> bool { + for Mask(idx, truth) in &self.masks { + if *idx == target && ((truth & test) == 1) { + return true; + } + } + false + } + + pub fn insert(&mut self, Mask(target, value): Mask) { + for Mask(idx, truth) in &mut self.masks { + if *idx == target { + *truth |= value; + return; + } + } + self.masks.push(Mask(target, value)); + self.masks.sort_by_key(|m| m.0); + } + + pub fn remove(&mut self, Mask(target, test): Mask) { + for (i, Mask(idx, truth)) in self.masks.iter_mut().enumerate() { + if *idx == target && ((*truth & test) == 1) { + *truth ^= test; + if *truth == 0 { + self.masks.remove(i); + } + return; + } + } + } +} -- 2.51.2