agb_fixnum 0.22.6

Library for abstracting over fixed precision numbers. Designed for use with the agb library for the Game Boy Advance
Documentation
use std::{fs::File, io::BufWriter};

use quote::quote;

fn generate_lut_table<F>(f: F) -> [i16; 256]
where
    F: Fn(f64) -> f64,
{
    let mut table = [0; 256];

    for (i, v) in table.iter_mut().enumerate() {
        let conversion = (1 << 8) as f64;

        let x = (i as f64) / conversion;
        let c = f(x);
        let p = c * f64::from(1 << 11);

        *v = p as i16;
    }

    table
}

fn output_lut_table(file: &mut dyn std::io::Write, name: &str, values: &[i16]) {
    let ident = quote::format_ident!("{}", name);

    let s = quote! {
        pub static #ident: &[i16] = &[
            #(#values),*
        ];
    };

    writeln!(file, "{s}").expect("Should be able to write to file");
}

fn main() {
    let build_dir = std::env::var("OUT_DIR").expect("OUT_DIR must be specified");

    let mut file = BufWriter::new(
        File::create(format!("{build_dir}/lut.rs")).expect("Should be able to open file"),
    );

    output_lut_table(
        &mut file,
        "COS",
        &generate_lut_table(|x| (x * std::f64::consts::TAU).cos()),
    );
}