use super::Thunkable;
use generic_array::{ArrayLength, GenericArray};
pub struct FixedThunk<N: ArrayLength<u8>>(Box<dyn Fn(usize) -> GenericArray<u8, N>>);
impl<N: ArrayLength<u8>> FixedThunk<N> {
pub fn new<T: Fn(usize) -> GenericArray<u8, N> + 'static>(callback: T) -> Self {
FixedThunk(Box::new(callback))
}
}
impl<N: ArrayLength<u8>> Thunkable for FixedThunk<N> {
fn generate(&self, address: usize) -> Vec<u8> {
self.0(address).to_vec()
}
fn len(&self) -> usize {
N::to_usize()
}
}
pub struct UnsafeThunk {
callback: Box<dyn Fn(usize) -> Vec<u8>>,
size: usize,
}
impl UnsafeThunk {
pub unsafe fn new<T: Fn(usize) -> Vec<u8> + 'static>(callback: T, size: usize) -> Self {
UnsafeThunk {
callback: Box::new(callback),
size,
}
}
}
impl Thunkable for UnsafeThunk {
fn generate(&self, address: usize) -> Vec<u8> {
(self.callback)(address)
}
fn len(&self) -> usize {
self.size
}
}