use std::cell::{Ref, RefMut};
use std::fmt::Debug;
use std::ops::{Deref, DerefMut};
use vortex_buffer::{Alignment, ByteBuffer, ByteBufferMut};
use crate::pipeline::N;
use crate::pipeline::bits::BitVector;
use crate::pipeline::types::{Element, VType};
use crate::pipeline::view::{View, ViewMut};
#[derive(Debug)]
pub struct Vector {
vtype: VType,
elements: ByteBufferMut,
validity: BitVector,
selection: Selection,
#[allow(dead_code)]
data: Vec<ByteBuffer>,
}
impl Vector {
pub fn new<T: Element>() -> Self {
Self::new_with_vtype(T::vtype())
}
pub fn new_with_vtype(vtype: VType) -> Self {
let mut elements = ByteBufferMut::with_capacity_aligned(
vtype.byte_width() * N,
Alignment::new(vtype.byte_width()),
);
unsafe { elements.set_len(vtype.byte_width() * N) };
Self {
vtype,
elements,
validity: BitVector::full().clone(),
selection: Selection::Prefix,
data: vec![],
}
}
pub fn set_selection(&mut self, selection: Selection) {
self.selection = selection;
}
pub fn as_mut_array<T: Element>(&mut self) -> &mut [T; N] {
assert_eq!(self.vtype, T::vtype());
unsafe { &mut *(self.elements.as_mut_ptr().cast::<T>().cast::<[T; N]>()) }
}
pub fn as_view_mut(&mut self) -> ViewMut<'_> {
ViewMut {
vtype: self.vtype,
elements: self.elements.as_mut_ptr().cast(),
validity: Some(self.validity.as_view_mut()),
data: vec![],
selection: self.selection,
_marker: Default::default(),
}
}
pub fn as_view(&self) -> View<'_> {
View {
vtype: self.vtype,
elements: self.elements.as_ptr().cast(),
validity: Some(self.validity.as_view()),
selection: self.selection,
data: vec![],
_marker: Default::default(),
}
}
}
pub struct VectorRef<'a> {
#[allow(dead_code)]
borrow: Ref<'a, Vector>,
view: View<'a>,
}
impl<'a> VectorRef<'a> {
pub fn new(borrow: Ref<'a, Vector>) -> Self {
let view = borrow.as_view();
let view = unsafe { std::mem::transmute::<View<'_>, View<'a>>(view) };
Self { borrow, view }
}
pub fn as_view(&self) -> &View<'a> {
&self.view
}
}
impl<'a> Deref for VectorRef<'a> {
type Target = View<'a>;
fn deref(&self) -> &Self::Target {
&self.view
}
}
pub struct VectorRefMut<'a> {
#[allow(dead_code)]
borrow: RefMut<'a, Vector>,
view: ViewMut<'a>,
}
impl<'a> VectorRefMut<'a> {
pub fn new(mut borrow: RefMut<'a, Vector>) -> Self {
let view = borrow.as_view_mut();
let view = unsafe { std::mem::transmute::<ViewMut<'_>, ViewMut<'a>>(view) };
Self { borrow, view }
}
}
impl<'a> Deref for VectorRefMut<'a> {
type Target = ViewMut<'a>;
fn deref(&self) -> &Self::Target {
&self.view
}
}
impl<'a> DerefMut for VectorRefMut<'a> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.view
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Selection {
Prefix,
Mask,
}