I need a macro to prevent the need to write the following code for over a dozen powers of 2:
pub(crate) fn calc(samples: &[f32]) -> Vec<Complex32> {
let buffer = samples;
let mut res = {
if buffer.len() == 2 {
let mut buffer: [_; 2] = buffer.try_into().unwrap();
real::rfft_2(&mut buffer).to_vec()
} else if buffer.len() == 4 {
let mut buffer: [_; 4] = buffer.try_into().unwrap();
real::rfft_4(&mut buffer).to_vec()
/// ..
} else if buffer.len() == 16384 {
let mut buffer: [_; 16384] = buffer.try_into().unwrap();
real::rfft_16384(&mut buffer).to_vec()
} else {
panic!(
"`microfft::real` only supports powers of 2 between 2 and 16384 for the amount of samples!"
);
}
However, I do not know how I can express this in a Rust macro definition. A macro would be invoked like this:
generate_ifs!(buffer, 2, 4, 8, 16, 32, 64, 128, 256, ..., 16384)
Probably, I need something like this:
macro_rules! generate_ifs {
($buffer:ident, $e:literal) => {
{
}
};
($buffer:ident, $e:literal, $($es:literal),+) => {{
generate_ifs! { $buffer:ident, $e }
// do something special to generate "else if"
generate_ifs! { $buffer:ident, $($es),+ }
}};
}
But I can't see how this may work out in the end.