use crate::cdef::{
auxlib::Reg,
CFunction,
};
use core::{
ffi::CStr,
marker::PhantomData,
mem::{
transmute, MaybeUninit
},
ptr::null,
slice::from_raw_parts,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[repr(C)]
pub struct Library<'name, const N: usize> {
pub regs: [Reg; N],
terminator: Reg,
_life: PhantomData<&'name CStr>
}
impl<'name, const N: usize> Library<'name, N> {
pub const fn new(
items: [(&'name CStr, Option<CFunction>); N]
) -> Self {
#[allow(clippy::uninit_assumed_init)]
let regs: [Reg; N] = unsafe {
let mut dest: [Reg; N] = MaybeUninit::uninit().assume_init();
let mut i = 0;
while i < N {
dest[i] = Reg {
name: items[i].0.as_ptr(),
func: items[i].1
};
i += 1;
}
dest
};
Self {
regs,
terminator: Reg {
name: null(),
func: None
},
_life: PhantomData
}
}
pub const fn n_regs() -> usize {
N
}
pub const fn n_regs_1() -> usize {
N + 1
}
pub const fn len(&self) -> usize {
Self::n_regs()
}
pub const fn is_empty(&self) -> bool {
Self::n_regs() == 0
}
pub const fn as_ptr(&self) -> *const Reg {
unsafe { transmute(self as *const _) }
}
pub const fn as_reg_slice(&self) -> &[Reg] {
unsafe { from_raw_parts(self as *const _ as *const Reg, N + 1) }
}
}