Skip to content

Latest commit

 

History

History
 
 

tests

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
//! Copy of the example snippet in the README

#![allow(unused_variables, array_into_iter)]

#[cfg(feature = "alloc")]
use core::iter::repeat;

#[cfg(feature = "alloc")]
use bitvec::prelude::*;

#[test]
#[cfg(feature = "alloc")]
fn main() {
	// You can build a static array,
	let arr = bitarr![Lsb0, u32; 0; 64];
	// a hidden static slice,
	let slice = bits![mut LocalBits, u16; 0; 10];
	// or a boxed slice,
	let boxed = bitbox![0; 20];
	// or a vector, using macros that extend the `vec!` syntax
	let mut bv = bitvec![Msb0, u8; 0, 1, 0, 1];

	// You can also explicitly borrow existing scalars,
	let data = 0u32;
	let bits = BitSlice::<Lsb0, _>::from_element(&data);
	// or arrays,
	let mut data = [0u8; 3];
	let bits = BitSlice::<Msb0, _>::from_slice_mut(&mut data[..]);
	// and these are available as shortcut methods:
	let bits = 0u32.view_bits::<Lsb0>();
	let bits = [0u8; 3].view_bits_mut::<Msb0>();

	// `BitVec` implements the entire `Vec` API
	bv.reserve(8);

	// Like `Vec<bool>`, it can be extended by any iterator of `bool` or `&bool`
	bv.extend([false; 4].iter());
	bv.extend([true; 4].iter().copied());

	// `BitSlice`-owning buffers can be viewed as their raw memory
	assert_eq!(
		bv.as_raw_slice(),
		&[0b0101_0000, 0b1111_0000],
		//  ^ index 0       ^ index 11
	);
	assert_eq!(bv.len(), 12);
	assert!(bv.capacity() >= 16);

	bv.push(true);
	bv.push(false);
	bv.push(true);

	// `BitSlice` implements indexing
	assert!(bv[12]);
	assert!(!bv[13]);
	assert!(bv[14]);
	assert!(bv.get(15).is_none());

	// but not in place position
	// bv[12] = false;
	// because it cannot produce `&mut bool`.
	// instead, use `.get_mut()`:
	*bv.get_mut(12).unwrap() = false;
	// or `.set()`:
	bv.set(12, false);

	// range indexing produces subslices
	let last = &bv[12 ..];
	assert_eq!(last.len(), 3);
	assert!(last.any());

	for _ in 0 .. 3 {
		assert!(bv.pop().is_some());
	}

	//  `BitSlice` implements set arithmetic against any `bool` iterator
	bv &= repeat(true);
	bv |= repeat(false);
	bv ^= repeat(true);
	bv = !bv;
	// the crate no longer implements integer arithmetic, but `BitSlice`
	// can be used to represent varints in a downstream library.

	// `BitSlice`s are iterators:
	assert_eq!(bv.iter().filter(|b| **b).count(), 6,);

	// including mutable iteration, though this requires explicit binding:
	for (idx, mut bit) in bv.iter_mut().enumerate() {
		//      ^^^ not optional
		*bit ^= idx % 2 == 0;
	}

	// `BitSlice` can also implement bitfield memory behavior:
	bv[1 .. 7].store(0x2Eu8);
	assert_eq!(bv[1 .. 7].load::<u8>(), 0x2E);
}