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    /// The value to publish.
6    pub value: R,
7    /// The index of the public value to publish.
8    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}