#[macro_export]
macro_rules! bitvec {
( $end:ident , $prim:ty ; $( $elt:expr ),* ) => {
__bitvec_impl![ $end, $prim ; $( $elt ),* ]
};
( $end:ident , $prim:ty ; $( $elt:expr , )* ) => {
__bitvec_impl![ $end , $prim ; $( $elt ),* ]
};
( $end:ident ; $( $elt:expr ),* ) => {
__bitvec_impl![ $end , u8 ; $( $elt ),* ]
};
( $end:ident ; $( $elt:expr , )* ) => {
__bitvec_impl![ $end , u8 ; $( $elt ),* ]
};
( $( $elt:expr ),* ) => {
__bitvec_impl![ BigEndian , u8 ; $($elt),* ]
};
( $( $elt:expr , )* ) => {
__bitvec_impl![ BigEndian , u8 ; $($elt),* ]
};
( $end:ident , $prim:ty ; $elt:expr ; $rep:expr ) => {
__bitvec_impl![ $end , $prim ; $elt; $rep ]
};
( $end:ident ; $elt:expr ; $rep:expr ) => {
__bitvec_impl![ $end , u8 ; $elt; $rep ]
};
( $elt:expr ; $rep:expr ) => {
__bitvec_impl![ BigEndian, u8 ; $elt; $rep ]
};
}
#[macro_export]
#[doc(hidden)]
macro_rules! __bitvec_impl {
( $end:ident , $prim:ty ; $( $elt:expr ),* ) => {{
let init: &[bool] = &[
$( $elt as u8 > 0 ),*
];
$crate :: BitVec ::< $crate :: $end , $prim >:: from(init)
}};
( $end:ident , $prim:ty ; $elt:expr; $rep:expr ) => {{
::std::iter::repeat( $elt as u8 > 0 )
.take( $rep )
.collect ::< $crate :: BitVec < $crate :: $end , $prim > > ()
}};
}
#[cfg(test)]
mod tests {
#[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];
}
}