use std::sync::Arc;
use super::types::Opt;
#[derive(Debug, Clone, PartialEq)]
pub struct KernelInfo {
pub name: String,
pub applied_opts: Vec<Opt>,
pub dont_use_locals: bool,
}
impl KernelInfo {
pub fn new(name: impl Into<String>, applied_opts: Vec<Opt>, dont_use_locals: bool) -> Arc<Self> {
Arc::new(Self { name: name.into(), applied_opts, dont_use_locals })
}
pub fn function_name(&self) -> String {
self.name
.chars()
.map(|c| if c.is_ascii_alphanumeric() || c == '_' { c.to_string() } else { format!("{:02X}", c as u32) })
.collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_function_name_ascii() {
let info = KernelInfo::new("test_kernel", vec![], false);
assert_eq!(info.function_name(), "test_kernel");
}
#[test]
fn test_function_name_with_underscores() {
let info = KernelInfo::new("r_g16l16R32u4", vec![], false);
assert_eq!(info.function_name(), "r_g16l16R32u4");
}
#[test]
fn test_function_name_unicode() {
let info = KernelInfo::new("r\x1b[34mg16\x1b[0m", vec![], false);
let func_name = info.function_name();
assert!(func_name.contains("1B")); assert!(func_name.contains("5B")); }
#[test]
fn test_function_name_special_chars() {
let info = KernelInfo::new("test-kernel+v2", vec![], false);
let func_name = info.function_name();
assert!(func_name.contains("2D")); assert!(func_name.contains("2B")); }
}