about summary refs log tree commit diff
path: root/src/librustc_data_structures/bitvec.rs
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2015-04-07 06:12:13 -0400
committerNiko Matsakis <niko@alum.mit.edu>2015-04-17 10:12:55 -0400
commit7ab0d1ab675a07a5bb1eae4d41a2e1cbccae113d (patch)
tree8090b4b170016b22658967bb23e8d85c7fa8bba4 /src/librustc_data_structures/bitvec.rs
parent52c34625866f6e23fd0de484282f326da6a100e3 (diff)
downloadrust-7ab0d1ab675a07a5bb1eae4d41a2e1cbccae113d.tar.gz
rust-7ab0d1ab675a07a5bb1eae4d41a2e1cbccae113d.zip
Port to using the newer graph, which offers iterators instead of the
older `each` method, but is otherwise identical.
Diffstat (limited to 'src/librustc_data_structures/bitvec.rs')
-rw-r--r--src/librustc_data_structures/bitvec.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/librustc_data_structures/bitvec.rs b/src/librustc_data_structures/bitvec.rs
new file mode 100644
index 00000000000..f5924ef5a3f
--- /dev/null
+++ b/src/librustc_data_structures/bitvec.rs
@@ -0,0 +1,32 @@
+use std::iter;
+
+/// A very simple BitVector type.
+pub struct BitVector {
+    data: Vec<u64>
+}
+
+impl BitVector {
+    pub fn new(num_bits: usize) -> BitVector {
+        let num_words = (num_bits + 63) / 64;
+        BitVector { data: iter::repeat(0).take(num_words).collect() }
+    }
+
+    fn word_mask(&self, bit: usize) -> (usize, u64) {
+        let word = bit / 64;
+        let mask = 1 << (bit % 64);
+        (word, mask)
+    }
+
+    pub fn contains(&self, bit: usize) -> bool {
+        let (word, mask) = self.word_mask(bit);
+        (self.data[word] & mask) != 0
+    }
+
+    pub fn insert(&mut self, bit: usize) -> bool {
+        let (word, mask) = self.word_mask(bit);
+        let data = &mut self.data[word];
+        let value = *data;
+        *data = value | mask;
+        (value | mask) != value
+    }
+}