#[macro_export]
macro_rules! toggle {
($bitmap: tt, $ty: ty, [..]) => {
{
!($bitmap)
}
};
(in $bitmap: ident, $ty: ty, [..]) => {
{
$bitmap = !($bitmap);
}
};
($bitmap: tt, $ty: ty, rev [..]) => {
{
!($bitmap)
}
};
(in $bitmap: ident, $ty: ty, rev [..]) => {
{
$bitmap = !($bitmap);
}
};
($bitmap: tt, $ty: ty, [$( $bit_pos: tt),*]) => {
{
($bitmap as $ty) ^ ($( ((1 as $ty) << $bit_pos) | )* (0 as $ty))
}
};
(in $bitmap: ident, $ty: ty, [$( $bit_pos: tt),*]) => {
$bitmap ^= $( ((1 as $ty) << $bit_pos) | )* (0 as $ty);
};
($bitmap: tt, $ty: ty, rev [$( $bit_pos: tt),*]) => {
{
($bitmap as $ty)
^ ($( ((1 as $ty) << ($crate::max_bits!(type = ($ty)) - $bit_pos - 1)) | )* (0 as $ty))
}
};
(in $bitmap: ident, $ty: ty, rev [$( $bit_pos: tt),*]) => {
$bitmap ^= $( ((1 as $ty) << ($crate::max_bits!(type = ($ty)) - $bit_pos - 1)) | )* (0 as $ty);
};
($bitmap: tt, $ty: ty, [$start_pos: tt .. $end_pos: tt]) => {
{
let mask = $crate::mask!([($start_pos)..($end_pos)], ($ty));
$bitmap ^ mask
}
};
($bitmap: tt, $ty: ty, [.. $end_pos: tt]) => {
{
let mask = $crate::mask!([..($end_pos)], ($ty));
$bitmap ^ mask
}
};
($bitmap: tt, $ty: ty, [$start_pos: tt ..]) => {
{
let mask = $crate::mask!([($start_pos)..], ($ty));
$bitmap ^ mask
}
};
(in $bitmap: ident, $ty: ty, [$start_pos: tt .. $end_pos: tt]) => {
let mask = $crate::mask!([($start_pos)..($end_pos)], ($ty));
$bitmap ^= mask;
};
(in $bitmap: ident, $ty: ty, [$start_pos: tt ..]) => {
let mask = $crate::mask!([($start_pos)..], ($ty));
$bitmap ^= mask;
};
(in $bitmap: ident, $ty: ty, [.. $end_pos: tt]) => {
let mask = $crate::mask!([..($end_pos)], ($ty));
$bitmap ^= mask;
};
($bitmap: tt, $ty: ty, [start = $start_pos: tt, count = $count: tt]) => {
{
let mask = $crate::mask!([start = ($start_pos), count = ($count)], ($ty));
$bitmap ^ mask
}
};
(in $bitmap: ident, $ty: ty, [start = $start_pos: tt, count = $count: tt]) => {
let mask = $crate::mask!([start = ($start_pos), count = ($count)], $ty);
$bitmap ^= mask;
};
($bitmap: tt, $ty: ty, rev [$start_pos: tt .. $end_pos: tt]) => {
{
let mask = $crate::mask!(rev [($start_pos)..($end_pos)], ($ty));
$bitmap ^ mask
}
};
($bitmap: tt, $ty: ty, rev [.. $end_pos: tt]) => {
{
let mask = $crate::mask!(rev [..($end_pos)], ($ty));
$bitmap ^ mask
}
};
($bitmap: tt, $ty: ty, rev [$start_pos: tt ..]) => {
{
let mask = $crate::mask!(rev [($start_pos)..], ($ty));
$bitmap ^ mask
}
};
(in $bitmap: ident, $ty: ty, rev [$start_pos: tt .. $end_pos: tt]) => {
let mask = $crate::mask!(rev [($start_pos)..($end_pos)], ($ty));
$bitmap ^= mask;
};
(in $bitmap: ident, $ty: ty, rev [$start_pos: tt ..]) => {
let mask = $crate::mask!(rev [($start_pos)..], ($ty));
$bitmap ^= mask;
};
(in $bitmap: ident, $ty: ty, rev [.. $end_pos: tt]) => {
let mask = $crate::mask!(rev [..($end_pos)], ($ty));
$bitmap ^= mask;
};
($bitmap: tt, $ty: ty, rev [start = $start_pos: tt, count = $count: tt]) => {
{
let mask = $crate::mask!(rev [start = ($start_pos), count = ($count)], ($ty));
$bitmap ^ mask
}
};
(in $bitmap: ident, $ty: ty, rev [start = $start_pos: tt, count = $count: tt]) => {
let mask = $crate::mask!(rev [start = ($start_pos), count = ($count)], ($ty));
$bitmap ^= mask;
};
($bitmap: tt, $ty: ty, rev $bit_pos: tt) => {
{
($bitmap as $ty) ^ ((1 as $ty) << ($crate::max_bits!(type = ($ty)) - $bit_pos - 1))
}
};
(in $bitmap: ident, $ty: ty, rev $bit_pos: tt) => {
$bitmap ^= ((1 as $ty) << ($crate::max_bits!(type = ($ty)) - $bit_pos - 1));
};
($bitmap: tt, $ty: ty, $bit_pos: tt) => {
{
($bitmap as $ty) ^ ((1 as $ty) << $bit_pos)
}
};
(in $bitmap: ident, $ty: ty, $bit_pos: tt) => {
$bitmap ^= (1 as $ty) << $bit_pos;
};
}