use std::fs;
const MMAP_THRESHOLD: u64 = 64 * 1024;
pub(crate) enum SrcBuf {
Heap(Vec<u8>),
Mapped(memmap2::Mmap),
}
impl std::ops::Deref for SrcBuf {
type Target = [u8];
fn deref(&self) -> &[u8] {
match self {
SrcBuf::Heap(b) => b,
SrcBuf::Mapped(m) => m,
}
}
}
pub(crate) fn load_src(path: &std::path::Path) -> std::io::Result<SrcBuf> {
let file = fs::File::open(path)?;
let len = file.metadata()?.len();
if len >= MMAP_THRESHOLD {
let map = unsafe { memmap2::Mmap::map(&file)? };
return Ok(SrcBuf::Mapped(map));
}
let mut buf = Vec::with_capacity(len as usize);
{
use std::io::Read;
(&file).read_to_end(&mut buf)?;
}
Ok(SrcBuf::Heap(buf))
}