use {Bits, BitsMut, BitsPush};
use BlockType;
use iter::BlockIter;
use std::marker::PhantomData;
use std::ops;
#[derive(Debug, Clone)]
pub struct BoolAdapter<Block, T> {
bits: T,
_marker: PhantomData<Block>,
}
impl<Block: BlockType, T> BoolAdapter<Block, T> {
pub fn new(bits: T) -> Self {
BoolAdapter {
bits,
_marker: PhantomData,
}
}
pub fn into_inner(self) -> T {
self.bits
}
}
impl<Block, T> ops::Deref for BoolAdapter<Block, T> {
type Target = T;
fn deref(&self) -> &T {
&self.bits
}
}
impl<Block, T> ops::DerefMut for BoolAdapter<Block, T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.bits
}
}
macro_rules! impl_for_bool_adapter {
() => {};
(
impl[$($param:tt)*] Bits for BoolAdapter<$block:ty, $target:ty>;
$( $rest:tt )*
) => {
impl<$($param)*> Bits for BoolAdapter<$block, $target> {
type Block = $block;
fn bit_len(&self) -> u64 {
self.bits.len() as u64
}
fn get_bit(&self, position: u64) -> bool {
self.bits[position as usize]
}
}
impl_for_bool_adapter! { $($rest)* }
};
(
impl[$($param:tt)*] BitsMut for BoolAdapter<$block:ty, $target:ty>;
$( $rest:tt )*
) => {
impl<$($param)*> BitsMut for BoolAdapter<$block, $target> {
fn set_bit(&mut self, position: u64, value: bool) {
self.bits[position as usize] = value
}
}
impl_for_bool_adapter! { $($rest)* }
};
(
impl[$($param:tt)*] BitsPush for BoolAdapter<$block:ty, $target:ty>;
$( $rest:tt )*
) => {
impl<$($param)*> BitsPush for BoolAdapter<$block, $target> {
fn push_bit(&mut self, value: bool) {
self.bits.push(value);
}
fn pop_bit(&mut self) -> Option<bool> {
self.bits.pop()
}
}
impl_for_bool_adapter! { $($rest)* }
};
}
impl_for_bool_adapter! {
impl[ Block: BlockType] Bits for BoolAdapter<Block, Vec<bool>>;
impl[ Block: BlockType] BitsMut for BoolAdapter<Block, Vec<bool>>;
impl[ Block: BlockType] BitsPush for BoolAdapter<Block, Vec<bool>>;
impl['a, Block: BlockType] Bits for BoolAdapter<Block, &'a mut Vec<bool>>;
impl['a, Block: BlockType] BitsMut for BoolAdapter<Block, &'a mut Vec<bool>>;
impl['a, Block: BlockType] BitsPush for BoolAdapter<Block, &'a mut Vec<bool>>;
impl['a, Block: BlockType] Bits for BoolAdapter<Block, &'a mut [bool]>;
impl['a, Block: BlockType] BitsMut for BoolAdapter<Block, &'a mut [bool]>;
impl['a, Block: BlockType] Bits for BoolAdapter<Block, &'a [bool]>;
}
impl<Block, T, U> PartialEq<U> for BoolAdapter<Block, T>
where Block: BlockType,
U: Bits<Block = Block>,
Self: Bits<Block = Block> {
fn eq(&self, other: &U) -> bool {
BlockIter::new(self) == BlockIter::new(other)
}
}