use crate::*;
pub(crate) fn pack_indexes(indexes: Vec<usize>, width: usize) -> Result<BitVec> {
let mut bits = BitVec::new();
for index in indexes.iter() {
let index_as_bits = &index.view_bits::<Lsb0>()[..width];
bits.extend(index_as_bits);
}
Ok(bits)
}
pub(crate) fn unpack_indexes(bitvec: &BitVec, width: usize) -> Result<Vec<usize>> {
let mut indexes = Vec::new();
for slice in bitvec.chunks(width) {
indexes.push(slice.load());
}
Ok(indexes)
}
pub(crate) fn index_width(wordlist_size: usize) -> Result<usize> {
if wordlist_size <= 0 {
return Err(WordlistError::InvalidWordlistSize(wordlist_size));
}
for shift in 1.. {
let bits: usize = 1 << shift;
if bits == wordlist_size {
return Ok(shift);
} else if bits > wordlist_size {
break;
}
}
Err(WordlistError::InvalidWordlistSize(wordlist_size))
}