use std::clone::Clone;
use std::convert::{
AsMut,
AsRef,
From,
};
use std::fmt::{
self,
Debug,
Display,
Formatter,
};
use std::iter::{
DoubleEndedIterator,
ExactSizeIterator,
FromIterator,
Iterator,
IntoIterator,
};
use std::marker::PhantomData;
use std::mem;
use std::ops::{
BitAnd,
BitAndAssign,
BitOr,
BitOrAssign,
BitXor,
BitXorAssign,
Index,
Not,
Shl,
ShlAssign,
Shr,
ShrAssign,
};
use std::ptr;
mod bits;
mod endian;
mod macros;
pub use bits::Bits;
pub use endian::*;
pub use macros::*;
static TRUE: bool = true;
static FALSE: bool = false;
pub struct BitVec<E: Endian = BigEndian, T: Bits = u8> {
inner: Vec<T>,
_endian: PhantomData<E>,
}
impl<E: Endian, T: Bits> BitVec<E, T> {
pub fn new() -> Self {
Self {
inner: Vec::new(),
_endian: PhantomData,
}
}
pub fn with_capacity(capacity: usize) -> Self {
let (elts, bits) = T::split(capacity);
let cap = elts + if bits > 0 { 1 } else { 0 };
Self {
inner: Vec::with_capacity(cap),
_endian: PhantomData,
}
}
pub fn capacity(&self) -> usize {
assert!(self.inner.capacity() <= T::MAX_ELT, "Capacity overflow");
self.inner.capacity() << T::BITS
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn bits(&self) -> u8 {
(self.inner.len() & (T::MASK as usize)) as u8
}
pub fn elts(&self) -> usize {
self.inner.len() >> T::BITS
}
pub fn push(&mut self, value: bool) {
assert!(self.len() < ::std::usize::MAX, "Vector will overflow!");
let bit = self.bits();
let cursor = E::curr::<T>(bit);
self.do_with_tail(|elt| elt.set(cursor, value));
if bit == T::MASK {
let elts = self.elts();
assert!(elts <= T::MAX_ELT, "Elements will overflow");
unsafe { self.set_elts(elts + 1) };
}
unsafe { self.set_bits((bit + 1) & T::MASK); }
}
pub fn pop(&mut self) -> Option<bool> {
if self.inner.is_empty() {
return None;
}
let cur = self.len() - 1;
let ret = self.get(cur);
unsafe { self.inner.set_len(cur); }
Some(ret)
}
pub fn get(&self, index: usize) -> bool {
assert!(index < self.len(), "Index out of range!");
self[index]
}
pub fn set(&mut self, index: usize, value: bool) {
assert!(index < self.len(), "Index out of range!");
let (elt, bit) = T::split(index);
self.as_mut()[elt].set(E::curr::<T>(bit), value);
}
pub fn clear(&mut self) {
self.do_with_vec(|v| v.clear());
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn iter<'a>(&'a self) -> Iter<'a, E, T> {
self.into_iter()
}
pub fn reserve(&mut self, additional: usize) {
let (elts, bits) = T::split(additional);
let extra = elts + if bits > 0 { 1 } else { 0 };
assert!(self.raw_elts() + extra <= T::MAX_ELT, "Capacity would overflow");
self.do_with_vec(|v| v.reserve(extra));
}
pub fn shrink_to_fit(&mut self) {
self.do_with_vec(|v| v.shrink_to_fit());
}
pub fn truncate(&mut self, len: usize) {
let (elts, bits) = T::split(len);
let trunc = elts + if bits > 0 { 1 } else { 0 };
self.do_with_vec(|v| v.truncate(trunc));
unsafe { self.set_bits(bits); }
}
pub fn into_boxed_slice(self) -> Box<[T]> {
let raw = self.raw_elts();
unsafe {
let mut buf = ptr::read(&self.inner);
mem::forget(self);
buf.set_len(raw);
buf.into_boxed_slice()
}
}
unsafe fn set_bits(&mut self, count: u8) {
assert!(count <= T::MASK, "Index out of range");
let elt = self.len() & !(T::MASK as usize);
self.inner.set_len(elt | count as usize);
}
unsafe fn set_elts(&mut self, count: usize) {
assert!(count <= T::MAX_ELT, "Length out of range");
let bit = self.len() & (T::MASK as usize);
self.inner.set_len(T::join(count, bit as u8));
}
fn raw_elts(&self) -> usize {
self.elts() + if self.bits() > 0 { 1 } else { 0 }
}
fn do_with_vec<F: Fn(&mut Vec<T>) -> R, R>(&mut self, op: F) -> R {
let len = self.len();
let old = self.raw_elts();
unsafe { self.inner.set_len(old); }
let ret = op(&mut self.inner);
let new = self.inner.len();
assert!(new <= T::MAX_ELT, "Length out of range!");
if new == old {
unsafe {
self.inner.set_len(len);
}
}
else {
unsafe {
self.set_bits(0);
self.set_elts(new);
}
}
ret
}
fn do_with_tail<F: Fn(&mut T) -> R, R>(&mut self, op: F) -> R {
if self.bits() == 0 {
self.push_elt();
}
let old_len = self.inner.len();
let elts = self.elts();
unsafe {
self.inner.set_len(elts + 1);
let ret = op(&mut self.inner[elts]);
self.inner.set_len(old_len);
ret
}
}
fn push_elt(&mut self) {
let len = self.len();
self.do_with_vec(|v| v.push(Default::default()));
unsafe {
self.inner.set_len(len);
}
}
fn fmt_header(&self, fmt: &mut Formatter) -> fmt::Result {
write!(fmt, "BitVec<{}, {}> [",
E::TY,
T::TY,
)
}
fn fmt_element(fmt: &mut Formatter, elt: &T) -> fmt::Result {
Self::fmt_bits(fmt, elt, T::WIDTH)
}
fn fmt_bits(fmt: &mut Formatter, elt: &T, bits: u8) -> fmt::Result {
use std::fmt::Write;
let mut out = String::with_capacity(bits as usize);
for bit in 0 .. bits {
let cur = E::curr::<T>(bit as u8);
write!(out, "{}", if elt.get(cur) { "1" } else { "0" })?;
}
fmt.write_str(&out)
}
}
impl<E: Endian, T: Bits> AsMut<[T]> for BitVec<E, T> {
fn as_mut(&mut self) -> &mut [T] {
let ptr = self.inner.as_ptr() as *mut T;
let raw = self.raw_elts();
unsafe { ::std::slice::from_raw_parts_mut(ptr, raw) }
}
}
impl<E: Endian, T: Bits> AsRef<[T]> for BitVec<E, T> {
fn as_ref(&self) -> &[T] {
let ptr = self.inner.as_ptr();
let raw = self.raw_elts();
unsafe { ::std::slice::from_raw_parts(ptr, raw) }
}
}
impl<E: Endian, T: Bits, I: IntoIterator<Item=bool>> BitAnd<I> for BitVec<E, T> {
type Output = Self;
fn bitand(mut self, rhs: I) -> Self::Output {
self &= rhs;
self
}
}
impl<E: Endian, T: Bits, I: IntoIterator<Item=bool>> BitAndAssign<I> for BitVec<E, T> {
fn bitand_assign(&mut self, rhs: I) {
let mut len = 0;
for (idx, other) in (0 .. self.len()).zip(rhs.into_iter()) {
let val = self.get(idx) & other;
self.set(idx, val);
len += 1;
}
self.truncate(len);
}
}
impl<E: Endian, T: Bits, I: IntoIterator<Item=bool>> BitOr<I> for BitVec<E, T> {
type Output = Self;
fn bitor(mut self, rhs: I) -> Self::Output {
self |= rhs;
self
}
}
impl<E: Endian, T: Bits, I: IntoIterator<Item=bool>> BitOrAssign<I> for BitVec<E, T> {
fn bitor_assign(&mut self, rhs: I) {
let mut len = 0;
for (idx, other) in (0 .. self.len()).zip(rhs.into_iter()) {
let val = self.get(idx) | other;
self.set(idx, val);
len += 1;
}
self.truncate(len);
}
}
impl<E: Endian, T: Bits, I: IntoIterator<Item=bool>> BitXor<I> for BitVec<E, T> {
type Output = Self;
fn bitxor(mut self, rhs: I) -> Self::Output {
self ^= rhs;
self
}
}
impl<E: Endian, T: Bits, I: IntoIterator<Item=bool>> BitXorAssign<I> for BitVec<E, T> {
fn bitxor_assign(&mut self, rhs: I) {
let mut len = 0;
for (idx, other) in (0 .. self.len()).zip(rhs.into_iter()) {
let val = self.get(idx) ^ other;
self.set(idx, val);
len += 1;
}
self.truncate(len);
}
}
impl<E: Endian, T: Bits> Clone for BitVec<E, T> {
fn clone(&self) -> Self {
let mut out = Self::from(self.as_ref());
unsafe {
out.inner.set_len(self.len());
}
out
}
}
impl<E: Endian, T: Bits> Debug for BitVec<E, T> {
fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
let (elts, bits) = (self.elts(), self.bits());
let store = self.as_ref();
let alt = fmt.alternate();
self.fmt_header(fmt)?;
for idx in 0 .. elts {
if alt {
writeln!(fmt)?;
fmt.write_str(" ")?;
}
Self::fmt_element(fmt, &store[idx])?;
if idx < elts - 1 {
fmt.write_str(", ")?;
}
}
if bits > 0 {
fmt.write_str(", ")?;
if alt {
writeln!(fmt)?;
fmt.write_str(" ")?;
}
Self::fmt_bits(fmt, &store[elts], bits)?;
}
if alt {
writeln!(fmt)?;
}
fmt.write_str("]")
}
}
impl<E: Endian, T: Bits> Display for BitVec<E, T> {
fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
let elts = self.elts();
let store = self.as_ref();
let alt = fmt.alternate();
for idx in 0 .. elts {
Self::fmt_element(fmt, &store[idx])?;
if idx < elts - 1 {
if alt {
writeln!(fmt)?;
}
else {
fmt.write_str(" ")?;
}
}
}
let bits = self.bits();
if bits > 0 {
if elts > 0 {
if alt {
writeln!(fmt)?;
}
else {
fmt.write_str(" ")?;
}
}
Self::fmt_bits(fmt, &store[elts], bits)?;
}
Ok(())
}
}
impl<E: Endian, T: Bits> Drop for BitVec<E, T> {
fn drop(&mut self) {
let raw = self.raw_elts();
unsafe { self.inner.set_len(raw); }
}
}
impl<'a, E: Endian, T: Bits> From<&'a [bool]> for BitVec<E, T> {
fn from(src: &'a [bool]) -> Self {
let mut out = Self::with_capacity(src.len());
for bit in src {
out.push(*bit);
}
out
}
}
impl<'a, E: Endian, T: Bits> From<&'a [T]> for BitVec<E, T> {
fn from(src: &'a [T]) -> Self {
use std::ptr::copy_nonoverlapping;
let len = src.len();
assert!(len <= T::MAX_ELT, "Source slice too long!");
let mut out = Self::with_capacity(len << T::BITS);
out.do_with_vec(|v| unsafe {
copy_nonoverlapping(src.as_ptr(), v.as_ptr() as *mut T, len);
v.set_len(len);
});
out
}
}
impl<E: Endian, T: Bits> From<Box<[T]>> for BitVec<E, T> {
fn from(src: Box<[T]>) -> Self {
assert!(src.len() <= T::MAX_ELT, "Source slice too long!");
Self::from(Vec::from(src))
}
}
impl<E: Endian, T: Bits> From<Vec<T>> for BitVec<E, T> {
fn from(src: Vec<T>) -> Self {
let elts = src.len();
assert!(elts <= T::MAX_ELT, "Source vector too long!");
let mut out = Self {
inner: src,
_endian: PhantomData::<E>,
};
unsafe {
out.set_bits(0);
out.set_elts(elts);
}
out
}
}
impl<T: Bits> From<BitVec<LittleEndian, T>> for BitVec<BigEndian, T> {
fn from(mut src: BitVec<LittleEndian, T>) -> Self {
let bits = src.bits();
if bits > 0 {
let shamt = T::WIDTH - bits;
src.do_with_tail(|elt| *elt <<= shamt);
}
unsafe { mem::transmute(src) }
}
}
impl<T: Bits> From<BitVec<BigEndian, T>> for BitVec<LittleEndian, T> {
fn from(mut src: BitVec<BigEndian, T>) -> Self {
let bits = src.bits();
if bits > 0 {
let shamt = T::WIDTH - bits;
src.do_with_tail(|elt| *elt >>= shamt);
}
unsafe { mem::transmute(src) }
}
}
impl<E: Endian, T: Bits> FromIterator<bool> for BitVec<E, T> {
fn from_iter<I: IntoIterator<Item=bool>>(src: I) -> Self {
let iter = src.into_iter();
let mut out = match iter.size_hint() {
(_, Some(len)) |
(len, _) if len > 0 => Self::with_capacity(len),
_ => Self::new(),
};
for bit in iter {
out.push(bit);
}
out
}
}
impl<E: Endian, T: Bits> Index<usize> for BitVec<E, T> {
type Output = bool;
fn index(&self, cursor: usize) -> &Self::Output {
assert!(cursor < self.inner.len(), "Index out of range!");
self.index(T::split(cursor))
}
}
impl<E: Endian, T: Bits> Index<(usize, u8)> for BitVec<E, T> {
type Output = bool;
fn index(&self, (elt, bit): (usize, u8)) -> &Self::Output {
assert!(T::join(elt, bit) < self.len(), "Index out of range!");
match (self.inner[elt]).get(E::curr::<T>(bit)) {
true => &TRUE,
false => &FALSE,
}
}
}
impl<E: Endian, T: Bits> IntoIterator for BitVec<E, T> {
type Item = bool;
#[doc(hidden)]
type IntoIter = IntoIter<E, T>;
fn into_iter(self) -> Self::IntoIter {
let tail = self.len();
Self::IntoIter {
bv: self,
head: 0,
tail,
}
}
}
impl<E: Endian, T: Bits> Not for BitVec<E, T> {
type Output = Self;
fn not(mut self) -> Self::Output {
for elt in self.as_mut() {
*elt = !*elt;
}
self
}
}
impl<E: Endian, T: Bits> Shl<usize> for BitVec<E, T> {
type Output = Self;
fn shl(mut self, shamt: usize) -> Self {
self <<= shamt;
self
}
}
impl<'a, E: Endian, T: Bits> ShlAssign<usize> for BitVec<E, T> {
fn shl_assign(&mut self, shamt: usize) {
let len = self.len();
if shamt >= len {
self.clear();
let buf = self.as_mut();
let ptr = buf.as_mut_ptr();
let len = buf.len();
unsafe { ::std::ptr::write_bytes(ptr, 0, len); }
return;
}
for idx in shamt .. len {
let val = self.get(idx);
self.set(idx - shamt, val);
}
let trunc = len - shamt;
for idx in trunc .. len {
self.set(idx, false);
}
self.truncate(trunc);
}
}
impl<E: Endian, T: Bits> Shr<usize> for BitVec<E, T> {
type Output = Self;
fn shr(mut self, shamt: usize) -> Self {
self >>= shamt;
self
}
}
impl<'a, E: Endian, T: Bits> ShrAssign<usize> for BitVec<E, T> {
fn shr_assign(&mut self, shamt: usize) {
let old_len = self.len();
for _ in 0 .. shamt {
self.push(false);
}
for idx in (0 .. old_len).rev() {
let val = self.get(idx);
self.set(idx + shamt, val);
}
for idx in 0 .. shamt {
self.set(idx, false);
}
}
}
impl<'a, E: Endian, T: Bits> IntoIterator for &'a BitVec<E, T> {
type Item = bool;
#[doc(hidden)]
type IntoIter = Iter<'a, E, T>;
fn into_iter(self) -> Self::IntoIter {
Iter {
bv: self,
head: 0,
tail: self.len(),
}
}
}
#[doc(hidden)]
pub struct IntoIter<E: Endian, T: Bits> {
bv: BitVec<E, T>,
head: usize,
tail: usize,
}
impl<E: Endian, T: Bits> DoubleEndedIterator for IntoIter<E, T> {
fn next_back(&mut self) -> Option<Self::Item> {
if self.tail > self.head && self.tail <= self.bv.len() {
self.tail -= 1;
Some(self.bv[self.tail])
}
else {
self.head = 0;
self.tail = self.bv.len();
None
}
}
}
impl<E: Endian, T: Bits> ExactSizeIterator for IntoIter<E, T> {
fn len(&self) -> usize {
self.tail - self.head
}
}
impl<E: Endian, T: Bits> Iterator for IntoIter<E, T> {
type Item = bool;
fn next(&mut self) -> Option<Self::Item> {
if self.head < self.tail {
let ret = self.bv[self.head];
self.head += 1;
Some(ret)
}
else {
self.head = 0;
self.tail = self.bv.len();
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let rem = ExactSizeIterator::len(self);
(rem, Some(rem))
}
}
#[doc(hidden)]
pub struct Iter<'a, E: 'a + Endian, T: 'a + Bits> {
bv: &'a BitVec<E, T>,
head: usize,
tail: usize,
}
impl<'a, E: Endian, T: Bits> DoubleEndedIterator for Iter<'a, E, T> {
fn next_back(&mut self) -> Option<Self::Item> {
if self.tail > self.head && self.tail <= self.bv.len() {
self.tail -= 1;
Some(self.bv[self.tail])
}
else {
self.head = 0;
self.tail = self.bv.len();
None
}
}
}
impl<'a, E: Endian, T: Bits> ExactSizeIterator for Iter<'a, E, T> {
fn len(&self) -> usize {
self.tail - self.head
}
}
impl<'a, E: Endian, T: Bits> Iterator for Iter<'a, E, T> {
type Item = bool;
fn next(&mut self) -> Option<Self::Item> {
if self.head < self.tail {
let ret = self.bv[self.head];
self.head += 1;
Some(ret)
}
else {
self.head = 0;
self.tail = self.bv.len();
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let rem = ExactSizeIterator::len(self);
(rem, Some(rem))
}
}