1
use crate::{ Result };
2

            
3
#[derive(Debug)]
4
pub struct Memory {
5
    buf:	Vec<u8>,
6
    pos:	usize,
7
}
8

            
9
impl Memory {
10
2
    pub fn new(data: &[u8]) -> Self {
11
2
	Self {
12
2
	    buf:	Vec::from(data),
13
2
	    pos:	0,
14
2
	}
15
2
    }
16

            
17
    pub fn open(&mut self) -> Result<()> {
18
	Ok(())
19
    }
20

            
21
    pub fn get_size(&self) -> Option<u64> {
22
	Some(self.buf.len() as u64)
23
    }
24

            
25
    pub async fn read(&mut self, buf: &mut [u8]) -> crate::Result<usize>
26
    {
27
	let sz = buf.len().min(self.buf.len() - self.pos);
28

            
29
	buf[0..sz].clone_from_slice(&self.buf[self.pos..self.pos + sz]);
30

            
31
	self.pos += sz;
32

            
33
	Ok(sz)
34
    }
35

            
36
10
    pub fn read_mmap(&mut self, sz: usize) -> crate::Result<&[u8]>
37
10
    {
38
10
	let sz = sz.min(self.buf.len() - self.pos);
39
10
	let pos = self.pos;
40
10

            
41
10
	self.pos += sz;
42
10

            
43
10
	trace!("pos={}, sz={}", pos, sz);
44

            
45
10
	Ok(&self.buf[pos..pos + sz])
46
10
    }
47

            
48
11
    pub fn is_eof(&self) -> bool
49
11
    {
50
11
	self.pos == self.buf.len()
51
11
    }
52
}