discrete_transforms 0.1.3

Library for Discrete Transforms
Documentation
pub enum TransformDirection {
    Forward,
    Inverse
}

#[macro_export]
macro_rules! discrete_transform {
    ($transform: ident, $input: ident, $direction: ident) => {
        {
            let mut transform = $transform::new();
            let mut output = Vec::new();
            let mut output_temp = Vec::new();
            let mut input = Vec::new();

            for chunks in &$input.iter().chunks(8) {
                {
                    transform.set_input(chunks.map(|x| *x).collect_vec());
                }

                match $direction {
                    TransformDirection::Forward => { input = transform.forward() },
                    TransformDirection::Inverse => { input = transform.inverse() }
                };

                output.extend(input.iter().cloned());
            }

            input.clear();

            for x in 0..8 {
                for y in 0..8 {
                    input.push(output[x + 8 * y]);
                }
                {
                    transform.set_input(input.clone());
                }

                match $direction {
                    TransformDirection::Forward => { output_temp.extend(transform.forward()) },
                    TransformDirection::Inverse => { output_temp.extend(transform.inverse()) }
                };

                input.clear();
            }

            for x in 0..8 {
                for y in 0..8 {
                    output[x + 8 * y] = output_temp[x * 8 + y];
                }
            }

            output
        }
    };
}