use crate::explore::fingerprint::Fnv1a64;
#[derive(Clone, Copy)]
pub struct SharedModule {
pub import_path: &'static str,
pub source: &'static str,
}
impl std::fmt::Debug for SharedModule {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SharedModule")
.field("import_path", &self.import_path)
.field("source_len", &self.source.len())
.finish_non_exhaustive()
}
}
pub const SHARED_WGSL_MODULES: &[SharedModule] = &[
SharedModule {
import_path: "henad::dispatch",
source: include_str!("dispatch.wgsl"),
},
SharedModule {
import_path: "henad::dims",
source: include_str!("dims.wgsl"),
},
SharedModule {
import_path: "henad::rng",
source: include_str!("rng.wgsl"),
},
SharedModule {
import_path: "henad::space",
source: include_str!("space.wgsl"),
},
SharedModule {
import_path: "henad::reduce_tree",
source: include_str!("reduce_tree.wgsl"),
},
];
pub const SHARED_WGSL_FNV1A64: u64 = {
let mut hasher = Fnv1a64::new();
let mut index = 0;
while index < SHARED_WGSL_MODULES.len() {
hasher.write_str(SHARED_WGSL_MODULES[index].import_path);
hasher.write_str(SHARED_WGSL_MODULES[index].source);
index += 1;
}
hasher.finish()
};
#[cfg(test)]
mod tests {
use super::{SHARED_WGSL_FNV1A64, SHARED_WGSL_MODULES};
use crate::explore::fingerprint::Fnv1a64;
#[test]
fn each_module_declares_its_import_path() {
for module in SHARED_WGSL_MODULES {
let first = module.source.lines().next().unwrap_or_default();
assert_eq!(first, format!("#define_import_path {}", module.import_path));
}
}
#[test]
fn the_const_hash_matches_one_computed_at_run_time() {
let mut hasher = Fnv1a64::new();
for module in SHARED_WGSL_MODULES {
hasher.write_str(module.import_path);
hasher.write_str(module.source);
}
assert_eq!(SHARED_WGSL_FNV1A64, hasher.finish());
}
}