openvm_circuit/system/public_values/
columns.rs
1use std::marker::PhantomData;
2
3pub(crate) struct PublicValuesCoreColsView<'a, T, R> {
4 pub is_valid: R,
5 pub value: R,
7 pub index: R,
9 pub custom_pv_vars: Vec<R>,
10 pub(crate) _marker: PhantomData<&'a T>,
11}
12
13impl<T, R> PublicValuesCoreColsView<'_, T, R> {
14 pub(crate) fn width(&self) -> usize {
15 3 + self.custom_pv_vars.len()
16 }
17 #[allow(dead_code)]
18 pub(crate) fn flatten(self) -> Vec<R> {
19 [self.is_valid, self.value, self.index]
20 .into_iter()
21 .chain(self.custom_pv_vars)
22 .collect()
23 }
24}
25impl<'a, T> PublicValuesCoreColsView<'a, T, &'a T> {
26 pub(crate) fn borrow(arr: &'a [T]) -> PublicValuesCoreColsView<'a, T, &'a T> {
27 PublicValuesCoreColsView::<T, &'a T> {
28 is_valid: &arr[0],
29 value: &arr[1],
30 index: &arr[2],
31 custom_pv_vars: arr[3..].iter().collect(),
32 _marker: Default::default(),
33 }
34 }
35}
36impl<'a, T> PublicValuesCoreColsView<'a, T, &'a mut T> {
37 pub(crate) fn borrow_mut(arr: &'a mut [T]) -> PublicValuesCoreColsView<'a, T, &'a mut T> {
38 let (first_three, rest) = arr.split_at_mut(3);
39 let [is_valid, value, index] = first_three else {
40 unreachable!("first_three should have exactly 3 elements");
41 };
42 PublicValuesCoreColsView::<T, &'a mut T> {
43 is_valid,
44 value,
45 index,
46 custom_pv_vars: rest.iter_mut().collect(),
47 _marker: Default::default(),
48 }
49 }
50}