pub struct BitmapVec { /* private fields */ }
Expand description
Represents an owned bitmap.
Wraps underlying C bitmap API. See Bitmap
for available
methods.
§Examples
Basic usage
use kernel::alloc::flags::GFP_KERNEL;
use kernel::bitmap::BitmapVec;
let mut b = BitmapVec::new(16, GFP_KERNEL)?;
assert_eq!(16, b.len());
for i in 0..16 {
if i % 4 == 0 {
b.set_bit(i);
}
}
assert_eq!(Some(0), b.next_bit(0));
assert_eq!(Some(1), b.next_zero_bit(0));
assert_eq!(Some(4), b.next_bit(1));
assert_eq!(Some(5), b.next_zero_bit(4));
assert_eq!(Some(12), b.last_bit());
§Invariants
nbits
is<= i32::MAX
and never changes.- if
nbits <= bindings::BITS_PER_LONG
, thenrepr
is ausize
. - otherwise,
repr
holds a non-null pointer to an initialized array ofunsigned long
that is large enough to holdnbits
bits.
Implementations§
Source§impl BitmapVec
impl BitmapVec
Sourcepub fn new(nbits: usize, flags: Flags) -> Result<Self, AllocError>
pub fn new(nbits: usize, flags: Flags) -> Result<Self, AllocError>
Constructs a new BitmapVec
.
Fails with AllocError
when the BitmapVec
could not be allocated. This
includes the case when nbits
is greater than i32::MAX
.
Sourcepub fn fill_random(&mut self)
pub fn fill_random(&mut self)
Fills this Bitmap
with random bits.
Methods from Deref<Target = Bitmap>§
Sourcepub fn as_mut_ptr(&mut self) -> *mut usize
pub fn as_mut_ptr(&mut self) -> *mut usize
Returns a mutable raw pointer to the backing Bitmap
.
Sourcepub fn set_bit(&mut self, index: usize)
pub fn set_bit(&mut self, index: usize)
Set bit with index index
.
ATTENTION: set_bit
is non-atomic, which differs from the naming
convention in C code. The corresponding C function is __set_bit
.
If CONFIG_RUST_BITMAP_HARDENED is not enabled and index
is greater than
or equal to self.nbits
, does nothing.
§Panics
Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and index
is greater than
or equal to self.nbits
.
Sourcepub fn set_bit_atomic(&self, index: usize)
pub fn set_bit_atomic(&self, index: usize)
Set bit with index index
, atomically.
This is a relaxed atomic operation (no implied memory barriers).
ATTENTION: The naming convention differs from C, where the corresponding
function is called set_bit
.
If CONFIG_RUST_BITMAP_HARDENED is not enabled and index
is greater than
or equal to self.len()
, does nothing.
§Panics
Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and index
is greater than
or equal to self.len()
.
Sourcepub fn clear_bit(&mut self, index: usize)
pub fn clear_bit(&mut self, index: usize)
Clear index
bit.
ATTENTION: clear_bit
is non-atomic, which differs from the naming
convention in C code. The corresponding C function is __clear_bit
.
If CONFIG_RUST_BITMAP_HARDENED is not enabled and index
is greater than
or equal to self.len()
, does nothing.
§Panics
Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and index
is greater than
or equal to self.len()
.
Sourcepub fn clear_bit_atomic(&self, index: usize)
pub fn clear_bit_atomic(&self, index: usize)
Clear index
bit, atomically.
This is a relaxed atomic operation (no implied memory barriers).
ATTENTION: The naming convention differs from C, where the corresponding
function is called clear_bit
.
If CONFIG_RUST_BITMAP_HARDENED is not enabled and index
is greater than
or equal to self.len()
, does nothing.
§Panics
Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and index
is greater than
or equal to self.len()
.
Sourcepub fn copy_and_extend(&mut self, src: &Bitmap)
pub fn copy_and_extend(&mut self, src: &Bitmap)
Copy src
into this Bitmap
and set any remaining bits to zero.
§Examples
use kernel::alloc::{AllocError, flags::GFP_KERNEL};
use kernel::bitmap::BitmapVec;
let mut long_bitmap = BitmapVec::new(256, GFP_KERNEL)?;
assert_eq!(None, long_bitmap.last_bit());
let mut short_bitmap = BitmapVec::new(16, GFP_KERNEL)?;
short_bitmap.set_bit(7);
long_bitmap.copy_and_extend(&short_bitmap);
assert_eq!(Some(7), long_bitmap.last_bit());
Sourcepub fn last_bit(&self) -> Option<usize>
pub fn last_bit(&self) -> Option<usize>
Finds last set bit.
§Examples
use kernel::alloc::{AllocError, flags::GFP_KERNEL};
use kernel::bitmap::BitmapVec;
let bitmap = BitmapVec::new(64, GFP_KERNEL)?;
match bitmap.last_bit() {
Some(idx) => {
pr_info!("The last bit has index {idx}.\n");
}
None => {
pr_info!("All bits in this bitmap are 0.\n");
}
}
Sourcepub fn next_bit(&self, start: usize) -> Option<usize>
pub fn next_bit(&self, start: usize) -> Option<usize>
Finds next set bit, starting from start
.
Returns None
if start
is greater or equal to self.nbits
.
Sourcepub fn next_zero_bit(&self, start: usize) -> Option<usize>
pub fn next_zero_bit(&self, start: usize) -> Option<usize>
Finds next zero bit, starting from start
.
Returns None
if start
is greater than or equal to self.len()
.
Trait Implementations§
impl Send for BitmapVec
Enable ownership transfer to other threads.
SAFETY: We own the underlying bitmap representation.
impl Sync for BitmapVec
Enable unsynchronized concurrent access to BitmapVec
through shared references.
SAFETY: deref()
will return a reference to a Bitmap
. Its methods
take immutable references are either atomic or read-only.
Auto Trait Implementations§
impl Freeze for BitmapVec
impl RefUnwindSafe for BitmapVec
impl Unpin for BitmapVec
impl UnwindSafe for BitmapVec
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> PinInit<T> for T
impl<T> PinInit<T> for T
Source§unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), Infallible>
unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), Infallible>
slot
. Read more