pub struct BitSet { /* private fields */ }
Expand description
A BitSet
is a simple set designed to track which indices are placed
into it.
Note, a BitSet
is limited by design to only usize**4
indices.
Adding beyond this limit will cause the BitSet
to panic.
Implementations§
Source§impl BitSet
impl BitSet
Sourcepub const BITS_PER_USIZE: usize = 64usize
pub const BITS_PER_USIZE: usize = 64usize
How many bits are in a usize
.
This value can be trivially determined. It is provided here as a constant for clarity.
§Example
use hibitset::BitSet;
assert_eq!(BitSet::BITS_PER_USIZE, std::mem::size_of::<usize>()*8);
Sourcepub const LAYER1_GRANULARITY: usize = 64usize
pub const LAYER1_GRANULARITY: usize = 64usize
How many Index
es are described by as single layer 1 bit, intended for use with
BitSet::layer1_as_slice()
.
BitSet
s are defined in terms of usize
s summarizing usize
s, so this value can be
trivially determined. It is provided here as a constant for clarity.
§Example
use hibitset::BitSet;
assert_eq!(BitSet::LAYER1_GRANULARITY, BitSet::BITS_PER_USIZE);
Sourcepub const LAYER2_GRANULARITY: usize = 4_096usize
pub const LAYER2_GRANULARITY: usize = 4_096usize
How many Index
es are described by as single layer 2 bit, intended for use with
BitSet::layer2_as_slice()
.
BitSet
s are defined in terms of usize
s summarizing usize
s, so this value can be
trivially determined. It is provided here as a constant for clarity.
§Example
use hibitset::BitSet;
assert_eq!(BitSet::LAYER2_GRANULARITY, BitSet::LAYER1_GRANULARITY * BitSet::BITS_PER_USIZE);
Sourcepub fn with_capacity(max: u32) -> BitSet
pub fn with_capacity(max: u32) -> BitSet
Creates an empty BitSet
, preallocated for up to max
indices.
Sourcepub fn add(&mut self, id: u32) -> bool
pub fn add(&mut self, id: u32) -> bool
Adds id
to the BitSet
. Returns true
if the value was
already in the set.
Sourcepub fn remove(&mut self, id: u32) -> bool
pub fn remove(&mut self, id: u32) -> bool
Removes id
from the set, returns true
if the value
was removed, and false
if the value was not set
to begin with.
Sourcepub fn contains_set(&self, other: &BitSet) -> bool
pub fn contains_set(&self, other: &BitSet) -> bool
Returns true
if all ids in other
are contained in this set
Sourcepub fn layer0_as_slice(&self) -> &[usize]
pub fn layer0_as_slice(&self) -> &[usize]
Returns the bottom layer of the bitset as a slice. Each bit in this slice refers to a single
Index
.
The slice’s length will be at least the length needed to reflect all the 1
s in the bitset,
but is not otherwise guaranteed. Consider it to be an implementation detail.
§Example
use hibitset::BitSet;
let index: u32 = 12345;
let mut bitset = BitSet::new();
bitset.add(index);
// layer 0 is 1:1 with Indexes, so we expect that bit in the slice to be set
let slice = bitset.layer0_as_slice();
let bit_index = index as usize;
// map that bit index to a usize in the slice and a bit within that usize
let slice_index = bit_index / BitSet::BITS_PER_USIZE;
let bit_at_index = bit_index % BitSet::BITS_PER_USIZE;
assert_eq!(slice[slice_index], 1 << bit_at_index);
Sourcepub fn layer1_as_slice(&self) -> &[usize]
pub fn layer1_as_slice(&self) -> &[usize]
Returns the second layer of the bitset as a slice. Each bit in this slice summarizes a
corresponding usize
from layer0
. (If usize
is 64 bits, bit 0 will be set if any
Index
es 0-63 are set, bit 1 will be set if any Index
es 64-127 are set, etc.)
BitSet::LAYER1_GRANULARITY
reflects how many indexes are summarized per layer 1 bit.
The slice’s length is not guaranteed, except that it will be at least the length needed to
reflect all the 1
s in the bitset.
§Example
use hibitset::BitSet;
let index: u32 = 12345;
let mut bitset = BitSet::new();
bitset.add(index);
// layer 1 summarizes multiple indexes per bit, so divide appropriately
let slice = bitset.layer1_as_slice();
let bit_index = index as usize / BitSet::LAYER1_GRANULARITY;
// map that bit index to a usize in the slice and a bit within that usize
let slice_index = bit_index / BitSet::BITS_PER_USIZE;
let bit_at_index = bit_index % BitSet::BITS_PER_USIZE;
assert_eq!(slice[slice_index], 1 << bit_at_index);
Sourcepub fn layer2_as_slice(&self) -> &[usize]
pub fn layer2_as_slice(&self) -> &[usize]
Returns the third layer of the bitset as a slice. Each bit in this slice summarizes a
corresponding usize
from layer1
. If usize
is 64 bits, bit 0 will be set if any
Index
es 0-4095 are set, bit 1 will be set if any Index
es 4096-8191 are set, etc.
The slice’s length is not guaranteed, except that it will be at least the length needed to
reflect all the 1
s in the bitset.
§Example
use hibitset::BitSet;
let index: u32 = 12345;
let mut bitset = BitSet::new();
bitset.add(index);
// layer 2 summarizes multiple indexes per bit, so divide appropriately
let slice = bitset.layer2_as_slice();
let bit_index = index as usize / BitSet::LAYER2_GRANULARITY;
// map that bit index to a usize in the slice and a bit within that usize
let slice_index = bit_index / BitSet::BITS_PER_USIZE;
let bit_at_index = bit_index % BitSet::BITS_PER_USIZE;
assert_eq!(slice[slice_index], 1 << bit_at_index);
Trait Implementations§
Source§impl<'a, T> BitAnd<T> for &'a BitSetwhere
T: BitSetLike,
impl<'a, T> BitAnd<T> for &'a BitSetwhere
T: BitSetLike,
Source§impl<T> BitAnd<T> for BitSetwhere
T: BitSetLike,
impl<T> BitAnd<T> for BitSetwhere
T: BitSetLike,
Source§impl<'a, B> BitAndAssign<&'a B> for BitSetwhere
B: BitSetLike,
impl<'a, B> BitAndAssign<&'a B> for BitSetwhere
B: BitSetLike,
Source§fn bitand_assign(&mut self, lhs: &B)
fn bitand_assign(&mut self, lhs: &B)
&=
operation. Read moreSource§impl<'a, T> BitOr<T> for &'a BitSetwhere
T: BitSetLike,
impl<'a, T> BitOr<T> for &'a BitSetwhere
T: BitSetLike,
Source§impl<T> BitOr<T> for BitSetwhere
T: BitSetLike,
impl<T> BitOr<T> for BitSetwhere
T: BitSetLike,
Source§impl<'a, B> BitOrAssign<&'a B> for BitSetwhere
B: BitSetLike,
impl<'a, B> BitOrAssign<&'a B> for BitSetwhere
B: BitSetLike,
Source§fn bitor_assign(&mut self, lhs: &B)
fn bitor_assign(&mut self, lhs: &B)
|=
operation. Read moreSource§impl BitSetLike for BitSet
impl BitSetLike for BitSet
Source§fn layer3(&self) -> usize
fn layer3(&self) -> usize
usize
where each bit represents if any word in layer2
has been set.Source§fn layer2(&self, i: usize) -> usize
fn layer2(&self, i: usize) -> usize
usize
from the array of usizes that indicates if any
bit has been set in layer1Source§fn layer1(&self, i: usize) -> usize
fn layer1(&self, i: usize) -> usize
usize
from the array of usizes that indicates if any
bit has been set in layer0Source§fn layer0(&self, i: usize) -> usize
fn layer0(&self, i: usize) -> usize
usize
that maps to the direct 1:1 association with
each index of the setSource§fn get_from_layer(&self, layer: usize, idx: usize) -> usize
fn get_from_layer(&self, layer: usize, idx: usize) -> usize
usize
corresponding to layer and index. Read moreSource§fn is_empty(&self) -> bool
fn is_empty(&self) -> bool
BitSetLike
contains nothing, and false otherwise.Source§fn iter(self) -> BitIter<Self> ⓘwhere
Self: Sized,
fn iter(self) -> BitIter<Self> ⓘwhere
Self: Sized,
Source§fn par_iter(self) -> BitParIter<Self>where
Self: Sized,
fn par_iter(self) -> BitParIter<Self>where
Self: Sized,
Source§impl<'a, T> BitXor<T> for &'a BitSetwhere
T: BitSetLike,
impl<'a, T> BitXor<T> for &'a BitSetwhere
T: BitSetLike,
Source§impl<T> BitXor<T> for BitSetwhere
T: BitSetLike,
impl<T> BitXor<T> for BitSetwhere
T: BitSetLike,
Source§impl<'a, B> BitXorAssign<&'a B> for BitSetwhere
B: BitSetLike,
impl<'a, B> BitXorAssign<&'a B> for BitSetwhere
B: BitSetLike,
Source§fn bitxor_assign(&mut self, lhs: &B)
fn bitxor_assign(&mut self, lhs: &B)
^=
operation. Read moreSource§impl DrainableBitSet for BitSet
impl DrainableBitSet for BitSet
Source§impl<'a> Extend<&'a u32> for BitSet
impl<'a> Extend<&'a u32> for BitSet
Source§fn extend<T>(&mut self, iter: T)where
T: IntoIterator<Item = &'a u32>,
fn extend<T>(&mut self, iter: T)where
T: IntoIterator<Item = &'a u32>,
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)Source§impl Extend<u32> for BitSet
impl Extend<u32> for BitSet
Source§fn extend<T>(&mut self, iter: T)where
T: IntoIterator<Item = u32>,
fn extend<T>(&mut self, iter: T)where
T: IntoIterator<Item = u32>,
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)