1use memmap2::MmapMut;
2use parking_lot::RwLockReadGuard;
3
4use super::Region;
5
6#[derive(Debug)]
7pub struct Reader<'a> {
8    mmap: RwLockReadGuard<'a, MmapMut>,
9    region: RwLockReadGuard<'static, Region>,
10}
11
12impl<'a> Reader<'a> {
13    pub fn new(
14        mmap: RwLockReadGuard<'a, MmapMut>,
15        region: RwLockReadGuard<'static, Region>,
16    ) -> Self {
17        Self { mmap, region }
18    }
19
20    pub fn read(&self, offset: u64, len: u64) -> &[u8] {
21        assert!(offset + len <= self.region.len());
22        let start = self.region.start() + offset;
23        let end = start + len;
24        &self.mmap[start as usize..end as usize]
25    }
26
27    pub fn read_all(&self) -> &[u8] {
28        self.read(0, self.region().len())
29    }
30
31    pub fn region(&self) -> &Region {
32        &self.region
33    }
34
35    pub fn prefixed(&self, offset: u64) -> &[u8] {
36        let start = self.region.start() + offset;
37        &self.mmap[start as usize..]
38    }
39}