Skip to main content

binius_math/field_buffer/
view.rs

1// Copyright 2025 Irreducible Inc.
2// Copyright 2026 The Binius Developers
3
4//! Borrowed views over a field buffer.
5//!
6//! A view is the same buffer type parameterized by a borrowed store.
7//! So every method on an owned buffer is available on a view of one.
8
9use std::{
10	ops::{Deref, DerefMut},
11	slice,
12};
13
14use binius_compute::Allocator;
15use binius_field::PackedField;
16
17use super::FieldBuffer;
18
19/// A field buffer whose backing store is drawn from an allocator.
20///
21/// Over a buffer pool this is a recyclable pooled buffer.
22/// Over the global allocator it is an ordinary vector-backed buffer.
23pub type FieldVec<P, A> = FieldBuffer<P, <A as Allocator>::Vec<P>>;
24
25/// Alias for a field buffer over a borrowed slice.
26pub type FieldSlice<'a, P> = FieldBuffer<P, FieldSliceData<'a, P>>;
27
28/// Alias for a field buffer over a mutably borrowed slice.
29pub type FieldSliceMut<'a, P> = FieldBuffer<P, &'a mut [P]>;
30
31impl<'a, P: PackedField> FieldSlice<'a, P> {
32	/// Create a new FieldSlice from a slice of packed words.
33	///
34	/// # Preconditions
35	///
36	/// * `slice.len()` must equal the expected packed length for `log_len`.
37	#[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	/// Create a new FieldSliceMut from a mutable slice of packed words.
53	///
54	/// # Preconditions
55	///
56	/// * `slice.len()` must equal the expected packed length for `log_len`.
57	#[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}