#![allow(deprecated)]
#[macro_use]
#[doc(hidden)]
pub mod internal;
#[macro_export]
macro_rules! bitarr {
(for $len:expr, in $order:ty, $store:ident) => {
$crate::array::BitArray::<
$order,
[$store; $crate::mem::elts::<$store>($len)],
>
};
(for $len:expr, in $store:ident) => {
$crate::bitarr!(for $len, in $crate::order::Lsb0, $store)
};
(for $len:expr) => {
$crate::bitarr!(for $len, in usize)
};
($order:ident, Cell<$store:ident>; $($val:expr),* $(,)?) => {
$crate::array::BitArray::<
$order, [
$crate::macros::internal::core::cell::Cell<$store>;
$crate::__count_elts!($store; $($val),*)
],
>::new(
$crate::__encode_bits!($order, Cell<$store>; $($val),*)
)
};
($order:ident, $store:ident; $($val:expr),* $(,)?) => {
$crate::array::BitArray::<
$order,
[$store; $crate::__count_elts!($store; $($val),*)],
>::new(
$crate::__encode_bits!($order, $store; $($val),*)
)
};
($order:path, Cell<$store:ident>; $($val:expr),* $(,)?) => {
$crate::array::BitArray::<
$order, [
$crate::macros::internal::core::cell::Cell<$store>;
$crate::__count_elts!($store; $($val),*)
],
>::new(
$crate::__encode_bits!($order, Cell<$store>; $($val),*)
)
};
($order:path, $store:ident; $($val:expr),* $(,)?) => {
$crate::array::BitArray::<
$order,
[$store; $crate::__count_elts!($store; $($val),*)],
>::new(
$crate::__encode_bits!($order, $store; $($val),*)
)
};
($order:ident; $($val:expr),* $(,)?) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bitarr!($order, usize; $($val),*)
}};
($order:path; $($val:expr),* $(,)?) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bitarr!($order, usize; $($val),*)
}};
($order:ident, Cell<$store:ident>; $val:expr; $len:expr) => {{
let elem = $crate::__extend_bool!($val, $store);
let base = [elem; $crate::mem::elts::<$store>($len)];
let elts = unsafe {
$crate::macros::internal::core::mem::transmute(base)
};
$crate::array::BitArray::<
$order,
[Cell<$store>; $crate::mem::elts::<$store>($len)],
>::new(elts)
}};
($order:ident, $store:ident; $val:expr; $len:expr) => {{
use $crate::macros::internal::core::mem::MaybeUninit;
use $crate::store::BitStore as _;
const LEN: usize = $crate::mem::elts::<$store>($len);
let elem = $crate::__extend_bool!($val, $store);
let mut elts: MaybeUninit<[$store; LEN]> = MaybeUninit::uninit();
let mut addr = elts.as_mut_ptr() as *mut $store;
for _ in 0 .. LEN {
unsafe {
addr.write(<$store>::from(elem.load_value()));
addr = addr.add(1);
}
}
$crate::array::BitArray::<$order, [$store; LEN]>::new(unsafe {
elts.assume_init()
})
}};
($order:path, Cell<$store:ident>; $val:expr; $len:expr) => {{
let elem = $crate::__extend_bool!($val, $store);
let base = [elem; $crate::mem::elts::<$store>($len)];
let elts = unsafe {
$crate::macros::internal::core::mem::transmute(base)
};
$crate::array::BitArray::<
$order,
[Cell<$store>; $crate::mem::elts::<$store>($len)],
>::new(elts)
}};
($order:path, $store:ident; $val:expr; $len:expr) => {{
use $crate::macros::internal::core::mem::MaybeUninit;
use $crate::store::BitStore as _;
const LEN: usize = $crate::mem::elts::<$store>($len);
let elem = $crate::__extend_bool!($val, $store);
let mut elts: MaybeUninit<[$store; LEN]> = MaybeUninit::uninit();
let mut addr = elts.as_mut_ptr() as *mut $store;
for _ in 0 .. LEN {
unsafe {
addr.write(<$store>::from(elem.load_value()));
addr = addr.add(1);
}
}
$crate::array::BitArray::<$order, [$store; LEN]>::new(unsafe {
elts.assume_init()
})
}};
($order:ident; $val:expr; $len:expr) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bitarr!($order, usize; $val; $len)
}};
($order:path; $val:expr; $len:expr) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bitarr!($order, usize; $val; $len)
}};
($($val:expr),* $(,)?) => {
$crate::bitarr!(Lsb0, usize; $($val),*)
};
($val:expr; $len:expr) => {
$crate::bitarr!(Lsb0, usize; $val; $len)
};
}
#[macro_export]
macro_rules! bits {
(mut $order:ident, Cell<$store:ident>; $($val:expr),* $(,)?) => {{
&mut $crate::bitarr![$order, Cell<$store>; $($val),*][.. $crate::__count!($($val),*)]
}};
(mut $order:ident, $store:ident; $($val:expr),* $(,)?) => {{
&mut $crate::bitarr![$order, $store; $($val),*][.. $crate::__count!($($val),*)]
}};
(mut $order:path, Cell<$store:ident>; $($val:expr),* $(,)?) => {{
&mut $crate::bitarr![$order, Cell<$store>; $($val),*][.. $crate::__count!($($val),*)]
}};
(mut $order:path, $store:ident; $($val:expr),* $(,)?) => {{
&mut $crate::bitarr![$order, $store; $($val),*][.. $crate::__count!($($val),*)]
}};
(mut $order:ident; $($val:expr),* $(,)?) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bits!(mut $order, usize; $($val),*)
}};
(mut $order:path; $($val:expr),* $(,)?) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bits!(mut $order, usize; $($val),*)
}};
(mut $order:ident, Cell<$store:ident>; $val:expr; $len:expr) => {{
&mut $crate::bitarr![$order, Cell<$store>; $val; $len][.. $len]
}};
(mut $order:ident, $store:ident; $val:expr; $len:expr) => {{
&mut $crate::bitarr![$order, $store; $val; $len][.. $len]
}};
(mut $order:path, Cell<$store:ident>; $val:expr; $len:expr) => {{
&mut $crate::bitarr![$order, Cell<$store>; $val; $len][.. $len]
}};
(mut $order:path, $store:ident; $val:expr; $len:expr) => {{
&mut $crate::bitarr![$order, $store; $val; $len][.. $len]
}};
(mut $order:ident; $val:expr; $len:expr) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bits!(mut $order, usize; $val; $len)
}};
(mut $order:path; $val:expr; $len:expr) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bits!(mut $order, usize; $val; $len)
}};
(mut $($val:expr),* $(,)?) => {
$crate::bits!(mut Lsb0, usize; $($val),*)
};
(mut $val:expr; $len:expr) => {
$crate::bits!(mut Lsb0, usize; $val; $len)
};
($order:ident, Cell<$store:ident>; $($val:expr),* $(,)?) => {{
&$crate::bitarr![$order, Cell<$store>; $($val),*][.. $crate::__count!($($val),*)]
}};
($order:ident, $store:ident; $($val:expr),* $(,)?) => {{
&$crate::bitarr![$order, $store; $($val),*][.. $crate::__count!($($val),*)]
}};
($order:path, Cell<$store:ident>; $($val:expr),* $(,)?) => {{
&$crate::bitarr![$order, Cell<$store>; $($val),*][.. $crate::__count!($($val),*)]
}};
($order:path, $store:ident; $($val:expr),* $(,)?) => {{
&$crate::bitarr![$order, $store; $($val),*][.. $crate::__count!($($val),*)]
}};
($order:ident; $($val:expr),* $(,)?) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bits!($order, usize; $($val),*)
}};
($order:path; $($val:expr),* $(,)?) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bits!($order, usize; $($val),*)
}};
($order:ident, Cell<$store:ident>; $val:expr; $len:expr) => {{
&$crate::bitarr![$order, Cell<$store>; $val; $len][.. $len]
}};
($order:ident, $store:ident; $val:expr; $len:expr) => {{
&$crate::bitarr![$order, $store; $val; $len][.. $len]
}};
($order:path, Cell<$store:ident>; $val:expr; $len:expr) => {{
&$crate::bitarr![$order, Cell<$store>; $val; $len][.. $len]
}};
($order:path, $store:ident; $val:expr; $len:expr) => {{
&$crate::bitarr![$order, $store; $val; $len][.. $len]
}};
($order:ident; $val:expr; $len:expr) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bits!($order, usize; $val; $len)
}};
($order:path; $val:expr; $len:expr) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::bits!($order, usize; $val; $len)
}};
($($val:expr),* $(,)?) => {
$crate::bits!(Lsb0, usize; $($val),*)
};
($val:expr; $len:expr) => {
$crate::bits!(Lsb0, usize; $val; $len)
};
}
#[macro_export]
#[cfg(feature = "alloc")]
macro_rules! bitvec {
($order:ty, Cell<$store:ident>; $val:expr; $rep:expr) => {
$crate::vec::BitVec::<
$order,
$crate::macros::internal::core::cell::Cell<$store>
>::repeat($val != 0, $rep)
};
($order:ty, $store:ident; $val:expr; $rep:expr) => {
$crate::vec::BitVec::<$order, $store>::repeat($val != 0, $rep)
};
($order:ty; $val:expr; $rep:expr) => {{
$crate::macros::internal::__deprecated_order_no_store();
$crate::vec::BitVec::<$order, usize>::repeat($val != 0, $rep)
}};
($val:expr; $rep:expr) => {
$crate::vec::BitVec::<$crate::order::Lsb0, usize>::repeat($val != 0, $rep)
};
($($arg:tt)*) => {{
$crate::vec::BitVec::from_bitslice($crate::bits!($($arg)*))
}};
}
#[macro_export]
#[cfg(feature = "alloc")]
macro_rules! bitbox {
($($arg:tt)*) => {
$crate::bitvec!($($arg)*).into_boxed_bitslice()
};
}
#[cfg(test)]
mod tests;