use std::sync::{Arc, Mutex};
use crate::backend::Storage;
use crate::error::{Error, Result};
#[derive(Clone)]
pub struct MemStorage(Arc<Mutex<Vec<u8>>>);
impl MemStorage {
pub fn new(size: u64) -> Self {
assert!(size > 0, "backend: MemStorage size must be positive");
MemStorage(Arc::new(Mutex::new(vec![0u8; size as usize])))
}
}
impl Storage for MemStorage {
fn read_at(&self, buf: &mut [u8], offset: u64) -> Result<()> {
let data = self.0.lock().unwrap();
let offset = offset as usize;
let end = offset
.checked_add(buf.len())
.filter(|&end| end <= data.len())
.ok_or_else(|| Error::Io(std::io::Error::from(std::io::ErrorKind::UnexpectedEof)))?;
buf.copy_from_slice(&data[offset..end]);
Ok(())
}
fn write_at(&self, buf: &[u8], offset: u64) -> Result<()> {
let mut data = self.0.lock().unwrap();
let offset = offset as usize;
let end = offset
.checked_add(buf.len())
.filter(|&end| end <= data.len())
.ok_or_else(|| Error::Io(std::io::Error::from(std::io::ErrorKind::WriteZero)))?;
data[offset..end].copy_from_slice(buf);
Ok(())
}
fn size(&self) -> u64 {
self.0.lock().unwrap().len() as u64
}
fn close(self) -> Result<()> {
Ok(())
}
}