1use super::Thunkable;
2use generic_array::{ArrayLength, GenericArray};
3
4pub struct FixedThunk<N: ArrayLength<u8>>(Box<dyn Fn(usize) -> GenericArray<u8, N>>);
6
7impl<N: ArrayLength<u8>> FixedThunk<N> {
8  pub fn new<T: Fn(usize) -> GenericArray<u8, N> + 'static>(callback: T) -> Self {
10    FixedThunk(Box::new(callback))
11  }
12}
13
14impl<N: ArrayLength<u8>> Thunkable for FixedThunk<N> {
16  fn generate(&self, address: usize) -> Vec<u8> {
17    self.0(address).to_vec()
18  }
19
20  fn len(&self) -> usize {
21    N::to_usize()
22  }
23}
24
25pub struct UnsafeThunk {
27  callback: Box<dyn Fn(usize) -> Vec<u8>>,
28  size: usize,
29}
30
31impl UnsafeThunk {
35  pub unsafe fn new<T: Fn(usize) -> Vec<u8> + 'static>(callback: T, size: usize) -> Self {
37    UnsafeThunk {
38      callback: Box::new(callback),
39      size,
40    }
41  }
42}
43
44impl Thunkable for UnsafeThunk {
45  fn generate(&self, address: usize) -> Vec<u8> {
47    (self.callback)(address)
48  }
49
50  fn len(&self) -> usize {
52    self.size
53  }
54}