binius_math/field_buffer/
view.rs1use std::{
10 ops::{Deref, DerefMut},
11 slice,
12};
13
14use binius_compute::Allocator;
15use binius_field::PackedField;
16
17use super::FieldBuffer;
18
19pub type FieldVec<P, A> = FieldBuffer<P, <A as Allocator>::Vec<P>>;
24
25pub type FieldSlice<'a, P> = FieldBuffer<P, FieldSliceData<'a, P>>;
27
28pub type FieldSliceMut<'a, P> = FieldBuffer<P, &'a mut [P]>;
30
31impl<'a, P: PackedField> FieldSlice<'a, P> {
32 #[track_caller]
38 pub fn from_slice(log_len: usize, slice: &'a [P]) -> Self {
39 FieldBuffer::new(log_len, FieldSliceData::Slice(slice))
40 }
41}
42
43impl<'a, P: PackedField, Data: Deref<Target = [P]>> From<&'a FieldBuffer<P, Data>>
44 for FieldSlice<'a, P>
45{
46 fn from(buffer: &'a FieldBuffer<P, Data>) -> Self {
47 buffer.as_view()
48 }
49}
50
51impl<'a, P: PackedField> FieldSliceMut<'a, P> {
52 #[track_caller]
58 pub fn from_slice(log_len: usize, slice: &'a mut [P]) -> Self {
59 FieldBuffer::new(log_len, slice)
60 }
61}
62
63impl<'a, P: PackedField, Data: DerefMut<Target = [P]>> From<&'a mut FieldBuffer<P, Data>>
64 for FieldSliceMut<'a, P>
65{
66 fn from(buffer: &'a mut FieldBuffer<P, Data>) -> Self {
67 buffer.as_mut_view()
68 }
69}
70
71#[derive(Debug, Clone, Copy)]
72pub enum FieldSliceData<'a, P> {
73 Single(P),
74 Slice(&'a [P]),
75}
76
77impl<'a, P> Deref for FieldSliceData<'a, P> {
78 type Target = [P];
79
80 fn deref(&self) -> &Self::Target {
81 match self {
82 FieldSliceData::Single(val) => slice::from_ref(val),
83 FieldSliceData::Slice(slice) => slice,
84 }
85 }
86}