#[macro_export]
macro_rules! bitvec {
( $endian:ident , $primitive:ty ; $( $elt:expr ),* ) => {
bitvec![ __bv_impl__ $endian , $primitive ; $( $elt ),* ]
};
( $endian:ident , $primitive:ty ; $( $elt:expr , )* ) => {
bitvec![ __bv_impl__ $endian , $primitive ; $( $elt ),* ]
};
( $endian:ident ; $( $elt:expr ),* ) => {
bitvec![ __bv_impl__ $endian , u8 ; $( $elt ),* ]
};
( $endian:ident ; $( $elt:expr , )* ) => {
bitvec![ __bv_impl__ $endian , u8 ; $( $elt ),* ]
};
( $( $elt:expr ),* ) => {
bitvec![ __bv_impl__ BigEndian , u8 ; $($elt),* ]
};
( $( $elt:expr , )* ) => {
bitvec![ __bv_impl__ BigEndian , u8 ; $($elt),* ]
};
( $endian:ident , $primitive:ty ; $elt:expr ; $rep:expr ) => {
bitvec![ __bv_impl__ $endian , $primitive ; $elt; $rep ]
};
( $endian:ident ; $elt:expr ; $rep:expr ) => {
bitvec![ __bv_impl__ $endian , u8 ; $elt; $rep ]
};
( $elt:expr ; $rep:expr ) => {
bitvec![ __bv_impl__ BigEndian , u8 ; $elt; $rep ]
};
( __bv_impl__ $end:ident , $prim:ty ; $( $elt:expr ),* ) => {{
let init: &[bool] = &[
$( $elt as u8 > 0 ),*
];
$crate :: BitVec ::< $crate :: $end , $prim >:: from(init)
}};
( __bv_impl__ $end:ident , $prim:ty ; $elt:expr; $rep:expr ) => {{
::std::iter::repeat( $elt as u8 > 0 )
.take( $rep )
.collect ::< $crate :: BitVec < $crate :: $end , $prim > > ()
}};
}
#[doc(hidden)]
macro_rules! __bitslice_shift {
( $( $t:ty ),+ ) => { $(
#[doc(hidden)]
impl<E: $crate::Endian, T: $crate::Bits> ::std::ops::ShlAssign< $t >
for $crate::BitSlice<E, T>
{
fn shl_assign(&mut self, shamt: $t ) {
::std::ops::ShlAssign::<usize>::shl_assign(self, shamt as usize);
}
}
#[doc(hidden)]
impl<E: $crate::Endian, T: $crate::Bits> ::std::ops::ShrAssign< $t >
for $crate::BitSlice<E, T>
{
fn shr_assign(&mut self, shamt: $t ) {
::std::ops::ShrAssign::<usize>::shr_assign(self, shamt as usize);
}
}
)+ };
}
#[doc(hidden)]
macro_rules! __bitvec_shift {
( $( $t:ty ),+ ) => { $(
#[doc(hidden)]
impl<E: $crate::Endian, T: $crate::Bits> ::std::ops::Shl< $t >
for $crate::BitVec<E, T>
{
type Output = <Self as ::std::ops::Shl<usize>>::Output;
fn shl(self, shamt: $t ) -> Self::Output {
::std::ops::Shl::<usize>::shl(self, shamt as usize)
}
}
#[doc(hidden)]
impl<E: $crate::Endian, T: $crate::Bits> ::std::ops::ShlAssign< $t >
for $crate::BitVec<E, T>
{
fn shl_assign(&mut self, shamt: $t ) {
::std::ops::ShlAssign::<usize>::shl_assign(self, shamt as usize)
}
}
#[doc(hidden)]
impl<E: $crate::Endian, T: $crate::Bits> ::std::ops::Shr< $t >
for $crate::BitVec<E, T>
{
type Output = <Self as ::std::ops::Shr<usize>>::Output;
fn shr(self, shamt: $t ) -> Self::Output {
::std::ops::Shr::<usize>::shr(self, shamt as usize)
}
}
#[doc(hidden)]
impl<E: $crate::Endian, T: $crate::Bits> ::std::ops::ShrAssign< $t >
for $crate::BitVec<E, T>
{
fn shr_assign(&mut self, shamt: $t ) {
::std::ops::ShrAssign::<usize>::shr_assign(self, shamt as usize)
}
}
)+ };
}
#[cfg(test)]
mod tests {
#[allow(unused_imports)]
use crate::{
BigEndian,
LittleEndian,
};
#[test]
fn compile_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];
}
}