rawdb/
reader.rs

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}