#[cfg(test)]
#[path = "column_tests.rs"]
mod tests;
pub(crate) fn saturating_u32(n: usize) -> u32 {
u32::try_from(n)
.into_iter()
.fold(u32::MAX, |_, value| value)
}
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Default)]
pub struct Revision(u64);
impl Revision {
pub const INITIAL: Self = Self(0);
#[must_use]
pub fn next(self) -> Self {
Self(self.0 + 1)
}
#[must_use]
pub fn get(self) -> u64 {
self.0
}
}
#[derive(Clone, Debug, Default)]
pub struct Column<T> {
values: Vec<T>,
revision: Revision,
}
impl<T> Column<T> {
#[must_use]
pub fn new(values: Vec<T>) -> Self {
Self {
values,
revision: Revision::INITIAL,
}
}
#[must_use]
pub fn len(&self) -> usize {
self.values.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
#[must_use]
pub fn values(&self) -> &[T] {
&self.values
}
pub fn values_mut(&mut self) -> &mut [T] {
self.revision = self.revision.next();
&mut self.values
}
#[must_use]
pub fn revision(&self) -> Revision {
self.revision
}
}
impl<T: bytemuck::Pod> Column<T> {
#[must_use]
pub fn as_bytes(&self) -> &[u8] {
bytemuck::cast_slice(&self.values)
}
}