pub trait ByteSource: std::fmt::Debug {
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn byte_at(&self, offset: usize) -> Option<u8>;
fn slice_at(&self, offset: usize, len: usize) -> Option<&[u8]>;
}
#[derive(Debug, Clone, Copy)]
pub enum ReadBackend<'a> {
Slice(&'a [u8]),
#[cfg(feature = "mmap")]
Mapped(&'a memmap2::Mmap),
}
impl<'a> ReadBackend<'a> {
#[inline]
pub fn as_slice(&self) -> &[u8] {
match self {
ReadBackend::Slice(s) => s,
#[cfg(feature = "mmap")]
ReadBackend::Mapped(m) => m.as_ref(),
}
}
#[inline]
pub fn len(&self) -> usize {
self.as_slice().len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl ByteSource for ReadBackend<'_> {
#[inline]
fn len(&self) -> usize {
self.as_slice().len()
}
#[inline]
fn byte_at(&self, offset: usize) -> Option<u8> {
self.as_slice().get(offset).copied()
}
#[inline]
fn slice_at(&self, offset: usize, len: usize) -> Option<&[u8]> {
self.as_slice().get(offset..offset + len)
}
}
impl<'a> From<&'a [u8]> for ReadBackend<'a> {
#[inline]
fn from(slice: &'a [u8]) -> Self {
ReadBackend::Slice(slice)
}
}
impl<'a> From<&'a Vec<u8>> for ReadBackend<'a> {
#[inline]
fn from(v: &'a Vec<u8>) -> Self {
ReadBackend::Slice(v.as_slice())
}
}
#[cfg(feature = "mmap")]
impl<'a> From<&'a memmap2::Mmap> for ReadBackend<'a> {
#[inline]
fn from(mmap: &'a memmap2::Mmap) -> Self {
ReadBackend::Mapped(mmap)
}
}