1use std::cell::{Cell};
2use super::*;
3
4impl<'a> MemoryRead for &'a [u8] {
5 fn try_read_bytes_into(&self, address: u64, buffer: &mut [u8]) -> Option<()> {
6 if address as usize + buffer.len() > self.len() {
7 return None;
8 }
9
10 buffer.copy_from_slice(&self[address as usize..address as usize + buffer.len()]);
11
12 Some(())
13 }
14}
15
16impl<T: AsRef<[u8]>> MemoryRead for Cell<T> {
17 fn try_read_bytes_into(&self, address: u64, buffer: &mut [u8]) -> Option<()> {
18 let self_buf = unsafe { self.as_ptr().as_ref() }.unwrap();
19 if address as usize + buffer.len() > self_buf.as_ref().len() {
20 return None;
21 }
22
23 buffer.copy_from_slice(&self_buf.as_ref()[address as usize..address as usize + buffer.len()]);
24
25 Some(())
26 }
27}
28
29impl<T: AsMut<[u8]>> MemoryWrite for Cell<T> {
30 fn try_write_bytes(&self, address: u64, buffer: &[u8]) -> Option<()> {
31 let self_buf = unsafe { self.as_ptr().as_mut() }.unwrap();
32 if address as usize + buffer.len() > self_buf.as_mut().len() {
33 return None;
34 }
35
36 self_buf.as_mut()[address as usize..address as usize + buffer.len()].copy_from_slice(buffer);
37
38 Some(())
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45 use crate::*;
46
47 fn use_read(read: impl MemoryRead) {}
48 fn use_write(write: impl MemoryWrite) {}
49 fn use_readwrite(readwrite: impl MemoryRead + MemoryWrite) {}
50
51 #[test]
52 fn test_slice_read() {
53 let mut buffer = [0u8; 10];
54 let slice = &buffer[..];
55 use_read(slice);
56 }
57
58 #[test]
59 fn test_cell_read() {
60 let mut buffer = [0u8; 10];
61 let cell = Cell::new(buffer);
62 use_read(cell);
63 }
64
65 #[test]
66 fn test_cell_write() {
67 let mut buffer = [0u8; 10];
68 let cell = Cell::new(buffer);
69 use_write(cell);
70 }
71
72 #[test]
73 fn test_cell_readwrite() {
74 let mut buffer = [0u8; 10];
75 let cell = Cell::new(buffer);
76 use_readwrite(cell);
77 }
78
79 static mut TEST_BUF: [u8; 10] = [0u8; 10];
80 fn get_test_buf() -> &'static mut [u8] {
81 unsafe {
82 &mut TEST_BUF
83 }
84 }
85
86 #[test]
87 fn test_static_cell_read() {
88 let cell = Cell::new(get_test_buf());
89 use_read(cell);
90 }
91
92 #[test]
93 fn test_static_cell_write() {
94 let cell = Cell::new(get_test_buf());
95 use_write(cell);
96 }
97
98 #[test]
99 fn test_static_cell_readwrite() {
100 let cell = Cell::new(get_test_buf());
101 use_readwrite(cell);
102 }
103}