diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2015-04-07 06:12:13 -0400 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2015-04-17 10:12:55 -0400 |
| commit | 7ab0d1ab675a07a5bb1eae4d41a2e1cbccae113d (patch) | |
| tree | 8090b4b170016b22658967bb23e8d85c7fa8bba4 /src/librustc_data_structures/bitvec.rs | |
| parent | 52c34625866f6e23fd0de484282f326da6a100e3 (diff) | |
| download | rust-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.rs | 32 |
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 + } +} |
