use std::fmt::Debug;
use rand_distr::num_traits::{Float, FloatConst};
use crate::{
layouts::{Backend, Module},
reference::fft64::reim::{ReimFFTTable, ReimIFFTTable},
};
pub trait FFTModuleHandle<F>
where
F: Float + FloatConst + Debug,
{
fn get_fft_table(&self) -> &ReimFFTTable<F>;
fn get_ifft_table(&self) -> &ReimIFFTTable<F>;
}
pub unsafe trait FFTHandleProvider<F>
where
F: Float + FloatConst + Debug,
{
fn get_fft_table(&self) -> &ReimFFTTable<F>;
fn get_ifft_table(&self) -> &ReimIFFTTable<F>;
}
pub unsafe trait FFT64HandleFactory: Sized {
fn create_fft64_handle(n: usize) -> Self;
fn assert_fft64_runtime_support() {}
}
impl<BE: Backend> FFTModuleHandle<BE::ScalarPrep> for Module<BE>
where
BE::ScalarPrep: Float + FloatConst + Debug,
BE::Handle: FFTHandleProvider<BE::ScalarPrep>,
{
fn get_fft_table(&self) -> &ReimFFTTable<BE::ScalarPrep> {
unsafe { (&*self.ptr()).get_fft_table() }
}
fn get_ifft_table(&self) -> &ReimIFFTTable<BE::ScalarPrep> {
unsafe { (&*self.ptr()).get_ifft_table() }
}
}