binius_math/
packing_deref.rs

1// Copyright 2024-2025 Irreducible Inc.
2
3use std::{marker::PhantomData, ops::Deref};
4
5use binius_field::{
6	as_packed_field::{PackScalar, PackedType},
7	underlier::{UnderlierType, WithUnderlier},
8	Field,
9};
10
11/// A wrapper for containers of underlier types that dereferences as packed field slices.
12#[derive(Debug, Clone)]
13pub struct PackingDeref<U, F, Data>(Data, PhantomData<F>)
14where
15	Data: Deref<Target = [U]>;
16
17impl<U, F, Data> PackingDeref<U, F, Data>
18where
19	Data: Deref<Target = [U]>,
20{
21	pub const fn new(data: Data) -> Self {
22		Self(data, PhantomData)
23	}
24}
25
26impl<U, F, Data> Deref for PackingDeref<U, F, Data>
27where
28	U: UnderlierType + PackScalar<F>,
29	F: Field,
30	Data: Deref<Target = [U]>,
31{
32	type Target = [PackedType<U, F>];
33
34	fn deref(&self) -> &Self::Target {
35		<PackedType<U, F>>::from_underliers_ref(&self.0)
36	}
37}