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}