use crate::PxdctExecutor;
use crate::factory_dct2::Returning;
use std::sync::Arc;
pub(crate) trait Dst2Factory {
fn dst2_split_radix(
length: usize,
half_dct: Arc<dyn PxdctExecutor<Self> + Send + Sync>,
quarter_dct: Arc<dyn PxdctExecutor<Self> + Send + Sync>,
) -> Returning<Self>;
}
impl Dst2Factory for f32 {
fn dst2_split_radix(
length: usize,
half_dct: Arc<dyn PxdctExecutor<Self> + Send + Sync>,
quarter_dct: Arc<dyn PxdctExecutor<Self> + Send + Sync>,
) -> Returning<Self> {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if std::arch::is_x86_feature_detected!("avx2")
&& std::arch::is_x86_feature_detected!("fma")
&& 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::dct2::SplitRadixDst2;
Ok(Arc::new(SplitRadixDst2::new(
length,
half_dct,
quarter_dct,
)?))
}
}
impl Dst2Factory for f64 {
fn dst2_split_radix(
length: usize,
half_dct: Arc<dyn PxdctExecutor<Self> + Send + Sync>,
quarter_dct: Arc<dyn PxdctExecutor<Self> + Send + Sync>,
) -> Returning<Self> {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if std::arch::is_x86_feature_detected!("avx2")
&& std::arch::is_x86_feature_detected!("fma")
&& 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)?)
as Arc<dyn PxdctExecutor<f64> + Send + Sync>,
);
}
}
use crate::dct2::SplitRadixDst2;
Ok(Arc::new(SplitRadixDst2::new(
length,
half_dct,
quarter_dct,
)?))
}
}