memlib/
slice_impl.rs

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}