use crate::SpectralExecutor;
use crate::factory_dct2::Returning;
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
use crate::util::has_valid_avx;
use std::sync::Arc;
pub(crate) trait Dst2Factory {
fn dst2_split_radix(
length: usize,
half_dct: SpectralExecutor<Self>,
quarter_dct: SpectralExecutor<Self>,
) -> Returning<Self>;
fn dst2_fft(length: usize) -> Returning<Self>;
fn dst2_mixed_radix3(dst2_third: SpectralExecutor<Self>) -> Returning<Self>;
fn dst2_butterfly2() -> SpectralExecutor<Self>;
fn dst2_butterfly3() -> SpectralExecutor<Self>;
fn dst2_butterfly4() -> SpectralExecutor<Self>;
fn dst2_butterfly5() -> SpectralExecutor<Self>;
fn dst2_butterfly6() -> SpectralExecutor<Self>;
fn dst2_butterfly7() -> SpectralExecutor<Self>;
fn dst2_butterfly8() -> SpectralExecutor<Self>;
fn dst2_butterfly9() -> SpectralExecutor<Self>;
fn dst2_butterfly16() -> SpectralExecutor<Self>;
}
impl Dst2Factory for f32 {
fn dst2_split_radix(
length: usize,
half_dct: SpectralExecutor<Self>,
quarter_dct: SpectralExecutor<Self>,
) -> Returning<Self> {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() && length >= 16 {
use crate::avx::AvxSplitRadixDst2f;
return Ok(Arc::new(AvxSplitRadixDst2f::new(
length,
half_dct,
quarter_dct,
)?));
}
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
if length >= 16 {
use crate::neon::NeonSplitRadixDst2f;
return Ok(Arc::new(NeonSplitRadixDst2f::new(
length,
half_dct,
quarter_dct,
)?));
}
}
use crate::type2::SplitRadixDst2;
Ok(Arc::new(SplitRadixDst2::new(
length,
half_dct,
quarter_dct,
)?))
}
fn dst2_fft(length: usize) -> Returning<Self> {
use crate::type2::dst_fft::Dst2Fft;
Ok(Arc::new(Dst2Fft::new(length)?))
}
fn dst2_mixed_radix3(dst2_third: SpectralExecutor<Self>) -> Returning<Self> {
use crate::type2::Dst2Radix3;
Ok(Arc::new(Dst2Radix3::new(dst2_third)?))
}
fn dst2_butterfly2() -> SpectralExecutor<Self> {
use crate::type2::power2_butterflies::Dst2Butterfly2;
Arc::new(Dst2Butterfly2::default())
}
fn dst2_butterfly3() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly3;
Arc::new(Dst2Butterfly3::default())
}
fn dst2_butterfly4() -> SpectralExecutor<Self> {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDst2Butterfly4;
return Arc::new(AvxDst2Butterfly4::default());
}
use crate::type2::power2_butterflies::Dst2Butterfly4;
Arc::new(Dst2Butterfly4::default())
}
fn dst2_butterfly5() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly5;
Arc::new(Dst2Butterfly5::default())
}
fn dst2_butterfly6() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly6;
Arc::new(Dst2Butterfly6::default())
}
fn dst2_butterfly7() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly7;
Arc::new(Dst2Butterfly7::default())
}
fn dst2_butterfly8() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly8;
Arc::new(Dst2Butterfly8::default())
}
fn dst2_butterfly9() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly9;
Arc::new(Dst2Butterfly9::default())
}
fn dst2_butterfly16() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly16;
Arc::new(Dst2Butterfly16::default())
}
}
impl Dst2Factory for f64 {
fn dst2_split_radix(
length: usize,
half_dct: SpectralExecutor<Self>,
quarter_dct: SpectralExecutor<Self>,
) -> Returning<Self> {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() && length > 16 {
use crate::avx::AvxSplitRadixDst2d;
return Ok(Arc::new(AvxSplitRadixDst2d::new(
length,
half_dct,
quarter_dct,
)?));
}
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
if length >= 16 {
use crate::neon::NeonSplitRadixDst2d;
return Ok(Arc::new(NeonSplitRadixDst2d::new(
length,
half_dct,
quarter_dct,
)?));
}
}
use crate::type2::SplitRadixDst2;
Ok(Arc::new(SplitRadixDst2::new(
length,
half_dct,
quarter_dct,
)?))
}
fn dst2_fft(length: usize) -> Returning<Self> {
use crate::type2::dst_fft::Dst2Fft;
Ok(Arc::new(Dst2Fft::new(length)?))
}
fn dst2_mixed_radix3(dst2_third: SpectralExecutor<Self>) -> Returning<Self> {
use crate::type2::Dst2Radix3;
Ok(Arc::new(Dst2Radix3::new(dst2_third)?))
}
fn dst2_butterfly2() -> SpectralExecutor<Self> {
use crate::type2::power2_butterflies::Dst2Butterfly2;
Arc::new(Dst2Butterfly2::default())
}
fn dst2_butterfly3() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly3;
Arc::new(Dst2Butterfly3::default())
}
fn dst2_butterfly4() -> SpectralExecutor<Self> {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDst2Butterfly4;
return Arc::new(AvxDst2Butterfly4::default());
}
use crate::type2::power2_butterflies::Dst2Butterfly4;
Arc::new(Dst2Butterfly4::default())
}
fn dst2_butterfly5() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly5;
Arc::new(Dst2Butterfly5::default())
}
fn dst2_butterfly6() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly6;
Arc::new(Dst2Butterfly6::default())
}
fn dst2_butterfly7() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly7;
Arc::new(Dst2Butterfly7::default())
}
fn dst2_butterfly8() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly8;
Arc::new(Dst2Butterfly8::default())
}
fn dst2_butterfly9() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly9;
Arc::new(Dst2Butterfly9::default())
}
fn dst2_butterfly16() -> SpectralExecutor<Self> {
use crate::type2::Dst2Butterfly16;
Arc::new(Dst2Butterfly16::default())
}
}