pub struct BitVec<Block: BlockType = usize> { /* private fields */ }Expand description
A bit-vector, akin to Vec<bool> but packed.
BitVec stores its bits in an array of Blocks, where Block is given as a type parameter
that defaults to usize. You might find that a different Block size is preferable, but
only benchmarking will tell.
Several useful methods are exported in traits, rather than inherent to BitVec. In
particular, see:
You will likely want to use these traits (or bv::*) when you use BitVec.
§Examples
use bv::BitVec;
let mut bv: BitVec = BitVec::new();
assert_eq!(bv.len(), 0);
bv.push(true);
bv.push(false);
bv.push(true);
assert_eq!(bv.len(), 3);
assert_eq!(bv[0], true);
assert_eq!(bv[1], false);
assert_eq!(bv[2], true);Implementations§
Source§impl<Block: BlockType> BitVec<Block>
impl<Block: BlockType> BitVec<Block>
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new, empty bit-vector with a capacity of one block.
§Examples
use bv::BitVec;
let mut bv: BitVec = BitVec::new();
assert_eq!(bv.len(), 0);
bv.push(true);
bv.push(false);
bv.push(true);
assert_eq!(bv.len(), 3);
assert_eq!(bv[0], true);
assert_eq!(bv[1], false);
assert_eq!(bv[2], true);Sourcepub fn with_capacity(nbits: u64) -> Self
pub fn with_capacity(nbits: u64) -> Self
Creates a new, empty bit-vector with the given bit capacity.
§Examples
use bv::BitVec;
let mut bv: BitVec<u16> = BitVec::with_capacity(20);
assert_eq!(bv.capacity(), 32);Sourcepub fn with_block_capacity(nblocks: usize) -> Self
pub fn with_block_capacity(nblocks: usize) -> Self
Creates a new, empty bit-vector with the given block capacity.
§Examples
use bv::BitVec;
let mut bv: BitVec<u16> = BitVec::with_block_capacity(8);
assert_eq!(bv.capacity(), 128);Sourcepub fn new_fill(value: bool, len: u64) -> Self
pub fn new_fill(value: bool, len: u64) -> Self
Creates a new bit-vector of size len, filled with all 0s or 1s
depending on value.
§Examples
use bv::*;
let mut bv: BitVec<u64> = BitVec::new_fill(false, 100);
assert_eq!( bv.get(0), false );
assert_eq!( bv.len(), 100 );Sourcepub fn from_bits<B: Bits<Block = Block>>(bits: B) -> Self
pub fn from_bits<B: Bits<Block = Block>>(bits: B) -> Self
Creates a new BitVec from any value implementing the Bits trait with
the same block type.
Sourcepub fn len(&self) -> u64
pub fn len(&self) -> u64
The number of bits in the bit-vector.
§Examples
use bv::BitVec;
let mut bv: BitVec = BitVec::new();
assert_eq!(bv.len(), 0);
bv.push(false);
assert_eq!(bv.len(), 1);
bv.push(false);
assert_eq!(bv.len(), 2);
bv.push(false);
assert_eq!(bv.len(), 3);Sourcepub fn block_len(&self) -> usize
pub fn block_len(&self) -> usize
The number of blocks used by this bit-vector.
§Examples
use bv::*;
let mut bv: BitVec<u64> = BitVec::new_fill(false, 100);
assert_eq!( bv.len(), 100 );
assert_eq!( bv.block_len(), 2 );Sourcepub fn capacity(&self) -> u64
pub fn capacity(&self) -> u64
The capacity of the bit-vector in bits.
This is the number of bits that can be held without reallocating.
§Examples
use bv::*;
let bv: BitVec<u64> = bit_vec![false; 100];
assert_eq!( bv.len(), 100 );
assert_eq!( bv.capacity(), 128 );Note that this example holds because bit_vec! does not introduces excess
capacity.
Sourcepub fn block_capacity(&self) -> usize
pub fn block_capacity(&self) -> usize
The capacity of the bit-vector in blocks.
§Examples
use bv::*;
let bv: BitVec<u64> = BitVec::with_capacity(250);
assert_eq!( bv.len(), 0 );
assert_eq!( bv.block_len(), 0 );
assert_eq!( bv.capacity(), 256 );
assert_eq!( bv.block_capacity(), 4 );Note that this example holds because bit_vec! does not introduces excess
capacity.
Sourcepub fn reserve(&mut self, additional: u64)
pub fn reserve(&mut self, additional: u64)
Adjust the capacity to hold at least additional additional bits.
May reserve more to avoid frequent reallocations.
§Examples
use bv::*;
let mut bv: BitVec<u32> = bit_vec![ false, false, true ];
assert_eq!( bv.capacity(), 32 );
bv.reserve(100);
assert!( bv.capacity() >= 103 );Sourcepub fn block_reserve(&mut self, additional: usize)
pub fn block_reserve(&mut self, additional: usize)
Adjust the capacity to hold at least additional additional blocks.
May reserve more to avoid frequent reallocations.
§Examples
use bv::*;
let mut bv: BitVec<u32> = bit_vec![ false, false, true ];
assert_eq!( bv.block_capacity(), 1 );
bv.block_reserve(3);
assert!( bv.block_capacity() >= 4 );Sourcepub fn reserve_exact(&mut self, additional: u64)
pub fn reserve_exact(&mut self, additional: u64)
Adjust the capacity to hold at least additional additional bits.
§Examples
use bv::*;
let mut bv: BitVec<u32> = bit_vec![ false, false, true ];
assert_eq!( bv.capacity(), 32 );
bv.reserve_exact(100);
assert_eq!( bv.capacity(), 128 );Sourcepub fn block_reserve_exact(&mut self, additional: usize)
pub fn block_reserve_exact(&mut self, additional: usize)
Adjusts the capacity to at least additional blocks beyond those used.
§Examples
use bv::*;
let mut bv: BitVec<u32> = bit_vec![ false, false, true ];
assert_eq!( bv.block_capacity(), 1 );
bv.block_reserve_exact(3);
assert_eq!( bv.block_capacity(), 4 );Sourcepub fn shrink_to_fit(&mut self)
pub fn shrink_to_fit(&mut self)
Shrinks the capacity of the vector as much as possible.
§Examples
use bv::BitVec;
let mut bv: BitVec<u8> = BitVec::new();
for i in 0 .. 23 {
bv.push(i % 3 == 0);
}
assert!(bv.capacity() >= 24);
bv.shrink_to_fit();
assert_eq!(bv.capacity(), 24);Sourcepub fn into_boxed_slice(self) -> Box<[Block]>
pub fn into_boxed_slice(self) -> Box<[Block]>
Converts the vector into Box<[Block]>.
Note that this will not drop any excess capacity.
§Examples
use bv::*;
let bv: BitVec<u8> = bit_vec![true, true, false, false, true, false, true, false];
let bs = bv.into_boxed_slice();
assert!( bs.len() >= 1 );
assert_eq!( bs[0], 0b01010011 );Sourcepub fn truncate(&mut self, len: u64)
pub fn truncate(&mut self, len: u64)
Shortens the vector, keeping the first len elements and dropping the rest.
If len is greater than the vector’s current length, this has no effect.
Note that this method has no effect on the capacity of the bit-vector.
§Examples
use bv::*;
let mut v1: BitVec = bit_vec![ true, true, false, false ];
let v2: BitVec = bit_vec![ true, true ];
assert_ne!( v1, v2 );
v1.truncate(2);
assert_eq!( v1, v2 );Sourcepub fn resize(&mut self, len: u64, value: bool)
pub fn resize(&mut self, len: u64, value: bool)
Resizes the bit-vector, filling with value if it has to grow.
§Examples
use bv::*;
let v1: BitVec = bit_vec![ true, true, false, false ];
let mut v2: BitVec = bit_vec![ true, true ];
let mut v3: BitVec = bit_vec![ true, true ];
v2.resize(4, false);
v3.resize(4, true);
assert_eq!( v1, v2 );
assert_ne!( v1, v3 );Sourcepub fn as_slice(&self) -> BitSlice<'_, Block>
pub fn as_slice(&self) -> BitSlice<'_, Block>
Gets a slice to a BitVec.
§Examples
use bv::*;
let bv: BitVec = bit_vec![true, false, true];
let slice = bv.as_slice();
assert_eq!( slice.len(), 3 );
assert_eq!( slice[0], true );
assert_eq!( slice[1], false );
assert_eq!( slice[2], true );Sourcepub fn as_mut_slice(&mut self) -> BitSliceMut<'_, Block>
pub fn as_mut_slice(&mut self) -> BitSliceMut<'_, Block>
Gets a mutable slice to a BitVec.
§Examples
use bv::*;
let mut bv: BitVec = bit_vec![true, false, true];
{
let mut slice = bv.as_mut_slice();
slice.set_bit(1, true);
}
assert_eq!( bv[1], true );Sourcepub fn get(&self, position: u64) -> bool
pub fn get(&self, position: u64) -> bool
Gets the value of the bit at the given position.
This is an alias for Bits::get_bit.
§Panics
If the position is out of bounds.
Sourcepub fn set(&mut self, position: u64, value: bool)
pub fn set(&mut self, position: u64, value: bool)
Sets the value of the bit at the given position.
This is an alias for BitsMut::set_bit.
§Panics
If the position is out of bounds.
Sourcepub fn push(&mut self, value: bool)
pub fn push(&mut self, value: bool)
Adds the given bool to the end of the bit-vector.
§Examples
use bv::*;
let mut bv0: BitVec = bit_vec![ ];
let bv1: BitVec = bit_vec![ true ];
let bv2: BitVec = bit_vec![ true, false ];
let bv3: BitVec = bit_vec![ true, false, true ];
assert_ne!( bv0, bv1 );
assert_ne!( bv0, bv2 );
assert_ne!( bv0, bv3 );
bv0.push(true);
assert_eq!( bv0, bv1 );
bv0.push(false);
assert_eq!( bv0, bv2 );
bv0.push(true);
assert_eq!( bv0, bv3 );Sourcepub fn pop(&mut self) -> Option<bool>
pub fn pop(&mut self) -> Option<bool>
Removes and returns the last element of the bit-vector, or None if empty.
§Examples
use bv::*;
let mut bv: BitVec = bit_vec![ true, false, true ];
assert_eq!( bv.pop(), Some(true) );
assert_eq!( bv.pop(), Some(false) );
assert_eq!( bv.pop(), Some(true) );
assert_eq!( bv.pop(), None );Trait Implementations§
Source§impl<'a, Block: BlockType> BitSliceable<RangeFull> for &'a mut BitVec<Block>
impl<'a, Block: BlockType> BitSliceable<RangeFull> for &'a mut BitVec<Block>
Source§type Slice = BitSliceMut<'a, Block>
type Slice = BitSliceMut<'a, Block>
Source§impl<'a, Block: BlockType> BitSliceable<RangeInclusive<u64>> for &'a BitVec<Block>
impl<'a, Block: BlockType> BitSliceable<RangeInclusive<u64>> for &'a BitVec<Block>
Source§impl<'a, Block: BlockType> BitSliceable<RangeInclusive<u64>> for &'a mut BitVec<Block>
impl<'a, Block: BlockType> BitSliceable<RangeInclusive<u64>> for &'a mut BitVec<Block>
Source§type Slice = BitSliceMut<'a, Block>
type Slice = BitSliceMut<'a, Block>
Source§fn bit_slice(self, range: RangeInclusive<u64>) -> BitSliceMut<'a, Block>
fn bit_slice(self, range: RangeInclusive<u64>) -> BitSliceMut<'a, Block>
Source§impl<'a, Block: BlockType> BitSliceable<RangeToInclusive<u64>> for &'a BitVec<Block>
impl<'a, Block: BlockType> BitSliceable<RangeToInclusive<u64>> for &'a BitVec<Block>
Source§impl<'a, Block: BlockType> BitSliceable<RangeToInclusive<u64>> for &'a mut BitVec<Block>
impl<'a, Block: BlockType> BitSliceable<RangeToInclusive<u64>> for &'a mut BitVec<Block>
Source§type Slice = BitSliceMut<'a, Block>
type Slice = BitSliceMut<'a, Block>
Source§fn bit_slice(self, range: RangeToInclusive<u64>) -> BitSliceMut<'a, Block>
fn bit_slice(self, range: RangeToInclusive<u64>) -> BitSliceMut<'a, Block>
Source§impl<Block: BlockType> Bits for BitVec<Block>
impl<Block: BlockType> Bits for BitVec<Block>
Source§impl<Block: BlockType> BitsMut for BitVec<Block>
impl<Block: BlockType> BitsMut for BitVec<Block>
Source§impl<Block: BlockType> BitsPush for BitVec<Block>
impl<Block: BlockType> BitsPush for BitVec<Block>
Source§fn align_block(&mut self, value: bool)
fn align_block(&mut self, value: bool)
value 0 or more times until the size of the bit
vector is block-aligned.Source§fn push_block(&mut self, value: Block)
fn push_block(&mut self, value: Block)
Source§impl<'de, Block: BlockType + Deserialize<'de>> Deserialize<'de> for BitVec<Block>
impl<'de, Block: BlockType + Deserialize<'de>> Deserialize<'de> for BitVec<Block>
Source§fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
Source§impl<Block: BlockType> Ord for BitVec<Block>
impl<Block: BlockType> Ord for BitVec<Block>
Source§impl<Block: BlockType> PartialOrd for BitVec<Block>
impl<Block: BlockType> PartialOrd for BitVec<Block>
impl<Block: BlockType> Eq for BitVec<Block>
Auto Trait Implementations§
impl<Block> Freeze for BitVec<Block>
impl<Block> RefUnwindSafe for BitVec<Block>where
Block: RefUnwindSafe,
impl<Block> Send for BitVec<Block>where
Block: Send,
impl<Block> Sync for BitVec<Block>where
Block: Sync,
impl<Block> Unpin for BitVec<Block>
impl<Block> UnwindSafe for BitVec<Block>where
Block: UnwindSafe,
Blanket Implementations§
Source§impl<T> BitsExt for Twhere
T: Bits,
impl<T> BitsExt for Twhere
T: Bits,
Source§fn bit_concat<Other>(&self, other: Other) -> BitConcat<&Self, Other>
fn bit_concat<Other>(&self, other: Other) -> BitConcat<&Self, Other>
self followed by the bits
of other.Source§fn into_bit_concat<Other>(self, other: Other) -> BitConcat<Self, Other>
fn into_bit_concat<Other>(self, other: Other) -> BitConcat<Self, Other>
Source§fn bit_not(&self) -> BitNot<&Self>
fn bit_not(&self) -> BitNot<&Self>
self.Source§fn into_bit_not(self) -> BitNot<Self>where
Self: Sized,
fn into_bit_not(self) -> BitNot<Self>where
Self: Sized,
self. Read more