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

View File

@ -11,4 +11,4 @@ doctest = false
[dependencies] [dependencies]
rustc_serialize = { path = "../librustc_serialize" } 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 crate::vec::{Idx, IndexVec};
use smallvec::SmallVec; use arrayvec::ArrayVec;
use std::fmt; use std::fmt;
use std::iter; use std::iter;
use std::marker::PhantomData; use std::marker::PhantomData;
@ -355,20 +355,19 @@ where
const SPARSE_MAX: usize = 8; const SPARSE_MAX: usize = 8;
/// A fixed-size bitset type with a sparse representation and a maximum of /// 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 /// `SPARSE_MAX` elements. The elements are stored as a sorted `ArrayVec` with
/// no duplicates; although `SmallVec` can spill its elements to the heap, that /// no duplicates.
/// never happens within this type because of the `SPARSE_MAX` limit.
/// ///
/// This type is used by `HybridBitSet`; do not use directly. /// This type is used by `HybridBitSet`; do not use directly.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct SparseBitSet<T: Idx> { pub struct SparseBitSet<T: Idx> {
domain_size: usize, domain_size: usize,
elems: SmallVec<[T; SPARSE_MAX]>, elems: ArrayVec<[T; SPARSE_MAX]>,
} }
impl<T: Idx> SparseBitSet<T> { impl<T: Idx> SparseBitSet<T> {
fn new_empty(domain_size: usize) -> Self { fn new_empty(domain_size: usize) -> Self {
SparseBitSet { domain_size, elems: SmallVec::new() } SparseBitSet { domain_size, elems: ArrayVec::new() }
} }
fn len(&self) -> usize { fn len(&self) -> usize {