#[doc(hidden)]
macro_rules! for_each_dim_inner {
($f:ident [$($out:tt)*]) => { $($out)* };
($f:ident [$($out:tt)*] [ii] $($rest:tt)*) => {
for_each_dim_inner!($f [$($out)* . $f] $($rest)*)
};
($f:ident [$($out:tt)*] { $($inner:tt)* } $($rest:tt)*) => {
for_each_dim_inner!($f [$($out)* { for_each_dim_inner!($f [] $($inner)*) }] $($rest)*)
};
($f:ident [$($out:tt)*] ( $($inner:tt)* ) $($rest:tt)*) => {
for_each_dim_inner!($f [$($out)* ( for_each_dim_inner!($f [] $($inner)*) )] $($rest)*)
};
($f:ident [$($out:tt)*] [ $($inner:tt)* ] $($rest:tt)*) => {
for_each_dim_inner!($f [$($out)* [ for_each_dim_inner!($f [] $($inner)*) ]] $($rest)*)
};
($f:ident [$($out:tt)*] $other:tt $($rest:tt)*) => {
for_each_dim_inner!($f [$($out)* $other] $($rest)*)
};
}
macro_rules! for_each_dim {
($i:ident => $($body:tt)*) => {{
#[cfg(feature = "dim2")]
{
{ const $i: usize = 0; for_each_dim_inner!(x [] $($body)*); }
{ const $i: usize = 1; for_each_dim_inner!(y [] $($body)*); }
}
#[cfg(feature = "dim3")]
{
{ const $i: usize = 0; for_each_dim_inner!(x [] $($body)*); }
{ const $i: usize = 1; for_each_dim_inner!(y [] $($body)*); }
{ const $i: usize = 2; for_each_dim_inner!(z [] $($body)*); }
}
}};
($($body:tt)*) => {{
#[cfg(feature = "dim2")]
{
for_each_dim_inner!(x [] $($body)*);
for_each_dim_inner!(y [] $($body)*);
}
#[cfg(feature = "dim3")]
{
for_each_dim_inner!(x [] $($body)*);
for_each_dim_inner!(y [] $($body)*);
for_each_dim_inner!(z [] $($body)*);
}
}};
}