pub struct VarBitmap<D, B, S> { /* private fields */ }
Expand description

A bitmap that can be resized by custom resizing strategy.

Any structure that implements the ContainerRead (for read-only access) and ContainerWrite + Resizable (for mutable access) traits can be a container of bitmap (e.g. Vec<T>).

It has the same interface as StaticBitmap except that mutable access requires resizable container. Container tries to grow if the changing bit is out of bounds.

Usage example:

use bitmac::{VarBitmap, LSB, MinimumRequiredStrategy};

// You can directly check every single bit
let bitmap = VarBitmap::<_, LSB, MinimumRequiredStrategy>::from_container(vec![0b0000_0001u8]);
assert!(bitmap.get(0));
assert!(!bitmap.get(11));
assert!(!bitmap.get(13));

// You can iterate over bits
let bitmap = VarBitmap::<_, LSB, MinimumRequiredStrategy>::from_container(vec![0b0000_1001u8, 0b0000_1000]);
let mut iter = bitmap.iter().by_bits().enumerate();
assert_eq!(iter.next(), Some((0, true)));
assert_eq!(iter.next(), Some((1, false)));
assert_eq!(iter.next(), Some((2, false)));
assert_eq!(iter.next(), Some((3, true)));
assert_eq!(iter.next(), Some((4, false)));

// You can check multiple bits at the same time through the intersection
use bitmac::Intersection;
let bitmap = VarBitmap::<_, LSB, MinimumRequiredStrategy>::from_container(vec![0b0000_1001u8, 0b0000_1000]);
// .. by creating specific new container for result
let test = [0b0000_1001u8, 0b0000_0000];
assert_eq!(bitmap.intersection::<[u8; 2]>(&test), test);
// .. by using preallocated container for result
let test = [0b0000_1001u8, 0b0000_0000];
let mut result = [0u8; 2];
bitmap.intersection_in(&test, &mut result);
assert_eq!(result, test);
// .. by comparing length of difference that is equivalent to count of ones (bits) in result
let test = [0b0000_1001u8, 0b0000_0000];
assert_eq!(bitmap.intersection_len(&test), test.iter().fold(0, |acc, &v| acc + v.count_ones() as usize));

// You can directly change every bit
let mut bitmap = VarBitmap::<_, LSB, MinimumRequiredStrategy>::from_container(vec![0b0000_1001u8, 0b0001_1000]);
assert!(bitmap.get(0));
assert!(bitmap.get(3));
assert!(bitmap.get(11));
assert!(bitmap.get(12));
assert!(!bitmap.get(13));
assert!(!bitmap.get(128));
bitmap.set(12, false);
assert!(!bitmap.get(12));
bitmap.set(13, true);
assert!(bitmap.get(13));
// If you change the bit exceeding container's length and new bit state is `1` (`true`)
// then the container will automatically grow
bitmap.set(127, true);
assert!(bitmap.get(127));
assert_eq!(bitmap.as_ref().len(), 16);

Implementations

Creates new bitmap from container with specified strategy.

Returns number of ones in the bitmap.

Returns number of zeros in the bitmap.

Creates default bitmap with specified strategy.

Creates new bitmap from container with default strategy.

Converts bitmap into inner container.

Represents bitmap as static bitmap over &D container.

Converts bitmap into static bitmap.

Gets single bit state.

Usage example:

use bitmac::{StaticBitmap, LSB};

let bitmap = StaticBitmap::<_, LSB>::new([0b0000_0001u8, 0b0000_1000]);
assert!(bitmap.get(0));
assert!(bitmap.get(11));
assert!(!bitmap.get(13));
// Out of bounds bits always returns false
assert!(!bitmap.get(128));

Returns iterator over slots.

Sets new state for a single bit.

Panic

Panics if resizing fails. See non-panic function try_set.

Usage example:
use bitmac::{VarBitmap, LSB, MinimumRequiredStrategy, LimitStrategy};

let mut bitmap = VarBitmap::<_, LSB, LimitStrategy<MinimumRequiredStrategy>>::new(
    vec![0u8; 1], LimitStrategy{ strategy: Default::default(), limit: 3 },
);
bitmap.set(6, true);
assert!(bitmap.get(6));
bitmap.set(13, true);
assert!(bitmap.get(13));
bitmap.set(13, false);
assert!(!bitmap.get(13));
// bitmap.set(128, false); <-- Panics

Sets new state for a single bit.

Returns Err(_) if resizing fails.

Usage example:
use bitmac::{VarBitmap, LSB, MinimumRequiredStrategy, LimitStrategy};

let mut bitmap = VarBitmap::<_, LSB, LimitStrategy<MinimumRequiredStrategy>>::new(
    vec![0u8; 1], LimitStrategy{ strategy: Default::default(), limit: 3 },
);
assert!(bitmap.try_set(12, true).is_ok());
assert!(bitmap.get(12));
assert_eq!(bitmap.as_ref().len(), 2);
assert!(bitmap.try_set(12, false).is_ok());
assert!(!bitmap.get(12));
assert_eq!(bitmap.as_ref().len(), 2);
// Grow strategy returns error
assert!(bitmap.try_set(128, true).is_err());
assert!(!bitmap.get(128));
assert_eq!(bitmap.as_ref().len(), 2);

Trait Implementations

Converts this type into a mutable reference of the (usually inferred) input type.

Converts this type into a shared reference of the (usually inferred) input type.

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Gets value of stored slot.

Gets number of stored slots.

Gets max number of bits.

Gets mutable reference to stored slot.

Formats the value using the given formatter. Read more

Returns the “default value” for a type. Read more

Converts to this type from the input type.

Calculates intersection in-place. Result will be stored in dst. Read more

Calculates intersection in-place. Result will be stored in dst. Read more

Calculates intersection. Result container will be created with try_with_slots function. Read more

Calculates intersection. Result container will be created with try_with_slots function. Read more

Calculates intersection length - ones count. It doesn’t allocate for storing intersection result. Read more

The type of the elements being iterated over.

Which kind of iterator are we turning this into?

Creates an iterator from a value. Read more

The type of the elements being iterated over.

Which kind of iterator are we turning this into?

Creates an iterator from a value. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more

Calculates union in-place. Result will be stored in dst. Read more

Calculates union in-place. Result will be stored in dst. Read more

Calculates union. Result container will be created with try_with_slots function. Read more

Calculates union. Result container will be created with try_with_slots function. Read more

Calculates union length - ones count. It doesn’t allocate for storing union result. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.