Struct oxygengine_core::ecs::prelude::BitSet [−]
pub struct BitSet { /* fields omitted */ }
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
impl BitSet
impl BitSet
pub fn with_capacity(max: u32) -> BitSet
pub fn with_capacity(max: u32) -> BitSet
Creates an empty BitSet
, preallocated for up to max
indices.
Adds id
to the BitSet
. Returns true
if the value was
already in the set.
Removes id
from the set, returns true
if the value
was removed, and false
if the value was not set
to begin with.
pub 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
pub fn clear(&mut self)
pub fn clear(&mut self)
Completely wipes out the bit set.
pub const BITS_PER_USIZE: usize
pub const BITS_PER_USIZE: usize
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);
pub 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);
pub const LAYER1_GRANULARITY: usize
pub const LAYER1_GRANULARITY: usize
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);
pub 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);
pub const LAYER2_GRANULARITY: usize
pub const LAYER2_GRANULARITY: usize
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);
pub 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
impl<T> BitAnd<T> for BitSet where
T: BitSetLike,
impl<T> BitAnd<T> for BitSet where
T: BitSetLike,
impl<'a, T> BitAnd<T> for &'a BitSet where
T: BitSetLike,
impl<'a, T> BitAnd<T> for &'a BitSet where
T: BitSetLike,
impl<'a, B> BitAndAssign<&'a B> for BitSet where
B: BitSetLike,
impl<'a, B> BitAndAssign<&'a B> for BitSet where
B: BitSetLike,
pub fn bitand_assign(&mut self, lhs: &B)
pub fn bitand_assign(&mut self, lhs: &B)
Performs the &=
operation. Read more
impl<'a, T> BitOr<T> for &'a BitSet where
T: BitSetLike,
impl<'a, T> BitOr<T> for &'a BitSet where
T: BitSetLike,
impl<T> BitOr<T> for BitSet where
T: BitSetLike,
impl<T> BitOr<T> for BitSet where
T: BitSetLike,
impl<'a, B> BitOrAssign<&'a B> for BitSet where
B: BitSetLike,
impl<'a, B> BitOrAssign<&'a B> for BitSet where
B: BitSetLike,
pub fn bitor_assign(&mut self, lhs: &B)
pub fn bitor_assign(&mut self, lhs: &B)
Performs the |=
operation. Read more
impl BitSetLike for BitSet
impl BitSetLike for BitSet
Return a usize
where each bit represents if any word in layer2
has been set. Read more
Return the usize
from the array of usizes that indicates if any
bit has been set in layer1 Read more
Return the usize
from the array of usizes that indicates if any
bit has been set in layer0 Read more
Return a usize
that maps to the direct 1:1 association with
each index of the set Read more
fn get_from_layer(&self, layer: usize, idx: usize) -> usize
fn get_from_layer(&self, layer: usize, idx: usize) -> usize
Gets the usize
corresponding to layer and index. Read more
impl<T> BitXor<T> for BitSet where
T: BitSetLike,
impl<T> BitXor<T> for BitSet where
T: BitSetLike,
impl<'a, T> BitXor<T> for &'a BitSet where
T: BitSetLike,
impl<'a, T> BitXor<T> for &'a BitSet where
T: BitSetLike,
impl<'a, B> BitXorAssign<&'a B> for BitSet where
B: BitSetLike,
impl<'a, B> BitXorAssign<&'a B> for BitSet where
B: BitSetLike,
pub fn bitxor_assign(&mut self, lhs: &B)
pub fn bitxor_assign(&mut self, lhs: &B)
Performs the ^=
operation. Read more
impl DrainableBitSet for BitSet
impl DrainableBitSet for BitSet
fn drain(&'a mut self) -> DrainBitIter<'a, Self>ⓘNotable traits for DrainBitIter<'a, T>
impl<'a, T> Iterator for DrainBitIter<'a, T> where
T: DrainableBitSet, type Item = u32;
fn drain(&'a mut self) -> DrainBitIter<'a, Self>ⓘNotable traits for DrainBitIter<'a, T>
impl<'a, T> Iterator for DrainBitIter<'a, T> where
T: DrainableBitSet, type Item = u32;
Create a draining iterator that will scan over the keyspace and clears it while doing so.
pub fn extend<T>(&mut self, iter: T) where
T: IntoIterator<Item = &'a u32>,
pub fn extend<T>(&mut self, iter: T) where
T: IntoIterator<Item = &'a u32>,
Extends a collection with the contents of an iterator. Read more
extend_one
)Extends a collection with exactly one element.
extend_one
)Reserves capacity in a collection for the given number of additional elements. Read more
pub fn extend<T>(&mut self, iter: T) where
T: IntoIterator<Item = u32>,
pub fn extend<T>(&mut self, iter: T) where
T: IntoIterator<Item = u32>,
Extends a collection with the contents of an iterator. Read more
extend_one
)Extends a collection with exactly one element.
extend_one
)Reserves capacity in a collection for the given number of additional elements. Read more
impl<'a> FromIterator<&'a u32> for BitSet
impl<'a> FromIterator<&'a u32> for BitSet
pub fn from_iter<T>(iter: T) -> BitSet where
T: IntoIterator<Item = &'a u32>,
pub fn from_iter<T>(iter: T) -> BitSet where
T: IntoIterator<Item = &'a u32>,
Creates a value from an iterator. Read more
impl FromIterator<u32> for BitSet
impl FromIterator<u32> for BitSet
pub fn from_iter<T>(iter: T) -> BitSet where
T: IntoIterator<Item = u32>,
pub fn from_iter<T>(iter: T) -> BitSet where
T: IntoIterator<Item = u32>,
Creates a value from an iterator. Read more
impl IntoIterator for BitSet
impl IntoIterator for BitSet
impl<'a> IntoIterator for &'a BitSet
impl<'a> IntoIterator for &'a BitSet
Open this join by returning the mask and the storages. Read more
Get a joined component value by a given index. Read more
Create a joined iterator over the contents.
Returns a Join
-able structure that yields all indices, returning
None
for all missing elements and Some(T)
for found elements. Read more
If this Join
typically returns all indices in the mask, then iterating
over only it or combined with other joins that are also dangerous
will cause the JoinIter
/ParJoin
to go through all indices which
is usually not what is wanted and will kill performance. Read more
Open this join by returning the mask and the storages. Read more
Get a joined component value by a given index. Read more
Create a joined iterator over the contents.
Returns a Join
-able structure that yields all indices, returning
None
for all missing elements and Some(T)
for found elements. Read more
If this Join
typically returns all indices in the mask, then iterating
over only it or combined with other joins that are also dangerous
will cause the JoinIter
/ParJoin
to go through all indices which
is usually not what is wanted and will kill performance. Read more
Auto Trait Implementations
impl RefUnwindSafe for BitSet
impl UnwindSafe for BitSet
Blanket Implementations
impl<T> Any for T where
T: Any,
impl<T> Any for T where
T: Any,
pub fn get_type_id(&self) -> TypeId
Mutably borrows from an owned value. Read more
Tries to create the default.
Calls try_default
and panics on an error case.