use crate::factory_dct2::Returning;
use crate::type3::{
Dct3Butterfly2, Dct3Butterfly3, Dct3Butterfly4, Dct3Butterfly5, Dct3Butterfly6, Dct3Butterfly7,
Dct3Butterfly8, Dct3Butterfly9, Dct3Butterfly10, Dct3Butterfly11, Dct3Butterfly12,
Dct3Butterfly13, Dct3Butterfly14, Dct3Butterfly15, Dct3Butterfly16, Dct3Butterfly18,
Dct3Butterfly20, Dct3Butterfly21, Dct3Butterfly24, Dct3Butterfly26, Dct3Butterfly28,
Dct3Butterfly30, Dct3Butterfly32, Dct3Butterfly35, Dct3Butterfly36, Dct3Butterfly64, Dct3Fft,
Dct3Identity,
};
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
use crate::util::has_valid_avx;
use crate::{PxdctExecutor, SpectralExecutor};
use std::sync::{Arc, OnceLock};
pub(crate) trait Dct3Factory {
fn dct3_split_radix(
length: usize,
half_dct: SpectralExecutor<Self>,
quarter_dct: SpectralExecutor<Self>,
) -> Returning<Self>;
fn dct3_fft(length: usize) -> Returning<Self>;
fn dct3_mixed_radix3(inner_dct3: SpectralExecutor<Self>) -> Returning<Self>;
fn dct3_mixed_radix5(inner_dct5: SpectralExecutor<Self>) -> Returning<Self>;
fn dct3_mixed_radix7(inner_dct7: SpectralExecutor<Self>) -> Returning<Self>;
fn dct3_mixed_radix9(inner_dct9: SpectralExecutor<Self>) -> Returning<Self>;
fn dct3_relatively_prime(
width_dct: SpectralExecutor<Self>,
height_dct: SpectralExecutor<Self>,
) -> Returning<Self>;
fn dct3_identity() -> SpectralExecutor<Self>;
fn dct3_butterfly2() -> SpectralExecutor<Self>;
fn dct3_butterfly3() -> SpectralExecutor<Self>;
fn dct3_butterfly4() -> SpectralExecutor<Self>;
fn dct3_butterfly5() -> SpectralExecutor<Self>;
fn dct3_butterfly6() -> SpectralExecutor<Self>;
fn dct3_butterfly7() -> SpectralExecutor<Self>;
fn dct3_butterfly8() -> SpectralExecutor<Self>;
fn dct3_butterfly9() -> SpectralExecutor<Self>;
fn dct3_butterfly10() -> SpectralExecutor<Self>;
fn dct3_butterfly11() -> SpectralExecutor<Self>;
fn dct3_butterfly12() -> SpectralExecutor<Self>;
fn dct3_butterfly13() -> SpectralExecutor<Self>;
fn dct3_butterfly14() -> SpectralExecutor<Self>;
fn dct3_butterfly15() -> SpectralExecutor<Self>;
fn dct3_butterfly16() -> SpectralExecutor<Self>;
fn dct3_butterfly18() -> SpectralExecutor<Self>;
fn dct3_butterfly20() -> SpectralExecutor<Self>;
fn dct3_butterfly21() -> SpectralExecutor<Self>;
fn dct3_butterfly24() -> SpectralExecutor<Self>;
fn dct3_butterfly26() -> SpectralExecutor<Self>;
fn dct3_butterfly28() -> SpectralExecutor<Self>;
fn dct3_butterfly30() -> SpectralExecutor<Self>;
fn dct3_butterfly32() -> SpectralExecutor<Self>;
fn dct3_butterfly35() -> SpectralExecutor<Self>;
fn dct3_butterfly36() -> SpectralExecutor<Self>;
fn dct3_butterfly64() -> SpectralExecutor<Self>;
}
impl Dct3Factory for f32 {
fn dct3_split_radix(
length: usize,
half_dct: SpectralExecutor<Self>,
quarter_dct: SpectralExecutor<Self>,
) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonSplitRadixDct3f;
Ok(Arc::new(NeonSplitRadixDct3f::new(
length,
half_dct,
quarter_dct,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxSplitRadixDct3f;
return Ok(Arc::new(AvxSplitRadixDct3f::new(
length,
half_dct,
quarter_dct,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::SplitRadixDct3;
Ok(Arc::new(SplitRadixDct3::new(
length,
half_dct,
quarter_dct,
)?))
}
}
fn dct3_fft(length: usize) -> Returning<Self> {
Ok(Arc::new(Dct3Fft::new(length)?))
}
fn dct3_mixed_radix3(inner_dct3: SpectralExecutor<Self>) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonDct3MixedRadix3f;
Ok(Arc::new(NeonDct3MixedRadix3f::new(
inner_dct3.length() * 3,
inner_dct3,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3MixedRadix3f;
return Ok(Arc::new(AvxDct3MixedRadix3f::new(
inner_dct3.length() * 3,
inner_dct3,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::Dct3MixedRadix3;
Ok(Arc::new(Dct3MixedRadix3::new(
inner_dct3.length() * 3,
inner_dct3,
)?))
}
}
fn dct3_mixed_radix5(inner_dct5: SpectralExecutor<Self>) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonDct3MixedRadix5f;
Ok(Arc::new(NeonDct3MixedRadix5f::new(
inner_dct5.length() * 5,
inner_dct5,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3MixedRadix5f;
return Ok(Arc::new(AvxDct3MixedRadix5f::new(
inner_dct5.length() * 5,
inner_dct5,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::Dct3MixedRadix5;
Ok(Arc::new(Dct3MixedRadix5::new(
inner_dct5.length() * 5,
inner_dct5,
)?))
}
}
fn dct3_mixed_radix7(inner_dct7: SpectralExecutor<Self>) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonDct3MixedRadix7f;
Ok(Arc::new(NeonDct3MixedRadix7f::new(
inner_dct7.length() * 7,
inner_dct7,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3MixedRadix7f;
return Ok(Arc::new(AvxDct3MixedRadix7f::new(
inner_dct7.length() * 7,
inner_dct7,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::Dct3MixedRadix7;
Ok(Arc::new(Dct3MixedRadix7::new(
inner_dct7.length() * 7,
inner_dct7,
)?))
}
}
fn dct3_mixed_radix9(inner_dct9: SpectralExecutor<Self>) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonDct3MixedRadix9f;
Ok(Arc::new(NeonDct3MixedRadix9f::new(
inner_dct9.length() * 9,
inner_dct9,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3MixedRadix9f;
return Ok(Arc::new(AvxDct3MixedRadix9f::new(
inner_dct9.length() * 9,
inner_dct9,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::Dct3MixedRadix9;
Ok(Arc::new(Dct3MixedRadix9::new(
inner_dct9.length() * 9,
inner_dct9,
)?))
}
}
fn dct3_relatively_prime(
width_dct: SpectralExecutor<Self>,
height_dct: SpectralExecutor<Self>,
) -> Returning<Self> {
use crate::type3::Dct3Coprime;
Ok(Arc::new(Dct3Coprime::new(width_dct, height_dct)?))
}
fn dct3_identity() -> SpectralExecutor<Self> {
Arc::new(Dct3Identity::default())
}
fn dct3_butterfly2() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly2::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly3() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly3::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly4() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly4::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly5() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly5::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly6() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly6::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly7() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly7::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly8() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly8::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly9() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly9::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly10() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly10::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly11() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly11::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly12() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly12::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly13() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly13::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly14() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly14::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly15() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly15::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly16() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3Butterfly16;
return Arc::new(AvxDct3Butterfly16::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>;
}
Arc::new(Dct3Butterfly16::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly18() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly18::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly20() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly20::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly21() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly21::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly24() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly24::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly26() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly26::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly28() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly28::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly30() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly30::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly32() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3Butterfly32;
return Arc::new(AvxDct3Butterfly32::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>;
}
Arc::new(Dct3Butterfly32::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly35() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly35::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly36() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly36::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
fn dct3_butterfly64() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f32> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3Butterfly64;
return Arc::new(AvxDct3Butterfly64::default())
as Arc<dyn PxdctExecutor<f32> + Send + Sync>;
}
Arc::new(Dct3Butterfly64::default()) as Arc<dyn PxdctExecutor<f32> + Send + Sync>
})
.clone()
}
}
impl Dct3Factory for f64 {
fn dct3_split_radix(
length: usize,
half_dct: SpectralExecutor<Self>,
quarter_dct: SpectralExecutor<Self>,
) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonSplitRadixDct3d;
Ok(Arc::new(NeonSplitRadixDct3d::new(
length,
half_dct,
quarter_dct,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxSplitRadixDct3d;
return Ok(Arc::new(AvxSplitRadixDct3d::new(
length,
half_dct,
quarter_dct,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::SplitRadixDct3;
Ok(Arc::new(SplitRadixDct3::new(
length,
half_dct,
quarter_dct,
)?))
}
}
fn dct3_fft(length: usize) -> Returning<Self> {
Ok(Arc::new(Dct3Fft::new(length)?))
}
fn dct3_mixed_radix3(inner_dct3: SpectralExecutor<Self>) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonDct3MixedRadix3d;
Ok(Arc::new(NeonDct3MixedRadix3d::new(
inner_dct3.length() * 3,
inner_dct3,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3MixedRadix3d;
return Ok(Arc::new(AvxDct3MixedRadix3d::new(
inner_dct3.length() * 3,
inner_dct3,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::Dct3MixedRadix3;
Ok(Arc::new(Dct3MixedRadix3::new(
inner_dct3.length() * 3,
inner_dct3,
)?))
}
}
fn dct3_mixed_radix5(inner_dct5: SpectralExecutor<Self>) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonDct3MixedRadix5d;
Ok(Arc::new(NeonDct3MixedRadix5d::new(
inner_dct5.length() * 5,
inner_dct5,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3MixedRadix5d;
return Ok(Arc::new(AvxDct3MixedRadix5d::new(
inner_dct5.length() * 5,
inner_dct5,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::Dct3MixedRadix5;
Ok(Arc::new(Dct3MixedRadix5::new(
inner_dct5.length() * 5,
inner_dct5,
)?))
}
}
fn dct3_mixed_radix7(inner_dct7: SpectralExecutor<Self>) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonDct3MixedRadix7d;
Ok(Arc::new(NeonDct3MixedRadix7d::new(
inner_dct7.length() * 7,
inner_dct7,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3MixedRadix7d;
return Ok(Arc::new(AvxDct3MixedRadix7d::new(
inner_dct7.length() * 7,
inner_dct7,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::Dct3MixedRadix7;
Ok(Arc::new(Dct3MixedRadix7::new(
inner_dct7.length() * 7,
inner_dct7,
)?))
}
}
fn dct3_mixed_radix9(inner_dct9: SpectralExecutor<Self>) -> Returning<Self> {
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
use crate::neon::NeonDct3MixedRadix9d;
Ok(Arc::new(NeonDct3MixedRadix9d::new(
inner_dct9.length() * 9,
inner_dct9,
)?))
}
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3MixedRadix9d;
return Ok(Arc::new(AvxDct3MixedRadix9d::new(
inner_dct9.length() * 9,
inner_dct9,
)?));
}
#[cfg(not(all(target_arch = "aarch64", feature = "neon")))]
{
use crate::type3::Dct3MixedRadix9;
Ok(Arc::new(Dct3MixedRadix9::new(
inner_dct9.length() * 9,
inner_dct9,
)?))
}
}
fn dct3_relatively_prime(
width_dct: SpectralExecutor<Self>,
height_dct: SpectralExecutor<Self>,
) -> Returning<Self> {
use crate::type3::Dct3Coprime;
Ok(Arc::new(Dct3Coprime::new(width_dct, height_dct)?))
}
fn dct3_identity() -> SpectralExecutor<Self> {
Arc::new(Dct3Identity::default())
}
fn dct3_butterfly2() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly2::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly3() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly3::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly4() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly4::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly5() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly5::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly6() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly6::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly7() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly7::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly8() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly8::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly9() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly9::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly10() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly10::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly11() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly11::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly12() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly12::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly13() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly13::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly14() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly14::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly15() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly15::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly16() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3Butterfly16;
return Arc::new(AvxDct3Butterfly16::default())
as Arc<dyn PxdctExecutor<f64> + Send + Sync>;
}
Arc::new(Dct3Butterfly16::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly18() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly18::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly20() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly20::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly21() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly21::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly24() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly24::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly26() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly26::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly28() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly28::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly30() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly30::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly32() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3Butterfly32;
return Arc::new(AvxDct3Butterfly32::default())
as Arc<dyn PxdctExecutor<f64> + Send + Sync>;
}
Arc::new(Dct3Butterfly32::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly35() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly35::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly36() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
Arc::new(Dct3Butterfly36::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
fn dct3_butterfly64() -> SpectralExecutor<Self> {
static Q: OnceLock<Arc<dyn PxdctExecutor<f64> + Send + Sync>> = OnceLock::new();
Q.get_or_init(|| {
#[cfg(all(target_arch = "x86_64", feature = "avx"))]
if has_valid_avx() {
use crate::avx::AvxDct3Butterfly64;
return Arc::new(AvxDct3Butterfly64::default())
as Arc<dyn PxdctExecutor<f64> + Send + Sync>;
}
Arc::new(Dct3Butterfly64::default()) as Arc<dyn PxdctExecutor<f64> + Send + Sync>
})
.clone()
}
}