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