Use SmallVec in bitsets

This doesn't increase their size and means that we don't have to heap
allocate for small sets.
This commit is contained in:
Nilstrieb 2023-03-21 22:17:15 +01:00
parent 66676820eb
commit 29c11327c7

View File

@ -1,5 +1,6 @@
use crate::vec::{Idx, IndexVec};
use arrayvec::ArrayVec;
use smallvec::{smallvec, SmallVec};
use std::fmt;
use std::iter;
use std::marker::PhantomData;
@ -111,7 +112,7 @@ pub fn intersect<Rhs>(&mut self, other: &Rhs) -> bool
#[derive(Eq, PartialEq, Hash, Decodable, Encodable)]
pub struct BitSet<T> {
domain_size: usize,
words: Vec<Word>,
words: SmallVec<[Word; 2]>,
marker: PhantomData<T>,
}
@ -127,14 +128,15 @@ impl<T: Idx> BitSet<T> {
#[inline]
pub fn new_empty(domain_size: usize) -> BitSet<T> {
let num_words = num_words(domain_size);
BitSet { domain_size, words: vec![0; num_words], marker: PhantomData }
BitSet { domain_size, words: smallvec![0; num_words], marker: PhantomData }
}
/// Creates a new, filled bitset with a given `domain_size`.
#[inline]
pub fn new_filled(domain_size: usize) -> BitSet<T> {
let num_words = num_words(domain_size);
let mut result = BitSet { domain_size, words: vec![!0; num_words], marker: PhantomData };
let mut result =
BitSet { domain_size, words: smallvec![!0; num_words], marker: PhantomData };
result.clear_excess_bits();
result
}
@ -1571,7 +1573,7 @@ fn from(bit_set: BitSet<T>) -> Self {
pub struct BitMatrix<R: Idx, C: Idx> {
num_rows: usize,
num_columns: usize,
words: Vec<Word>,
words: SmallVec<[Word; 2]>,
marker: PhantomData<(R, C)>,
}
@ -1584,7 +1586,7 @@ pub fn new(num_rows: usize, num_columns: usize) -> BitMatrix<R, C> {
BitMatrix {
num_rows,
num_columns,
words: vec![0; num_rows * words_per_row],
words: smallvec![0; num_rows * words_per_row],
marker: PhantomData,
}
}