Skip to content

Commit 9935d42

Browse files
committed
Some "word"-related improvements.
- Rename `BitSet::data` and `BitMatrix::vector` as `words`, because that's what they are. - Remove `BitSet::words_mut()`, which is no longer necessary. - Better distinguish multiple meanins of "word", i.e. "word index" vs "word ref" vs "word" (i.e. the value itself).
1 parent 6ba8a42 commit 9935d42

File tree

1 file changed

+66
-71
lines changed

1 file changed

+66
-71
lines changed

src/librustc_data_structures/bit_set.rs

+66-71
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub const WORD_BITS: usize = WORD_BYTES * 8;
2626
/// It does not support resizing after creation; use `GrowableBitSet` for that.
2727
#[derive(Clone, Eq, PartialEq)]
2828
pub struct BitSet<T: Idx> {
29-
data: Vec<Word>,
29+
words: Vec<Word>,
3030
marker: PhantomData<T>,
3131
}
3232

@@ -35,7 +35,7 @@ impl<T: Idx> BitSet<T> {
3535
pub fn new_empty(domain_size: usize) -> BitSet<T> {
3636
let num_words = num_words(domain_size);
3737
BitSet {
38-
data: vec![0; num_words],
38+
words: vec![0; num_words],
3939
marker: PhantomData,
4040
}
4141
}
@@ -44,7 +44,7 @@ impl<T: Idx> BitSet<T> {
4444
pub fn new_filled(domain_size: usize) -> BitSet<T> {
4545
let num_words = num_words(domain_size);
4646
let mut result = BitSet {
47-
data: vec![!0; num_words],
47+
words: vec![!0; num_words],
4848
marker: PhantomData,
4949
};
5050
result.clear_above(domain_size);
@@ -53,14 +53,14 @@ impl<T: Idx> BitSet<T> {
5353

5454
#[inline]
5555
pub fn clear(&mut self) {
56-
for word in &mut self.data {
56+
for word in &mut self.words {
5757
*word = 0;
5858
}
5959
}
6060

6161
/// Sets all elements up to and including `size`.
6262
pub fn set_up_to(&mut self, bit: usize) {
63-
for word in &mut self.data {
63+
for word in &mut self.words {
6464
*word = !0;
6565
}
6666
self.clear_above(bit);
@@ -70,14 +70,14 @@ impl<T: Idx> BitSet<T> {
7070
fn clear_above(&mut self, bit: usize) {
7171
let first_clear_block = bit / WORD_BITS;
7272

73-
if first_clear_block < self.data.len() {
73+
if first_clear_block < self.words.len() {
7474
// Within `first_clear_block`, the `bit % WORD_BITS` LSBs should
7575
// remain.
7676
let mask = (1 << (bit % WORD_BITS)) - 1;
77-
self.data[first_clear_block] &= mask;
77+
self.words[first_clear_block] &= mask;
7878

7979
// All the blocks above `first_clear_block` are fully cleared.
80-
for word in &mut self.data[first_clear_block + 1..] {
80+
for word in &mut self.words[first_clear_block + 1..] {
8181
*word = 0;
8282
}
8383
}
@@ -86,63 +86,63 @@ impl<T: Idx> BitSet<T> {
8686
/// Efficiently overwrite `self` with `other`. Panics if `self` and `other`
8787
/// don't have the same length.
8888
pub fn overwrite(&mut self, other: &BitSet<T>) {
89-
self.words_mut().clone_from_slice(other.words());
89+
self.words.clone_from_slice(&other.words);
9090
}
9191

9292
/// Count the number of set bits in the set.
9393
pub fn count(&self) -> usize {
94-
self.data.iter().map(|e| e.count_ones() as usize).sum()
94+
self.words.iter().map(|e| e.count_ones() as usize).sum()
9595
}
9696

9797
/// True if `self` contains the bit `bit`.
9898
#[inline]
9999
pub fn contains(&self, bit: T) -> bool {
100-
let (word, mask) = word_mask(bit);
101-
(self.data[word] & mask) != 0
100+
let (word_index, mask) = word_index_and_mask(bit);
101+
(self.words[word_index] & mask) != 0
102102
}
103103

104104
/// True if `self` is a (non-strict) superset of `other`.
105105
///
106-
/// The two vectors must have the same length.
106+
/// The two sets must have the same domain_size.
107107
#[inline]
108108
pub fn superset(&self, other: &BitSet<T>) -> bool {
109-
assert_eq!(self.data.len(), other.data.len());
110-
self.data.iter().zip(&other.data).all(|(a, b)| (a & b) == *b)
109+
assert_eq!(self.words.len(), other.words.len());
110+
self.words.iter().zip(&other.words).all(|(a, b)| (a & b) == *b)
111111
}
112112

113113
/// Is the set empty?
114114
#[inline]
115115
pub fn is_empty(&self) -> bool {
116-
self.data.iter().all(|a| *a == 0)
116+
self.words.iter().all(|a| *a == 0)
117117
}
118118

119119
/// Insert a bit. Returns true if the bit has changed.
120120
#[inline]
121121
pub fn insert(&mut self, bit: T) -> bool {
122-
let (word, mask) = word_mask(bit);
123-
let data = &mut self.data[word];
124-
let value = *data;
125-
let new_value = value | mask;
126-
*data = new_value;
127-
new_value != value
122+
let (word_index, mask) = word_index_and_mask(bit);
123+
let word_ref = &mut self.words[word_index];
124+
let word = *word_ref;
125+
let new_word = word | mask;
126+
*word_ref = new_word;
127+
new_word != word
128128
}
129129

130130
/// Sets all bits to true.
131131
pub fn insert_all(&mut self) {
132-
for word in &mut self.data {
132+
for word in &mut self.words {
133133
*word = !0;
134134
}
135135
}
136136

137137
/// Returns true if the bit has changed.
138138
#[inline]
139139
pub fn remove(&mut self, bit: T) -> bool {
140-
let (word, mask) = word_mask(bit);
141-
let data = &mut self.data[word];
142-
let value = *data;
143-
let new_value = value & !mask;
144-
*data = new_value;
145-
new_value != value
140+
let (word_index, mask) = word_index_and_mask(bit);
141+
let word_ref = &mut self.words[word_index];
142+
let word = *word_ref;
143+
let new_word = word & !mask;
144+
*word_ref = new_word;
145+
new_word != word
146146
}
147147

148148
/// Set `self = self | other` and return true if `self` changed
@@ -160,25 +160,20 @@ impl<T: Idx> BitSet<T> {
160160
/// Set `self = self & other` and return true if `self` changed.
161161
/// (i.e., if any bits were removed).
162162
pub fn intersect(&mut self, other: &BitSet<T>) -> bool {
163-
bitwise(self.words_mut(), other.words(), |a, b| { a & b })
163+
bitwise(&mut self.words, &other.words, |a, b| { a & b })
164164
}
165165

166166
/// Get a slice of the underlying words.
167167
pub fn words(&self) -> &[Word] {
168-
&self.data
169-
}
170-
171-
/// Get a mutable slice of the underlying words.
172-
pub fn words_mut(&mut self) -> &mut [Word] {
173-
&mut self.data
168+
&self.words
174169
}
175170

176171
/// Iterates over the indices of set bits in a sorted order.
177172
#[inline]
178173
pub fn iter<'a>(&'a self) -> BitIter<'a, T> {
179174
BitIter {
180175
cur: None,
181-
iter: self.data.iter().enumerate(),
176+
iter: self.words.iter().enumerate(),
182177
marker: PhantomData,
183178
}
184179
}
@@ -187,7 +182,7 @@ impl<T: Idx> BitSet<T> {
187182
pub fn to_hybrid(&self) -> HybridBitSet<T> {
188183
// This domain_size may be slightly larger than the one specified
189184
// upon creation, due to rounding up to a whole word. That's ok.
190-
let domain_size = self.words().len() * WORD_BITS;
185+
let domain_size = self.words.len() * WORD_BITS;
191186

192187
// Note: we currently don't bother trying to make a Sparse set.
193188
HybridBitSet::Dense(self.to_owned(), domain_size)
@@ -201,19 +196,19 @@ impl<T: Idx> BitSet<T> {
201196

202197
// i tracks how many bits we have printed so far.
203198
let mut i = 0;
204-
for word in &self.data {
205-
let mut v = *word;
206-
for _ in 0..WORD_BYTES { // for each byte in `v`:
199+
for word in &self.words {
200+
let mut word = *word;
201+
for _ in 0..WORD_BYTES { // for each byte in `word`:
207202
let remain = bits - i;
208203
// If less than a byte remains, then mask just that many bits.
209204
let mask = if remain <= 8 { (1 << remain) - 1 } else { 0xFF };
210205
assert!(mask <= 0xFF);
211-
let byte = v & mask;
206+
let byte = word & mask;
212207

213208
result.push_str(&format!("{}{:02x}", sep, byte));
214209

215210
if remain <= 8 { break; }
216-
v >>= 8;
211+
word >>= 8;
217212
i += 8;
218213
sep = '-';
219214
}
@@ -241,13 +236,13 @@ pub trait SubtractFromBitSet<T: Idx> {
241236

242237
impl<T: Idx> UnionIntoBitSet<T> for BitSet<T> {
243238
fn union_into(&self, other: &mut BitSet<T>) -> bool {
244-
bitwise(other.words_mut(), self.words(), |a, b| { a | b })
239+
bitwise(&mut other.words, &self.words, |a, b| { a | b })
245240
}
246241
}
247242

248243
impl<T: Idx> SubtractFromBitSet<T> for BitSet<T> {
249244
fn subtract_from(&self, other: &mut BitSet<T>) -> bool {
250-
bitwise(other.words_mut(), self.words(), |a, b| { a & !b })
245+
bitwise(&mut other.words, &self.words, |a, b| { a & !b })
251246
}
252247
}
253248

@@ -261,15 +256,15 @@ impl<T: Idx> fmt::Debug for BitSet<T> {
261256

262257
impl<T: Idx> rustc_serialize::Encodable for BitSet<T> {
263258
fn encode<E: rustc_serialize::Encoder>(&self, encoder: &mut E) -> Result<(), E::Error> {
264-
self.data.encode(encoder)
259+
self.words.encode(encoder)
265260
}
266261
}
267262

268263
impl<T: Idx> rustc_serialize::Decodable for BitSet<T> {
269264
fn decode<D: rustc_serialize::Decoder>(d: &mut D) -> Result<BitSet<T>, D::Error> {
270265
let words: Vec<Word> = rustc_serialize::Decodable::decode(d)?;
271266
Ok(BitSet {
272-
data: words,
267+
words,
273268
marker: PhantomData,
274269
})
275270
}
@@ -529,8 +524,8 @@ pub struct GrowableBitSet<T: Idx> {
529524
impl<T: Idx> GrowableBitSet<T> {
530525
pub fn grow(&mut self, domain_size: T) {
531526
let num_words = num_words(domain_size);
532-
if self.bit_set.data.len() <= num_words {
533-
self.bit_set.data.resize(num_words + 1, 0)
527+
if self.bit_set.words.len() <= num_words {
528+
self.bit_set.words.resize(num_words + 1, 0)
534529
}
535530
}
536531

@@ -551,8 +546,8 @@ impl<T: Idx> GrowableBitSet<T> {
551546

552547
#[inline]
553548
pub fn contains(&self, bit: T) -> bool {
554-
let (word, mask) = word_mask(bit);
555-
if let Some(word) = self.bit_set.data.get(word) {
549+
let (word_index, mask) = word_index_and_mask(bit);
550+
if let Some(word) = self.bit_set.words.get(word_index) {
556551
(word & mask) != 0
557552
} else {
558553
false
@@ -564,7 +559,7 @@ impl<T: Idx> GrowableBitSet<T> {
564559
#[derive(Clone, Debug)]
565560
pub struct BitMatrix<R: Idx, C: Idx> {
566561
columns: usize,
567-
vector: Vec<Word>,
562+
words: Vec<Word>,
568563
marker: PhantomData<(R, C)>,
569564
}
570565

@@ -576,7 +571,7 @@ impl<R: Idx, C: Idx> BitMatrix<R, C> {
576571
let words_per_row = num_words(columns);
577572
BitMatrix {
578573
columns,
579-
vector: vec![0; rows * words_per_row],
574+
words: vec![0; rows * words_per_row],
580575
marker: PhantomData,
581576
}
582577
}
@@ -595,12 +590,12 @@ impl<R: Idx, C: Idx> BitMatrix<R, C> {
595590
/// Returns true if this changed the matrix, and false otherwise.
596591
pub fn insert(&mut self, row: R, column: R) -> bool {
597592
let (start, _) = self.range(row);
598-
let (word, mask) = word_mask(column);
599-
let vector = &mut self.vector[..];
600-
let v1 = vector[start + word];
601-
let v2 = v1 | mask;
602-
vector[start + word] = v2;
603-
v1 != v2
593+
let (word_index, mask) = word_index_and_mask(column);
594+
let words = &mut self.words[..];
595+
let word = words[start + word_index];
596+
let new_word = word | mask;
597+
words[start + word_index] = new_word;
598+
word != new_word
604599
}
605600

606601
/// Do the bits from `row` contain `column`? Put another way, is
@@ -609,8 +604,8 @@ impl<R: Idx, C: Idx> BitMatrix<R, C> {
609604
/// `row` reach `column`?
610605
pub fn contains(&self, row: R, column: R) -> bool {
611606
let (start, _) = self.range(row);
612-
let (word, mask) = word_mask(column);
613-
(self.vector[start + word] & mask) != 0
607+
let (word_index, mask) = word_index_and_mask(column);
608+
(self.words[start + word_index] & mask) != 0
614609
}
615610

616611
/// Returns those indices that are true in rows `a` and `b`. This
@@ -622,7 +617,7 @@ impl<R: Idx, C: Idx> BitMatrix<R, C> {
622617
let (b_start, b_end) = self.range(b);
623618
let mut result = Vec::with_capacity(self.columns);
624619
for (base, (i, j)) in (a_start..a_end).zip(b_start..b_end).enumerate() {
625-
let mut v = self.vector[i] & self.vector[j];
620+
let mut v = self.words[i] & self.words[j];
626621
for bit in 0..WORD_BITS {
627622
if v == 0 {
628623
break;
@@ -646,13 +641,13 @@ impl<R: Idx, C: Idx> BitMatrix<R, C> {
646641
pub fn union_rows(&mut self, read: R, write: R) -> bool {
647642
let (read_start, read_end) = self.range(read);
648643
let (write_start, write_end) = self.range(write);
649-
let vector = &mut self.vector[..];
644+
let words = &mut self.words[..];
650645
let mut changed = false;
651646
for (read_index, write_index) in (read_start..read_end).zip(write_start..write_end) {
652-
let v1 = vector[write_index];
653-
let v2 = v1 | vector[read_index];
654-
vector[write_index] = v2;
655-
changed |= v1 != v2;
647+
let word = words[write_index];
648+
let new_word = word | words[read_index];
649+
words[write_index] = new_word;
650+
changed |= word != new_word;
656651
}
657652
changed
658653
}
@@ -663,7 +658,7 @@ impl<R: Idx, C: Idx> BitMatrix<R, C> {
663658
let (start, end) = self.range(row);
664659
BitIter {
665660
cur: None,
666-
iter: self.vector[start..end].iter().enumerate(),
661+
iter: self.words[start..end].iter().enumerate(),
667662
marker: PhantomData,
668663
}
669664
}
@@ -778,11 +773,11 @@ fn num_words<T: Idx>(elements: T) -> usize {
778773
}
779774

780775
#[inline]
781-
fn word_mask<T: Idx>(index: T) -> (usize, Word) {
776+
fn word_index_and_mask<T: Idx>(index: T) -> (usize, Word) {
782777
let index = index.index();
783-
let word = index / WORD_BITS;
778+
let word_index = index / WORD_BITS;
784779
let mask = 1 << (index % WORD_BITS);
785-
(word, mask)
780+
(word_index, mask)
786781
}
787782

788783
#[test]

0 commit comments

Comments
 (0)