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}