#[macro_use]
#[doc(hidden)]
pub mod internal;
#[macro_export]
macro_rules! bits {
($order:ident, $store:ident; $($val:expr),* $(,)?) => {{
static DATA: &[$store] = &$crate::__bits_store_array!(
$order, $store; $($val),*
);
&$crate::__bits_from_slice!(
$order, $store, $crate::__count!($($val),*), DATA
)
}};
($order:path, $store:ident; $($val:expr),* $(,)?) => {{
static DATA: &[$store] = &$crate::__bits_store_array!(
$order, $store; $($val),*
);
&$crate::__bits_from_slice!(
$order, $store, $crate::__count!($($val),*), DATA
)
}};
($order:ident; $($val:expr),* $(,)?) => {
$crate::bits!($order, usize; $($val),*)
};
($order:path; $($val:expr),* $(,)?) => {
$crate::bits!($order, usize; $($val),*)
};
($($val:expr),* $(,)?) => {
$crate::bits!(Local, usize; $($val),*)
};
($order:ident, $store:ident; $val:expr; $len:expr) => {{
static DATA: &[$store] = &[
$crate::__extend_bool!($val, $store);
$crate::store::elts::<$store>($len)
];
&$crate::__bits_from_slice!($order, $store, $len, DATA)
}};
($order:path, $store:ident; $val:expr; $len:expr) => {{
static DATA: &[$store] = &[
$crate::__extend_bool!($val, $store);
$crate::store::elts::<$store>($len)
];
&$crate::__bits_from_slice!($order, $store, $len, DATA)
}};
($order:ident; $val:expr; $len:expr) => {
$crate::bits!($order, usize; $val; $len)
};
($order:path; $val:expr; $len:expr) => {
$crate::bits!($order, usize; $val; $len)
};
($val:expr; $len:expr) => {
$crate::bits!(Local, usize; $val; $len)
};
}
#[cfg(feature = "alloc")]
#[macro_export]
macro_rules! bitvec {
($order:ty, $store:ident; $val:expr; $rep:expr) => {
$crate::vec::BitVec::<$order, $store>::repeat($val != 0, $rep)
};
($order:ty; $val:expr; $rep:expr) => {
$crate::bitvec!($order, usize; $val; $rep)
};
($val:expr; $rep:expr) => {
$crate::bitvec!($crate::order::Local, usize; $val; $rep)
};
($($arg:tt)*) => {{
let bits: &'static $crate::slice::BitSlice::<_, _> = $crate::bits!($($arg)*);
$crate::vec::BitVec::from_bitslice(bits)
}};
}
#[cfg(feature = "alloc")]
#[macro_export]
macro_rules! bitbox {
($($arg:tt)*) => {
$crate::bitvec![$($arg)*].into_boxed_bitslice()
};
}
#[cfg(test)]
mod tests {
#[allow(unused_imports)]
use crate::order::{
Msb0,
Lsb0,
};
#[test]
#[cfg(feature = "alloc")]
fn compile_bits_macros() {
bits![0, 1];
bits![Msb0; 0, 1];
bits![Lsb0; 0, 1];
bits![Msb0, u8; 0, 1];
bits![Lsb0, u8; 0, 1];
bits![Msb0, u16; 0, 1];
bits![Lsb0, u16; 0, 1];
bits![Msb0, u32; 0, 1];
bits![Lsb0, u32; 0, 1];
#[cfg(target_pointer_width = "64")] {
bits![Msb0, u64; 0, 1];
bits![Lsb0, u64; 0, 1];
}
bits![1; 70];
bits![Msb0; 0; 70];
bits![Lsb0; 1; 70];
bits![Msb0, u8; 0; 70];
bits![Lsb0, u8; 1; 70];
bits![Msb0, u16; 0; 70];
bits![Lsb0, u16; 1; 70];
bits![Msb0, u32; 0; 70];
bits![Lsb0, u32; 1; 70];
#[cfg(target_pointer_width = "64")] {
bits![Msb0, u64; 0; 70];
bits![Lsb0, u64; 1; 70];
}
}
#[test]
#[cfg(feature = "alloc")]
fn compile_bitvec_macros() {
bitvec![0, 1];
bitvec![Msb0; 0, 1];
bitvec![Lsb0; 0, 1];
bitvec![Msb0, u8; 0, 1];
bitvec![Lsb0, u8; 0, 1];
bitvec![Msb0, u16; 0, 1];
bitvec![Lsb0, u16; 0, 1];
bitvec![Msb0, u32; 0, 1];
bitvec![Lsb0, u32; 0, 1];
#[cfg(target_pointer_width = "64")] {
bitvec![Msb0, u64; 0, 1];
bitvec![Lsb0, u64; 0, 1];
}
bitvec![1; 70];
bitvec![Msb0; 0; 70];
bitvec![Lsb0; 1; 70];
bitvec![Msb0, u8; 0; 70];
bitvec![Lsb0, u8; 1; 70];
bitvec![Msb0, u16; 0; 70];
bitvec![Lsb0, u16; 1; 70];
bitvec![Msb0, u32; 0; 70];
bitvec![Lsb0, u32; 1; 70];
#[cfg(target_pointer_width = "64")] {
bitvec![Msb0, u64; 0; 70];
bitvec![Lsb0, u64; 1; 70];
}
}
#[test]
#[cfg(feature = "alloc")]
fn compile_bitbox_macros() {
bitbox![0, 1];
bitbox![Msb0; 0, 1];
bitbox![Lsb0; 0, 1];
bitbox![Msb0, u8; 0, 1];
bitbox![Lsb0, u8; 0, 1];
bitbox![Msb0, u16; 0, 1];
bitbox![Lsb0, u16; 0, 1];
bitbox![Msb0, u32; 0, 1];
bitbox![Lsb0, u32; 0, 1];
#[cfg(target_pointer_width = "64")] {
bitbox![Msb0, u64; 0, 1];
bitbox![Lsb0, u64; 0, 1];
}
bitbox![1; 70];
bitbox![Msb0; 0; 70];
bitbox![Lsb0; 1; 70];
bitbox![Msb0, u8; 0; 70];
bitbox![Lsb0, u8; 1; 70];
bitbox![Msb0, u16; 0; 70];
bitbox![Lsb0, u16; 1; 70];
bitbox![Msb0, u32; 0; 70];
bitbox![Lsb0, u32; 1; 70];
#[cfg(target_pointer_width = "64")] {
bitbox![Msb0, u64; 0; 70];
bitbox![Lsb0, u64; 1; 70];
}
}
}