mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 11:30:21 +01:00
nak/bitset: Improve set_words()
Only set the bits requested and don't clobber other bits. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
parent
5b355ff25a
commit
0f6d8640e1
1 changed files with 14 additions and 4 deletions
|
|
@ -107,6 +107,16 @@ impl BitSet {
|
|||
exists
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn set_word(
|
||||
&mut self,
|
||||
w: usize,
|
||||
mask: u32,
|
||||
f: &mut impl FnMut(usize) -> u32,
|
||||
) {
|
||||
self.words[w] = (self.words[w] & !mask) | (f(w) & mask);
|
||||
}
|
||||
|
||||
pub fn set_words(
|
||||
&mut self,
|
||||
bits: Range<usize>,
|
||||
|
|
@ -124,13 +134,13 @@ impl BitSet {
|
|||
self.reserve(last_word + 1);
|
||||
|
||||
if first_word == last_word {
|
||||
self.words[first_word] = f(first_word) & start_mask & end_mask;
|
||||
self.set_word(first_word, start_mask & end_mask, &mut f);
|
||||
} else {
|
||||
self.words[first_word] = f(first_word) & start_mask;
|
||||
self.set_word(first_word, start_mask, &mut f);
|
||||
for w in (first_word + 1)..last_word {
|
||||
self.words[w] = f(w);
|
||||
self.set_word(w, !0, &mut f);
|
||||
}
|
||||
self.words[last_word] = f(last_word) & end_mask;
|
||||
self.set_word(last_word, end_mask, &mut f);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue