aboutsummaryrefslogtreecommitdiffstats
path: root/src/bitset.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bitset.rs')
-rw-r--r--src/bitset.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/bitset.rs b/src/bitset.rs
new file mode 100644
index 0000000..eae2596
--- /dev/null
+++ b/src/bitset.rs
@@ -0,0 +1,43 @@
+#[derive(Clone, PartialEq, Eq)]
+pub struct BitSet {
+ data: Vec<u32>,
+ size: usize,
+}
+
+const BITS: usize = 32;
+
+impl BitSet {
+ pub fn new(size: usize) -> Self {
+ Self {
+ size,
+ data: vec![0; size.div_ceil(32)],
+ }
+ }
+
+ pub fn set(&mut self, bit: usize, val: bool) {
+ assert!(bit < self.size);
+ let idx = bit / BITS;
+ let bit = bit % BITS;
+
+ if val {
+ self.data[idx] |= 1 << bit;
+ } else {
+ self.data[idx] &= !(1 << bit);
+ }
+ }
+
+ pub fn get(&self, bit: usize) -> bool {
+ assert!(bit < self.size);
+ let idx = bit / BITS;
+ let bit = bit % BITS;
+
+ (self.data[idx] & (1 << bit)) != 0
+ }
+
+ pub fn set_all(&mut self, val: bool) {
+ let val = if val { !0 } else { 0 };
+ for d in self.data.iter_mut() {
+ *d = val;
+ }
+ }
+}