#[cfg(feature = "alloc")]
#[macro_export]
macro_rules! bitvec {
( $cursor:path , $bits:ty ; $( $val:expr ),* ) => {
bitvec![ __bv_impl__ $cursor , $bits ; $( $val ),* ]
};
( $cursor:path , $bits:ty ; $( $val:expr , )* ) => {
bitvec![ __bv_impl__ $cursor , $bits ; $( $val ),* ]
};
( $cursor:path ; $( $val:expr ),* ) => {
bitvec![ __bv_impl__ $cursor , u8 ; $( $val ),* ]
};
( $cursor:path ; $( $val:expr , )* ) => {
bitvec![ __bv_impl__ $cursor , u8 ; $( $val ),* ]
};
( $( $val:expr ),* ) => {
bitvec![ __bv_impl__ $crate::prelude::BigEndian , u8 ; $( $val ),* ]
};
( $( $val:expr , )* ) => {
bitvec![ __bv_impl__ $crate::prelude::BigEndian , u8 ; $( $val ),* ]
};
( $cursor:path , $bits:ty ; $val:expr ; $rep:expr ) => {
bitvec![ __bv_impl__ $cursor , $bits ; $val; $rep ]
};
( $cursor:path ; $val:expr ; $rep:expr ) => {
bitvec![ __bv_impl__ $cursor , u8 ; $val ; $rep ]
};
( $val:expr ; $rep:expr ) => {
bitvec![ __bv_impl__ $crate::prelude::BigEndian , u8 ; $val ; $rep ]
};
( __bv_impl__ $cursor:path , $bits:ty ; $( $val:expr ),* ) => {{
let init: &[bool] = &[ $( $val != 0 ),* ];
let mut bv = $crate::vec::BitVec::<$cursor, $bits>::with_capacity(
init.len(),
);
bv.extend(init.iter().copied());
bv
}};
( __bv_impl__ $cursor:path , $bits:ty ; $val:expr ; $rep:expr ) => {{
let mut bv = $crate::vec::BitVec::<$cursor, $bits>::with_capacity($rep);
bv.set_elements(0);
unsafe { bv.set_len($rep); }
let one = $val != 0;
if one {
bv.set_all(one);
}
bv
}};
}
#[cfg(feature = "alloc")]
#[macro_export]
macro_rules! bitbox {
( $cursor:path , $bits:ty ; $( $val:expr ),* ) => {
bitvec![ $cursor , $bits ; $( $val ),* ].into_boxed_bitslice()
};
( $cursor:path , $bits:ty ; $( $val:expr , )* ) => {
bitvec![ $cursor , $bits ; $( $val ),* ].into_boxed_bitslice()
};
( $cursor:path ; $( $val:expr ),* ) => {
bitvec![ $cursor , u8 ; $( $val ),* ].into_boxed_bitslice()
};
( $cursor:path ; $( $val:expr , )* ) => {
bitvec![ $cursor , u8 ; $( $val ),* ].into_boxed_bitslice()
};
( $( $val:expr ),* ) => {
bitvec![ $crate::prelude::BigEndian , u8 ; $( $val ),* ].into_boxed_bitslice()
};
( $( $val:expr , )* ) => {
bitvec![ $crate::prelude::BigEndian , u8 ; $( $val ),* ].into_boxed_bitslice()
};
( $cursor:path , $bits:ty ; $val:expr ; $rep:expr ) => {
bitvec![ $cursor , $bits ; $val; $rep ].into_boxed_bitslice()
};
( $cursor:path ; $val:expr ; $rep:expr ) => {
bitvec![ $cursor , u8 ; $val ; $rep ].into_boxed_bitslice()
};
( $val:expr ; $rep:expr ) => {
bitvec![ $crate::prelude::BigEndian , u8 ; $val ; $rep ].into_boxed_bitslice()
};
}
#[doc(hidden)]
macro_rules! __bitslice_shift {
( $( $t:ty ),+ ) => { $(
#[doc(hidden)]
impl<C, T >core::ops::ShlAssign<$t>
for $crate::prelude::BitSlice<C,T>
where C: $crate::cursor::Cursor, T: $crate::store::BitStore {
fn shl_assign(&mut self, shamt: $t) {
core::ops::ShlAssign::<usize>::shl_assign(
self,
shamt as usize,
)
}
}
#[doc(hidden)]
impl<C, T> core::ops::ShrAssign<$t>
for $crate::prelude::BitSlice<C,T>
where C: $crate::cursor::Cursor, T: $crate::store::BitStore {
fn shr_assign(&mut self,shamt: $t){
core::ops::ShrAssign::<usize>::shr_assign(
self,
shamt as usize,
)
}
}
)+ };
}
#[cfg(feature = "alloc")]
#[doc(hidden)]
macro_rules! __bitvec_shift {
( $( $t:ty ),+ ) => { $(
#[doc(hidden)]
impl<C, T> core::ops::Shl<$t>
for $crate::vec::BitVec<C, T>
where C: $crate::cursor::Cursor, T: $crate::store::BitStore {
type Output = <Self as core::ops::Shl<usize>>::Output;
fn shl(self, shamt: $t) -> Self::Output {
core::ops::Shl::<usize>::shl(self, shamt as usize)
}
}
#[doc(hidden)]
impl<C, T> core::ops::ShlAssign<$t>
for $crate::vec::BitVec<C, T>
where C: $crate::cursor::Cursor, T: $crate::store::BitStore {
fn shl_assign(&mut self, shamt: $t) {
core::ops::ShlAssign::<usize>::shl_assign(
self,
shamt as usize,
)
}
}
#[doc(hidden)]
impl<C, T> core::ops::Shr<$t>
for $crate::vec::BitVec<C, T>
where C: $crate::cursor::Cursor, T: $crate::store::BitStore {
type Output = <Self as core::ops::Shr<usize>>::Output;
fn shr(self, shamt: $t) -> Self::Output {
core::ops::Shr::<usize>::shr(self, shamt as usize)
}
}
#[doc(hidden)]
impl<C, T> core::ops::ShrAssign<$t>
for $crate::vec::BitVec<C, T>
where C: $crate::cursor::Cursor, T: $crate::store::BitStore {
fn shr_assign(&mut self, shamt: $t) {
core::ops::ShrAssign::<usize>::shr_assign(
self,
shamt as usize,
)
}
}
)+ };
}
#[cfg(all(test, any(feature = "alloc", feature = "std")))]
mod tests {
#[allow(unused_imports)]
use crate::cursor::{
BigEndian,
LittleEndian,
};
#[test]
fn compile_bitvec_macros() {
bitvec![0, 1];
bitvec![BigEndian; 0, 1];
bitvec![LittleEndian; 0, 1];
bitvec![BigEndian, u8; 0, 1];
bitvec![LittleEndian, u8; 0, 1];
bitvec![BigEndian, u16; 0, 1];
bitvec![LittleEndian, u16; 0, 1];
bitvec![BigEndian, u32; 0, 1];
bitvec![LittleEndian, u32; 0, 1];
bitvec![BigEndian, u64; 0, 1];
bitvec![LittleEndian, u64; 0, 1];
bitvec![1; 70];
bitvec![BigEndian; 0; 70];
bitvec![LittleEndian; 1; 70];
bitvec![BigEndian, u8; 0; 70];
bitvec![LittleEndian, u8; 1; 70];
bitvec![BigEndian, u16; 0; 70];
bitvec![LittleEndian, u16; 1; 70];
bitvec![BigEndian, u32; 0; 70];
bitvec![LittleEndian, u32; 1; 70];
bitvec![BigEndian, u64; 0; 70];
bitvec![LittleEndian, u64; 1; 70];
}
#[test]
fn compile_bitbox_macros() {
bitbox![0, 1];
bitbox![BigEndian; 0, 1];
bitbox![LittleEndian; 0, 1];
bitbox![BigEndian, u8; 0, 1];
bitbox![LittleEndian, u8; 0, 1];
bitbox![BigEndian, u16; 0, 1];
bitbox![LittleEndian, u16; 0, 1];
bitbox![BigEndian, u32; 0, 1];
bitbox![LittleEndian, u32; 0, 1];
bitbox![BigEndian, u64; 0, 1];
bitbox![LittleEndian, u64; 0, 1];
bitbox![1; 70];
bitbox![BigEndian; 0; 70];
bitbox![LittleEndian; 1; 70];
bitbox![BigEndian, u8; 0; 70];
bitbox![LittleEndian, u8; 1; 70];
bitbox![BigEndian, u16; 0; 70];
bitbox![LittleEndian, u16; 1; 70];
bitbox![BigEndian, u32; 0; 70];
bitbox![LittleEndian, u32; 1; 70];
bitbox![BigEndian, u64; 0; 70];
bitbox![LittleEndian, u64; 1; 70];
}
}