1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use std::fs;
use std::io;
use std::path::Path;
use std::sync::Arc;
use memmap::{Mmap, Protection};
pub struct MmapReadOnly {
map: Arc<Mmap>,
offset: usize,
len: usize,
}
impl MmapReadOnly {
pub fn open(file: &fs::File) -> io::Result<MmapReadOnly> {
Ok(try!(Mmap::open(file, Protection::Read)).into())
}
pub fn open_path<P: AsRef<Path>>(path: P) -> io::Result<MmapReadOnly> {
MmapReadOnly::open(&try!(fs::File::open(path)))
}
pub fn len(&self,) -> usize {
self.len
}
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,
}
}
pub unsafe fn as_slice(&self) -> &[u8] {
&self.map.as_slice()[self.offset..self.offset + self.len]
}
}
impl Clone for MmapReadOnly {
fn clone(&self) -> MmapReadOnly {
MmapReadOnly{
map: self.map.clone(),
offset: self.offset,
len: self.len,
}
}
}
impl From<Mmap> for MmapReadOnly {
fn from(mmap: Mmap) -> MmapReadOnly {
let len = mmap.len();
MmapReadOnly {
map: Arc::new(mmap),
offset: 0,
len: len,
}
}
}