use crate::util::{DctSample, validate_oof_sizes};
use crate::{PxdctError, PxdctExecutor};
use num_traits::AsPrimitive;
#[derive(Debug, Clone)]
pub(crate) struct Dct3Identity<T: DctSample> {
_phantom: std::marker::PhantomData<T>,
}
impl<T: DctSample> Default for Dct3Identity<T> {
fn default() -> Self {
Dct3Identity {
_phantom: std::marker::PhantomData,
}
}
}
impl<T: DctSample> PxdctExecutor<T> for Dct3Identity<T>
where
f64: AsPrimitive<T>,
{
fn execute(&self, in_place: &mut [T]) -> Result<(), PxdctError> {
for x in in_place.iter_mut() {
*x *= T::HALF;
}
Ok(())
}
fn execute_with_scratch(&self, data: &mut [T], _: &mut [T]) -> Result<(), PxdctError> {
for x in data.iter_mut() {
*x *= T::HALF;
}
Ok(())
}
fn execute_into(&self, input: &[T], output: &mut [T]) -> Result<(), PxdctError> {
self.execute_into_with_scratch(input, output, &mut [])
}
fn execute_into_with_scratch(
&self,
input: &[T],
output: &mut [T],
_: &mut [T],
) -> Result<(), PxdctError> {
validate_oof_sizes!(input, output, 1);
for (dst, &src) in output.iter_mut().zip(input.iter()) {
*dst = src * T::HALF;
}
Ok(())
}
fn length(&self) -> usize {
1
}
fn scratch_size(&self) -> usize {
0
}
}