use super::{*, refs::*};
use core::ops::{BitAnd, BitAndAssign, BitOrAssign, Deref, Index};
impl<const BYTES: usize> Index<usize> for Bitmap<BYTES> {
type Output = bool;
fn index(&self, index: usize) -> &Self::Output {
match self.test(index) {
true => &true,
false => &false,
}
}
}
impl<'map, const BYTES: usize> Deref for BitRef<'map, BYTES> {
type Target = bool;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<'map, const BYTES: usize> Deref for BitRefMut<'map, BYTES> {
type Target = bool;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<const BYTES: usize, const N: usize> BitAnd<[u8; N]> for &Bitmap<BYTES> {
type Output = [u8; N];
fn bitand(self, rhs: [u8; N]) -> Self::Output {
let size = N.min(BYTES);
let mut arr = rhs.clone();
for i in 0..size {
let byte = self.__copy_u8(i);
arr[i] &= byte;
}
if N > BYTES {
for i in size..N {
arr[i] = 0;
}
}
arr
}
}
impl<const BYTES: usize, const N: usize> BitAndAssign<[u8; N]> for Bitmap<BYTES> {
fn bitand_assign(&mut self, rhs: [u8; N]) {
let size = N.min(BYTES);
for i in 0..size {
__byte_and_u8(self.__get_mut_u8(i), rhs[i]);
}
if BYTES > N {
for i in size..BYTES {
*self.__get_mut_u8(i) = 0;
}
}
}
}
impl<const BYTES: usize, const N: usize> BitOrAssign<[u8; N]> for Bitmap<BYTES> {
fn bitor_assign(&mut self, rhs: [u8; N]) {
let size = N.min(BYTES);
for i in 0..size {
__byte_or_u8(self.__get_mut_u8(i), rhs[i]);
}
}
}
macro_rules! impl_bitand {
($t:ty) => {
impl<const BYTES: usize> BitAnd<$t> for &Bitmap<BYTES> {
type Output = $t;
fn bitand(self, rhs: $t) -> Self::Output {
const SIZE: usize = core::mem::size_of::<$t>();
let arr:[u8; SIZE] = unsafe { core::mem::transmute(rhs) };
let res = self & arr;
unsafe { core::mem::transmute(res) }
}
}
};
}
macro_rules! impl_bitand_assign {
($t:ty) => {
impl<const BYTES: usize> BitAndAssign<$t> for Bitmap<BYTES> {
fn bitand_assign(&mut self, rhs: $t) {
const SIZE: usize = core::mem::size_of::<$t>();
let arr:[u8; SIZE] = unsafe { core::mem::transmute(rhs) };
*self &= arr
}
}
};
}
macro_rules! impl_bitor_assign {
($t:ty) => {
impl<const BYTES: usize> BitOrAssign<$t> for Bitmap<BYTES> {
fn bitor_assign(&mut self, rhs: $t) {
const SIZE: usize = core::mem::size_of::<$t>();
let arr:[u8; SIZE] = unsafe { core::mem::transmute(rhs) };
*self |= arr
}
}
};
}
impl_bitand!(u8);
impl_bitand!(i8);
impl_bitand!(char);
impl_bitand!(u16);
impl_bitand!(i16);
impl_bitand!(u32);
impl_bitand!(i32);
impl_bitand!(u64);
impl_bitand!(i64);
impl_bitand!(u128);
impl_bitand!(i128);
impl_bitand!(usize);
impl_bitand!(isize);
impl_bitand_assign!(u8);
impl_bitand_assign!(i8);
impl_bitand_assign!(char);
impl_bitand_assign!(u16);
impl_bitand_assign!(i16);
impl_bitand_assign!(u32);
impl_bitand_assign!(i32);
impl_bitand_assign!(u64);
impl_bitand_assign!(i64);
impl_bitand_assign!(u128);
impl_bitand_assign!(i128);
impl_bitand_assign!(usize);
impl_bitand_assign!(isize);
impl_bitor_assign!(u8);
impl_bitor_assign!(i8);
impl_bitor_assign!(char);
impl_bitor_assign!(u16);
impl_bitor_assign!(i16);
impl_bitor_assign!(u32);
impl_bitor_assign!(i32);
impl_bitor_assign!(u64);
impl_bitor_assign!(i64);
impl_bitor_assign!(u128);
impl_bitor_assign!(i128);
impl_bitor_assign!(usize);
impl_bitor_assign!(isize);