Use ArrayVec in SparseBitSet.

Instead of `SmallVec`, because the maximum size is known.
This commit is contained in:
Nicholas Nethercote 2020-07-14 10:31:54 +10:00
parent 9d09331e00
commit c492ca40a2
3 changed files with 15 additions and 10 deletions

View File

@ -94,6 +94,12 @@ dependencies = [
"nodrop",
]
[[package]]
name = "arrayvec"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
[[package]]
name = "atty"
version = "0.2.14"
@ -164,7 +170,7 @@ version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400"
dependencies = [
"arrayvec",
"arrayvec 0.4.7",
"constant_time_eq",
]
@ -714,7 +720,7 @@ version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9"
dependencies = [
"arrayvec",
"arrayvec 0.4.7",
"cfg-if",
"crossbeam-utils 0.6.5",
"lazy_static",
@ -3494,8 +3500,8 @@ dependencies = [
name = "rustc_index"
version = "0.0.0"
dependencies = [
"arrayvec 0.5.1",
"rustc_serialize",
"smallvec 1.4.0",
]
[[package]]

View File

@ -11,4 +11,4 @@ doctest = false
[dependencies]
rustc_serialize = { path = "../librustc_serialize" }
smallvec = { version = "1.0", features = ["union", "may_dangle"] }
arrayvec = "0.5.1"

View File

@ -1,5 +1,5 @@
use crate::vec::{Idx, IndexVec};
use smallvec::SmallVec;
use arrayvec::ArrayVec;
use std::fmt;
use std::iter;
use std::marker::PhantomData;
@ -355,20 +355,19 @@ fn bitwise<Op>(out_vec: &mut [Word], in_vec: &[Word], op: Op) -> bool
const SPARSE_MAX: usize = 8;
/// A fixed-size bitset type with a sparse representation and a maximum of
/// `SPARSE_MAX` elements. The elements are stored as a sorted `SmallVec` with
/// no duplicates; although `SmallVec` can spill its elements to the heap, that
/// never happens within this type because of the `SPARSE_MAX` limit.
/// `SPARSE_MAX` elements. The elements are stored as a sorted `ArrayVec` with
/// no duplicates.
///
/// This type is used by `HybridBitSet`; do not use directly.
#[derive(Clone, Debug)]
pub struct SparseBitSet<T: Idx> {
domain_size: usize,
elems: SmallVec<[T; SPARSE_MAX]>,
elems: ArrayVec<[T; SPARSE_MAX]>,
}
impl<T: Idx> SparseBitSet<T> {
fn new_empty(domain_size: usize) -> Self {
SparseBitSet { domain_size, elems: SmallVec::new() }
SparseBitSet { domain_size, elems: ArrayVec::new() }
}
fn len(&self) -> usize {