use super::{borrowed::BorrowedBytesBlockIterator, error::InputError, in_slice, Input, LastBlock};
use crate::{query::JsonString, result::InputRecorder};
use memmap2::{Mmap, MmapAsRawDesc};
pub struct MmapInput {
mmap: Mmap,
last_block: LastBlock,
}
impl MmapInput {
#[inline]
pub unsafe fn map_file<D: MmapAsRawDesc>(file_desc: D) -> Result<Self, InputError> {
match Mmap::map(file_desc) {
Ok(mmap) => {
let last_block = in_slice::pad_last_block(&mmap);
Ok(Self { mmap, last_block })
}
Err(err) => Err(err.into()),
}
}
}
impl Input for MmapInput {
type BlockIterator<'a, 'r, const N: usize, R> = BorrowedBytesBlockIterator<'a, 'r, N, R>
where
R: InputRecorder<&'a [u8]> + 'r;
type Block<'a, const N: usize> = &'a [u8];
#[inline(always)]
fn iter_blocks<'a, 'r, R, const N: usize>(&'a self, recorder: &'r R) -> Self::BlockIterator<'a, 'r, N, R>
where
R: InputRecorder<&'a [u8]>,
{
BorrowedBytesBlockIterator::new(&self.mmap, &self.last_block, recorder)
}
#[inline]
fn seek_backward(&self, from: usize, needle: u8) -> Option<usize> {
in_slice::seek_backward(&self.mmap, from, needle)
}
#[inline]
fn seek_forward<const N: usize>(&self, from: usize, needles: [u8; N]) -> Result<Option<(usize, u8)>, InputError> {
Ok(in_slice::seek_forward(&self.mmap, from, needles))
}
#[inline]
fn seek_non_whitespace_forward(&self, from: usize) -> Result<Option<(usize, u8)>, InputError> {
Ok(in_slice::seek_non_whitespace_forward(&self.mmap, from))
}
#[inline]
fn seek_non_whitespace_backward(&self, from: usize) -> Option<(usize, u8)> {
in_slice::seek_non_whitespace_backward(&self.mmap, from)
}
#[inline]
fn is_member_match(&self, from: usize, to: usize, label: &JsonString) -> bool {
in_slice::is_member_match(&self.mmap, from, to, label)
}
}