pub trait BlockType:
Copy
+ PartialEq
+ Ord
+ BitAnd<Output = Self>
+ BitOr<Output = Self>
+ BitXor<Output = Self>
+ Not<Output = Self>
+ Shl<usize, Output = Self>
+ Shr<usize, Output = Self>
+ Sub<Output = Self> {
Show 24 methods
// Required methods
fn wrapping_shl(self, shift: u32) -> Self;
fn wrapping_sub(self, other: Self) -> Self;
fn leading_zeros(self) -> usize;
fn to_usize(self) -> Option<usize>;
fn zero() -> Self;
fn one() -> Self;
// Provided methods
fn nbits() -> usize { ... }
fn div_nbits(index: u64) -> usize { ... }
fn checked_div_nbits(index: u64) -> Option<usize> { ... }
fn ceil_div_nbits(index: u64) -> usize { ... }
fn checked_ceil_div_nbits(index: u64) -> Option<usize> { ... }
fn mod_nbits(index: u64) -> usize { ... }
fn mul_nbits(index: usize) -> u64 { ... }
fn block_bits(len: u64, position: usize) -> usize { ... }
fn lg_nbits() -> usize { ... }
fn lg_nbits_mask<Result: BlockType>() -> Result { ... }
fn low_mask(element_bits: usize) -> Self { ... }
fn nth_mask(bit_index: usize) -> Self { ... }
fn get_bit(self, bit_index: usize) -> bool { ... }
fn with_bit(self, bit_index: usize, bit_value: bool) -> Self { ... }
fn get_bits(self, start: usize, len: usize) -> Self { ... }
fn with_bits(self, start: usize, len: usize, value: Self) -> Self { ... }
fn ceil_lg(self) -> usize { ... }
fn floor_lg(self) -> usize { ... }
}Expand description
Interface to primitive bit storage.
Types implementing this trait can be used as the blocks of a bit-vector.
Required Methods§
Sourcefn wrapping_shl(self, shift: u32) -> Self
fn wrapping_shl(self, shift: u32) -> Self
A shift-left operation that does not overflow.
Sourcefn wrapping_sub(self, other: Self) -> Self
fn wrapping_sub(self, other: Self) -> Self
A subtraction operation that does not overflow.
Sourcefn leading_zeros(self) -> usize
fn leading_zeros(self) -> usize
Returns the number of leading zero bits in the given number.
Provided Methods§
Sourcefn div_nbits(index: u64) -> usize
fn div_nbits(index: u64) -> usize
Returns index / Self::nbits(), computed by shifting.
This is intended for converting a bit address into a block
address, which is why it takes u64 and returns usize.
There is no check that the result actually fits in a usize,
so this should only be used when index is already known to
be small enough.
Sourcefn checked_div_nbits(index: u64) -> Option<usize>
fn checked_div_nbits(index: u64) -> Option<usize>
Returns index / Self::nbits(), computed by shifting.
This is intended for converting a bit address into a block
address, which is why it takes u64 and returns usize. It can only fail (returning
None) if usize is 32 bits.
Sourcefn ceil_div_nbits(index: u64) -> usize
fn ceil_div_nbits(index: u64) -> usize
Returns index / Self::nbits() rounded up, computed by shifting.
This is intended for converting a bit size into a block
size, which is why it takes u64 and returns usize.
Sourcefn checked_ceil_div_nbits(index: u64) -> Option<usize>
fn checked_ceil_div_nbits(index: u64) -> Option<usize>
Returns index / Self::nbits() rounded up, computed by shifting.
This is intended for converting a bit size into a block
size, which is why it takes u64 and returns usize.
There is no check that the result actually fits in a usize,
so this should only be used when index is already known to
be small enough.
Sourcefn mod_nbits(index: u64) -> usize
fn mod_nbits(index: u64) -> usize
Returns index % Self::nbits(), computed by masking.
This is intended for converting a bit address into a bit offset
within a block, which is why it takes u64 and returns usize.
Sourcefn mul_nbits(index: usize) -> u64
fn mul_nbits(index: usize) -> u64
Returns index * Self::nbits(), computed by shifting.
This is intended for converting a block address into a bit address,
which is why it takes a usize and returns a u64.
Sourcefn block_bits(len: u64, position: usize) -> usize
fn block_bits(len: u64, position: usize) -> usize
The number of bits in the block at position, given a total bit length
of len.
This will be Self::nbits() for all but the last block, for which it may
be less.
§Precondition
position * Self::nbits() <= len, or the block doesn’t exist and the result
is undefined.
Sourcefn lg_nbits_mask<Result: BlockType>() -> Result
fn lg_nbits_mask<Result: BlockType>() -> Result
Mask with the lowest-order lg_nbits() set.
Sourcefn low_mask(element_bits: usize) -> Self
fn low_mask(element_bits: usize) -> Self
The bit mask consisting of Self::nbits() - element_bits zeroes
followed by element_bits ones.
The default implementation has a branch, but should be overrided with a branchless algorithm if possible.
§Precondition
element_bits <= Self::nbits()
Sourcefn nth_mask(bit_index: usize) -> Self
fn nth_mask(bit_index: usize) -> Self
The bit mask with the bit_indexth bit set.
Bits are indexed in little-endian style based at 0.
§Precondition
bit_index < Self::nbits()
Sourcefn with_bit(self, bit_index: usize, bit_value: bool) -> Self
fn with_bit(self, bit_index: usize, bit_value: bool) -> Self
Functionally updates the value of the bit_indexth bit to bit_value.
§Panics
Panics if bit_index is out of bounds.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.