use std::fs;
use std::io;
use std::path::Path;
use std::sync::Arc;
use memmap::Mmap;
pub struct MmapReadOnly {
map: Arc<Mmap>,
offset: usize,
len: usize,
}
impl MmapReadOnly {
#[inline]
pub unsafe fn open(file: &fs::File) -> io::Result<MmapReadOnly> {
let mmap = Mmap::map(file)?;
let len = mmap.len();
Ok(MmapReadOnly {
map: Arc::new(mmap),
offset: 0,
len: len,
})
}
pub unsafe fn open_path<P: AsRef<Path>>(
path: P,
) -> io::Result<MmapReadOnly> {
MmapReadOnly::open(&fs::File::open(path)?)
}
#[inline]
pub fn len(&self) -> usize {
self.len
}
#[inline]
pub fn range(&self, offset: usize, len: usize) -> MmapReadOnly {
assert!(offset + len <= self.len);
MmapReadOnly {
map: self.map.clone(),
offset: self.offset + offset,
len: len,
}
}
#[inline]
pub fn as_slice(&self) -> &[u8] {
&self.map[self.offset..self.offset + self.len]
}
}
impl Clone for MmapReadOnly {
#[inline]
fn clone(&self) -> MmapReadOnly {
MmapReadOnly{
map: self.map.clone(),
offset: self.offset,
len: self.len,
}
}
}