#![cfg(feature = "alloc")]
use crate::{
order::{
BitOrder,
Local,
},
pointer::BitPtr,
slice::BitSlice,
store::BitStore,
vec::BitVec,
};
use alloc::{
boxed::Box,
vec::Vec,
};
use core::{
marker::PhantomData,
mem,
};
#[repr(C)]
pub struct BitBox<O = Local, T = usize>
where O: BitOrder, T: BitStore {
_order: PhantomData<O>,
pointer: BitPtr<T>,
}
impl<O, T> BitBox<O, T>
where O: BitOrder, T: BitStore {
pub fn empty() -> Self {
Self {
_order: PhantomData,
pointer: BitPtr::empty(),
}
}
pub fn from_element(elt: T) -> Self {
BitSlice::<O, T>::from_element(&elt).into()
}
pub fn from_slice(slice: &[T]) -> Self {
BitVec::from_slice(slice).into_boxed_bitslice()
}
pub fn from_bitslice(slice: &BitSlice<O, T>) -> Self {
BitVec::from_bitslice(slice).into_boxed_bitslice()
}
pub fn from_boxed_slice(boxed: Box<[T]>) -> Self {
let len = boxed.len();
assert!(
len <= BitPtr::<T>::MAX_ELTS,
"BitBox cannot address {} elements",
len,
);
let bs = BitSlice::<O, T>::from_slice(&boxed[..]);
let pointer = bs.bitptr();
let out = Self {
_order: PhantomData,
pointer,
};
mem::forget(boxed);
out
}
pub fn into_boxed_slice(self) -> Box<[T]> {
let slice = self.pointer.as_mut_slice();
let (data, elts) = (slice.as_mut_ptr(), slice.len());
let out = unsafe { Vec::from_raw_parts(data, elts, elts) }
.into_boxed_slice();
mem::forget(self);
out
}
pub fn add_reverse<I>(mut self, addend: I) -> Self
where I: IntoIterator<Item=bool> {
self.add_assign_reverse(addend);
self
}
pub fn change_order<P>(self) -> BitBox<P, T>
where P: BitOrder {
let bp = self.bitptr();
mem::forget(self);
unsafe { BitBox::from_raw(bp.as_mut_ptr()) }
}
pub fn as_bitslice(&self) -> &BitSlice<O, T> {
self.pointer.into_bitslice()
}
pub fn as_mut_bitslice(&mut self) -> &mut BitSlice<O, T> {
self.pointer.into_bitslice_mut()
}
pub fn as_slice(&self) -> &[T] {
self.bitptr().as_slice()
}
pub fn as_mut_slice(&mut self) -> &mut [T] {
self.bitptr().as_mut_slice()
}
pub(crate) fn bitptr(&self) -> BitPtr<T> {
self.pointer
}
fn do_with_box<F, R>(&self, func: F) -> R
where F: FnOnce(&Box<[T]>) -> R {
let slice = self.pointer.as_mut_slice();
let (data, elts) = (slice.as_mut_ptr(), slice.len());
let b: Box<[T]> = unsafe {
Vec::from_raw_parts(data, elts, elts)
}.into_boxed_slice();
let out = func(&b);
mem::forget(b);
out
}
}
mod api;
mod iter;
mod ops;
mod traits;
pub use api::*;
pub use iter::*;