use std::ptr::NonNull; use poulpy_hal::{ layouts::{Backend, Module}, oep::ModuleNewImpl, reference::fft64::reim::{ReimFFTTable, ReimIFFTTable}, }; use crate::FFT64Ref; #[repr(C)] pub struct FFT64RefHandle { table_fft: ReimFFTTable, table_ifft: ReimIFFTTable, } impl Backend for FFT64Ref { type ScalarPrep = f64; type ScalarBig = i64; type Handle = FFT64RefHandle; unsafe fn destroy(handle: NonNull) { unsafe { drop(Box::from_raw(handle.as_ptr())); } } fn layout_big_word_count() -> usize { 1 } fn layout_prep_word_count() -> usize { 1 } } unsafe impl ModuleNewImpl for FFT64Ref { fn new_impl(n: u64) -> Module { let handle: FFT64RefHandle = FFT64RefHandle { table_fft: ReimFFTTable::new(n as usize >> 1), table_ifft: ReimIFFTTable::new(n as usize >> 1), }; // Leak Box to get a stable NonNull pointer let ptr: NonNull = NonNull::from(Box::leak(Box::new(handle))); unsafe { Module::from_nonnull(ptr, n) } } } pub trait FFT64ModuleHandle { fn get_fft_table(&self) -> &ReimFFTTable; fn get_ifft_table(&self) -> &ReimIFFTTable; } impl FFT64ModuleHandle for Module { fn get_fft_table(&self) -> &ReimFFTTable { let h: &FFT64RefHandle = unsafe { &*self.ptr() }; &h.table_fft } fn get_ifft_table(&self) -> &ReimIFFTTable { let h: &FFT64RefHandle = unsafe { &*self.ptr() }; &h.table_ifft } }