//! Architecture specific code

macro_rules! arch_cond {
    ($($arch:ident: $str:literal),* $(,)?) => {$(
        #[cfg(target_arch = $str)]
        pub mod $arch;
        #[cfg(target_arch = $str)]
        pub use self::$arch::*;
    )*};
}

arch_cond!(
    aarch64: "aarch64",
    riscv64: "riscv64",
    x86_64: "x86_64",
);

#[cfg(target_arch = "x86_64")]
use {crate::arch::interrupts::Interrupt, alloc::string::String};
#[cfg(target_arch = "x86_64")]
pub struct InterruptList {
    list: HashMap<Interrupt, String>,
}
#[cfg(target_arch = "x86_64")]
use hashbrown::HashMap;
#[cfg(target_arch = "x86_64")]
impl InterruptList {
    pub fn new() -> Self {
        Self {
            list: HashMap::new(),
        }
    }
}
#[cfg(target_arch = "x86_64")]
use spin::{Lazy, Mutex};
#[cfg(target_arch = "x86_64")]
pub static INTERRUPT_LIST: Lazy<Mutex<InterruptList>> = Lazy::new(|| {
    let mut il = InterruptList::new();
    use crate::alloc::string::ToString;
    il.list.insert(Interrupt::Timer, "PS/2 Mouse".to_string());
    Mutex::new(il)
});