use rawdb::Reader;
use crate::{AnyStoredVec, Format, HEADER_OFFSET, ReadOnlyRawVec, VecIndex, impl_vec_wrapper};
use super::ReadWriteRawVec;
mod strategy;
mod value;
pub use strategy::*;
pub use value::*;
#[derive(Debug)]
#[must_use = "Vector should be stored to keep data accessible"]
pub struct ZeroCopyVec<I, T>(pub(crate) ReadWriteRawVec<I, T, ZeroCopyStrategy<T>>);
impl<I, T> ZeroCopyVec<I, T>
where
I: VecIndex,
T: ZeroCopyVecValue,
{
pub const SIZE_OF_T: usize = size_of::<T>();
#[inline]
pub fn read_ref<'a>(&self, index: I, reader: &'a Reader) -> Option<&'a T> {
self.read_ref_at(index.to_usize(), reader)
}
#[inline]
pub fn read_ref_at<'a>(&self, index: usize, reader: &'a Reader) -> Option<&'a T> {
if !self.holes().is_empty() && self.holes().contains(&index) {
return None;
}
let stored_len = self.stored_len();
if index >= stored_len {
return None;
}
if !self.updated().is_empty() && self.updated().contains_key(&index) {
return None;
}
self.unchecked_read_ref_at(index, reader)
}
#[inline]
pub fn unchecked_read_ref_at<'a>(&self, index: usize, reader: &'a Reader) -> Option<&'a T> {
let offset = (index * Self::SIZE_OF_T) + HEADER_OFFSET;
let bytes = reader.prefixed(offset);
T::ref_from_prefix(bytes).map(|(v, _)| v).ok()
}
}
impl_vec_wrapper!(
ZeroCopyVec,
ReadWriteRawVec<I, T, ZeroCopyStrategy<T>>,
ZeroCopyVecValue,
Format::ZeroCopy,
ReadOnlyRawVec<I, T, ZeroCopyStrategy<T>>
);