use crate::PxdctExecutor;
use crate::factory_dct2::Returning;
use std::sync::{Arc, OnceLock};
pub(crate) trait ScaledDct2Factory {
fn scaled_split_radix(
length: usize,
half_dct: Arc<dyn PxdctExecutor<Self> + Send + Sync>,
quarter_dct: Arc<dyn PxdctExecutor<Self> + Send + Sync>,
) -> Returning<Self>;
fn scaled_dct2_butterfly2() -> Arc<dyn PxdctExecutor<Self> + Send + Sync>;
fn scaled_dct2_butterfly4() -> Arc<dyn PxdctExecutor<Self> + Send + Sync>;
fn scaled_dct2_butterfly8() -> Arc<dyn PxdctExecutor<Self> + Send + Sync>;
fn scaled_dct2_butterfly16() -> Arc<dyn PxdctExecutor<Self> + Send + Sync>;
fn scaled_dct2_butterfly32() -> Arc<dyn PxdctExecutor<Self> + Send + Sync>;
fn scaled_dct2_butterfly64() -> Arc<dyn PxdctExecutor<Self> + Send + Sync>;
fn scaled_dct2_butterfly128() -> Arc<dyn PxdctExecutor<Self> + Send + Sync>;
fn scaled_dct2_butterfly256() -> Arc<dyn PxdctExecutor<Self> + Send + Sync>;
fn scaled_dct2_butterfly512() -> Arc<dyn PxdctExecutor<Self> + Send + Sync>;
}
impl ScaledDct2Factory for f32 {
fn scaled_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 = "aarch64", feature = "neon"))]
{
use crate::neon::ScaledNeonSplitRadixDct2f;
Ok(Arc::new(ScaledNeonSplitRadixDct2f::new(
length,
half_dct,
quarter_dct,
)?) as Arc<dyn PxdctExecutor<f32> + Send + Sync>)
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::dct2::ScaledSplitRadixDct2;
Ok(
Arc::new(ScaledSplitRadixDct2::new(length, half_dct, quarter_dct)?)
as Arc<dyn PxdctExecutor<f32> + Send + Sync>,
)
}
}
fn scaled_dct2_butterfly2() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::power2_butterflies::Dct2Butterfly2;
Arc::new(Dct2Butterfly2::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly4() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly4;
Arc::new(ScaledDct2Butterfly4::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly8() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly8;
Arc::new(ScaledDct2Butterfly8::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly16() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly16;
Arc::new(ScaledDct2Butterfly16::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly32() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::ScaledNeonDct2Butterfly32f;
Arc::new(ScaledNeonDct2Butterfly32f::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::dct2::ScaledDct2Butterfly32;
Arc::new(ScaledDct2Butterfly32::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
})
.clone()
}
fn scaled_dct2_butterfly64() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::ScaledNeonDct2Butterfly64f;
Arc::new(ScaledNeonDct2Butterfly64f::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::dct2::ScaledDct2Butterfly64;
Arc::new(ScaledDct2Butterfly64::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
})
.clone()
}
fn scaled_dct2_butterfly128() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::ScaledNeonDct2Butterfly128f;
Arc::new(ScaledNeonDct2Butterfly128f::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::dct2::ScaledDct2Butterfly128;
Arc::new(ScaledDct2Butterfly128::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
})
.clone()
}
fn scaled_dct2_butterfly256() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::ScaledNeonDct2Butterfly256f;
Arc::new(ScaledNeonDct2Butterfly256f::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::dct2::ScaledDct2Butterfly256;
Arc::new(ScaledDct2Butterfly256::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
})
.clone()
}
fn scaled_dct2_butterfly512() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::ScaledNeonDct2Butterfly512f;
Arc::new(ScaledNeonDct2Butterfly512f::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::dct2::ScaledDct2Butterfly512;
Arc::new(ScaledDct2Butterfly512::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>
}
})
.clone()
}
}
impl ScaledDct2Factory for f64 {
fn scaled_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 = "aarch64", feature = "neon"))]
{
use crate::neon::ScaledNeonSplitRadixDct2d;
Ok(Arc::new(ScaledNeonSplitRadixDct2d::new(
length,
half_dct,
quarter_dct,
)?) as Arc<dyn PxdctExecutor<f64> + Send + Sync>)
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::dct2::ScaledSplitRadixDct2;
Ok(
Arc::new(ScaledSplitRadixDct2::new(length, half_dct, quarter_dct)?)
as Arc<dyn PxdctExecutor<f64> + Send + Sync>,
)
}
}
fn scaled_dct2_butterfly2() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::power2_butterflies::Dct2Butterfly2;
Arc::new(Dct2Butterfly2::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly4() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly4;
Arc::new(ScaledDct2Butterfly4::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly8() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly8;
Arc::new(ScaledDct2Butterfly8::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly16() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly16;
Arc::new(ScaledDct2Butterfly16::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly32() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly32;
Arc::new(ScaledDct2Butterfly32::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly64() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly64;
Arc::new(ScaledDct2Butterfly64::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly128() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly128;
Arc::new(ScaledDct2Butterfly128::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly256() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly256;
Arc::new(ScaledDct2Butterfly256::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn scaled_dct2_butterfly512() -> Arc<dyn PxdctExecutor<Self> + Send + Sync> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
use crate::dct2::ScaledDct2Butterfly512;
Arc::new(ScaledDct2Butterfly512::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
}