vortex_array/pipeline/
vec.rs1use std::cell::{Ref, RefMut};
12use std::fmt::Debug;
13use std::ops::{Deref, DerefMut};
14
15use vortex_buffer::{Alignment, ByteBuffer, ByteBufferMut};
16
17use crate::pipeline::N;
18use crate::pipeline::bits::BitVector;
19use crate::pipeline::types::{Element, VType};
20use crate::pipeline::view::{View, ViewMut};
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
24pub struct VectorId(pub(crate) usize);
25
26impl Deref for VectorId {
27 type Target = usize;
28
29 fn deref(&self) -> &Self::Target {
30 &self.0
31 }
32}
33
34#[derive(Debug)]
36pub struct Vector {
37 vtype: VType,
39 elements: ByteBufferMut,
43 validity: BitVector,
45 len: usize,
47
48 #[allow(dead_code)]
51 data: Vec<ByteBuffer>,
52}
53
54impl Vector {
55 pub fn new<T: Element>() -> Self {
56 Self::new_with_vtype(T::vtype())
57 }
58
59 pub fn new_with_vtype(vtype: VType) -> Self {
60 let mut elements = ByteBufferMut::with_capacity_aligned(
61 vtype.byte_width() * N,
62 Alignment::new(vtype.byte_width()),
63 );
64 unsafe { elements.set_len(vtype.byte_width() * N) };
65
66 Self {
67 vtype,
68 elements,
69 validity: BitVector::full().clone(),
70 len: 0,
71 data: vec![],
72 }
73 }
74
75 #[inline(always)]
76 pub fn len(&self) -> usize {
77 self.len
78 }
79
80 pub fn is_empty(&self) -> bool {
81 self.len == 0
82 }
83
84 pub fn set_len(&mut self, len: usize) {
85 assert!(len <= N, "Length cannot exceed the capacity of the vector");
86 self.len = len;
87 }
88
89 pub fn as_mut_array<T: Element>(&mut self) -> &mut [T; N] {
90 assert_eq!(self.vtype, T::vtype());
91 unsafe { &mut *(self.elements.as_mut_ptr().cast::<T>().cast::<[T; N]>()) }
92 }
93
94 pub fn as_view_mut(&mut self) -> ViewMut<'_> {
95 ViewMut {
96 vtype: self.vtype,
97 elements: self.elements.as_mut_ptr().cast(),
98 validity: Some(self.validity.as_view_mut()),
99 data: vec![],
100 _marker: Default::default(),
101 }
102 }
103
104 pub fn as_view(&self) -> View<'_> {
105 View {
106 vtype: self.vtype,
107 elements: self.elements.as_ptr().cast(),
108 validity: Some(self.validity.as_view()),
109 len: self.len,
110 data: vec![],
111 _marker: Default::default(),
112 }
113 }
114}
115
116pub struct VectorRef<'a> {
119 #[allow(dead_code)]
121 borrow: Ref<'a, Vector>,
122 view: View<'a>,
123}
124
125impl<'a> VectorRef<'a> {
126 pub fn new(borrow: Ref<'a, Vector>) -> Self {
127 let view = borrow.as_view();
128 let view = unsafe { std::mem::transmute::<View<'_>, View<'a>>(view) };
130 Self { borrow, view }
131 }
132
133 pub fn as_view(&self) -> &View<'a> {
134 &self.view
135 }
136}
137
138impl<'a> Deref for VectorRef<'a> {
139 type Target = View<'a>;
140
141 fn deref(&self) -> &Self::Target {
142 &self.view
143 }
144}
145
146pub struct VectorRefMut<'a> {
149 #[allow(dead_code)]
151 borrow: RefMut<'a, Vector>,
152 view: ViewMut<'a>,
153}
154
155impl<'a> VectorRefMut<'a> {
156 pub fn new(mut borrow: RefMut<'a, Vector>) -> Self {
157 let view = borrow.as_view_mut();
158 let view = unsafe { std::mem::transmute::<ViewMut<'_>, ViewMut<'a>>(view) };
160 Self { borrow, view }
161 }
162}
163
164impl<'a> Deref for VectorRefMut<'a> {
165 type Target = ViewMut<'a>;
166
167 fn deref(&self) -> &Self::Target {
168 &self.view
169 }
170}
171
172impl<'a> DerefMut for VectorRefMut<'a> {
173 fn deref_mut(&mut self) -> &mut Self::Target {
174 &mut self.view
175 }
176}