use crate::math::Transcendental;
use crate::traits::ProcessResult;
pub trait MultichannelAlgorithm<T: Transcendental>: Send {
fn num_inputs(&self) -> usize;
fn num_outputs(&self) -> usize;
fn process(&mut self, inputs: &[&[T]], outputs: &mut [&mut [T]]) -> ProcessResult<()>;
fn reset(&mut self);
}
pub struct SisoAdapter<A, T: Transcendental> {
pub inner: A,
_phantom: std::marker::PhantomData<T>,
}
impl<A, T: Transcendental> SisoAdapter<A, T>
where
A: crate::traits::Algorithm<T>,
{
pub fn new(inner: A) -> Self {
Self {
inner,
_phantom: std::marker::PhantomData,
}
}
}
impl<A, T: Transcendental> MultichannelAlgorithm<T> for SisoAdapter<A, T>
where
A: crate::traits::Algorithm<T>,
{
fn num_inputs(&self) -> usize {
1
}
fn num_outputs(&self) -> usize {
1
}
fn process(&mut self, inputs: &[&[T]], outputs: &mut [&mut [T]]) -> ProcessResult<()> {
let input = if inputs.is_empty() {
None
} else {
Some(inputs[0])
};
crate::traits::Algorithm::process(&mut self.inner, input, outputs[0])
}
fn reset(&mut self) {
crate::traits::Algorithm::reset(&mut self.inner);
}
}