use crate::{AnyStoredVec, Format, ReadOnlyRawVec, VecIndex, VecReader, 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 VecReader<I, T, ZeroCopyStrategy<T>>,
) -> Option<&'a T> {
self.read_ref_at(index.to_usize(), reader)
}
#[inline]
pub fn read_ref_at<'a>(
&self,
index: usize,
reader: &'a VecReader<I, T, ZeroCopyStrategy<T>>,
) -> Option<&'a T> {
if !self.holes().is_empty() && self.holes().contains(&index) {
return None;
}
let stored_len = reader.len();
debug_assert_eq!(stored_len, self.stored_len(), "stale VecReader");
if index >= stored_len {
return None;
}
if !self.updated().is_empty() && self.updated().contains_key(&index) {
return None;
}
self.stored_ref_at(index, reader)
}
#[inline]
fn stored_ref_at<'a>(
&self,
index: usize,
reader: &'a VecReader<I, T, ZeroCopyStrategy<T>>,
) -> Option<&'a T> {
let offset = index * Self::SIZE_OF_T;
let bytes = reader.as_bytes().get(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>>
);