use memmap2::Mmap;
use std::ops::Deref;
use std::sync::Arc;
pub enum Storage {
Mmap(Mmap),
Owned(Vec<u8>),
Shared(Arc<[u8]>),
}
impl Deref for Storage {
type Target = [u8];
#[inline]
fn deref(&self) -> &[u8] {
match self {
Storage::Mmap(m) => m,
Storage::Owned(v) => v,
Storage::Shared(a) => a,
}
}
}
impl AsRef<[u8]> for Storage {
#[inline]
fn as_ref(&self) -> &[u8] {
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_owned_deref() {
let data = vec![1u8, 2, 3, 4];
let s = Storage::Owned(data.clone());
assert_eq!(&*s, &data[..]);
}
#[test]
fn test_shared_deref() {
let data: Arc<[u8]> = Arc::from(vec![10u8, 20, 30]);
let s = Storage::Shared(data.clone());
assert_eq!(&*s, &*data);
}
}