use std::fmt::Debug;
use crate::reference::fft64::{
convolution::I64Ops,
reim::{ReimArith, ReimFFTExecute, ReimFFTTable, ReimIFFTTable, fft_ref, ifft_ref},
reim4::{Reim4BlkMatVec, Reim4Convolution},
};
use poulpy_hal::api::{NegacyclicFFT, NegacyclicFFTNew};
use rand_distr::num_traits::{Float, FloatConst};
use super::FFT64Ref;
pub struct FFT64ReimTable<F: Float + FloatConst + Debug> {
fft: ReimFFTTable<F>,
ifft: ReimIFFTTable<F>,
}
impl<F: Float + FloatConst + Debug> NegacyclicFFT<F> for FFT64ReimTable<F> {
fn m(&self) -> usize {
self.fft.m()
}
fn fft(&self, data: &mut [F]) {
self.fft.execute(data);
}
fn ifft(&self, data: &mut [F]) {
self.ifft.execute(data);
}
}
impl<F: Float + FloatConst + Debug> NegacyclicFFTNew<F> for FFT64ReimTable<F> {
fn new(m: usize) -> Self {
Self {
fft: ReimFFTTable::new(m),
ifft: ReimIFFTTable::new(m),
}
}
}
impl ReimFFTExecute<ReimFFTTable<f64>, f64> for FFT64Ref {
fn reim_dft_execute(table: &ReimFFTTable<f64>, data: &mut [f64]) {
fft_ref(table.m(), table.omg(), data);
}
}
impl ReimFFTExecute<ReimIFFTTable<f64>, f64> for FFT64Ref {
fn reim_dft_execute(table: &ReimIFFTTable<f64>, data: &mut [f64]) {
ifft_ref(table.m(), table.omg(), data);
}
}
impl ReimArith for FFT64Ref {}
impl Reim4BlkMatVec for FFT64Ref {}
impl Reim4Convolution for FFT64Ref {}
impl I64Ops for FFT64Ref {}