parent
300fcfd4d8
commit
13980b8cd2
@ -0,0 +1,61 @@
|
||||
use std::ops::RangeBounds;
|
||||
use std::slice::SliceIndex;
|
||||
use std::{fs,io};
|
||||
use std::path::Path;
|
||||
|
||||
use memmap::MmapMut;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct MemoryMapMut
|
||||
{
|
||||
file: fs::File,
|
||||
map: MmapMut,
|
||||
}
|
||||
|
||||
impl AsRef<[u8]> for MemoryMapMut
|
||||
{
|
||||
fn as_ref(&self) -> &[u8]
|
||||
{
|
||||
&self.map[..]
|
||||
}
|
||||
}
|
||||
|
||||
impl AsMut<[u8]> for MemoryMapMut
|
||||
{
|
||||
fn as_mut(&mut self) -> &mut [u8]
|
||||
{
|
||||
&mut self.map[..]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl MemoryMapMut
|
||||
{
|
||||
#[inline] pub fn as_slice_mut(&mut self) -> &mut [u8]
|
||||
{
|
||||
self.as_mut()
|
||||
}
|
||||
#[inline] pub fn as_slice(&self) -> &[u8]
|
||||
{
|
||||
self.as_ref()
|
||||
}
|
||||
pub fn open(from: impl AsRef<Path>) -> io::Result<Self>
|
||||
{
|
||||
let file = fs::OpenOptions::new()
|
||||
.create(true)
|
||||
.truncate(true)
|
||||
.write(true)
|
||||
.open(from)?;
|
||||
|
||||
Ok(Self{
|
||||
map: unsafe{ MmapMut::map_mut(&file)? },
|
||||
file,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[inline] pub unsafe fn slice_mut<'a, 'b, T, R: RangeBounds<usize> + SliceIndex<[T], Output=[T]>>(what: &'a mut [T], range: R)-> &'b mut [T]
|
||||
where 'a: 'b
|
||||
{
|
||||
&mut what[range]
|
||||
}
|
Loading…
Reference in new issue