PackedValue

Trait PackedValue 

Source
pub unsafe trait PackedValue:
    'static
    + Copy
    + Send
    + Sync {
    type Value: Packable;

    const WIDTH: usize;

    // Required methods
    fn from_slice(slice: &[Self::Value]) -> &Self;
    fn from_slice_mut(slice: &mut [Self::Value]) -> &mut Self;
    fn from_fn<F>(f: F) -> Self
       where F: FnMut(usize) -> Self::Value;
    fn as_slice(&self) -> &[Self::Value];
    fn as_slice_mut(&mut self) -> &mut [Self::Value];

    // Provided methods
    fn pack_slice(buf: &[Self::Value]) -> &[Self] { ... }
    fn pack_slice_with_suffix(buf: &[Self::Value]) -> (&[Self], &[Self::Value]) { ... }
    fn pack_slice_mut(buf: &mut [Self::Value]) -> &mut [Self] { ... }
    fn pack_maybe_uninit_slice_mut(
        buf: &mut [MaybeUninit<Self::Value>],
    ) -> &mut [MaybeUninit<Self>] { ... }
    fn pack_slice_with_suffix_mut(
        buf: &mut [Self::Value],
    ) -> (&mut [Self], &mut [Self::Value]) { ... }
    fn pack_maybe_uninit_slice_with_suffix_mut(
        buf: &mut [MaybeUninit<Self::Value>],
    ) -> (&mut [MaybeUninit<Self>], &mut [MaybeUninit<Self::Value>]) { ... }
    fn unpack_slice(buf: &[Self]) -> &[Self::Value] { ... }
}
Expand description

A trait for array-like structs made up of multiple scalar elements.

§Safety

  • If P implements PackedField then P must be castable to/from [P::Value; P::WIDTH] without UB.

Required Associated Constants§

Source

const WIDTH: usize

Number of scalar values packed together.

Required Associated Types§

Source

type Value: Packable

The scalar type that is packed into this value.

Required Methods§

Source

fn from_slice(slice: &[Self::Value]) -> &Self

Interprets a slice of scalar values as a packed value reference.

§Panics:

This function will panic if slice.len() != Self::WIDTH

Source

fn from_slice_mut(slice: &mut [Self::Value]) -> &mut Self

Interprets a mutable slice of scalar values as a mutable packed value.

§Panics:

This function will panic if slice.len() != Self::WIDTH

Source

fn from_fn<F>(f: F) -> Self
where F: FnMut(usize) -> Self::Value,

Constructs a packed value using a function to generate each element.

Similar to core:array::from_fn.

Source

fn as_slice(&self) -> &[Self::Value]

Returns the underlying scalar values as an immutable slice.

Source

fn as_slice_mut(&mut self) -> &mut [Self::Value]

Returns the underlying scalar values as a mutable slice.

Provided Methods§

Source

fn pack_slice(buf: &[Self::Value]) -> &[Self]

Packs a slice of scalar values into a slice of packed values.

§Panics

Panics if the slice length is not divisible by WIDTH.

Source

fn pack_slice_with_suffix(buf: &[Self::Value]) -> (&[Self], &[Self::Value])

Packs a slice into packed values and returns the packed portion and any remaining suffix.

Source

fn pack_slice_mut(buf: &mut [Self::Value]) -> &mut [Self]

Converts a mutable slice of scalar values into a mutable slice of packed values.

§Panics

Panics if the slice length is not divisible by WIDTH.

Source

fn pack_maybe_uninit_slice_mut( buf: &mut [MaybeUninit<Self::Value>], ) -> &mut [MaybeUninit<Self>]

Converts a mutable slice of possibly uninitialized scalar values into a mutable slice of possibly uninitialized packed values.

§Panics

Panics if the slice length is not divisible by WIDTH.

Source

fn pack_slice_with_suffix_mut( buf: &mut [Self::Value], ) -> (&mut [Self], &mut [Self::Value])

Converts a mutable slice of scalar values into a pair:

  • a slice of packed values covering the largest aligned portion,
  • and a remainder slice of scalar values that couldn’t be packed.
Source

fn pack_maybe_uninit_slice_with_suffix_mut( buf: &mut [MaybeUninit<Self::Value>], ) -> (&mut [MaybeUninit<Self>], &mut [MaybeUninit<Self::Value>])

Converts a mutable slice of possibly uninitialized scalar values into a pair:

  • a slice of possibly uninitialized packed values covering the largest aligned portion,
  • and a remainder slice of possibly uninitialized scalar values that couldn’t be packed.
Source

fn unpack_slice(buf: &[Self]) -> &[Self::Value]

Reinterprets a slice of packed values as a flat slice of scalar values.

Each packed value contains Self::WIDTH scalar values, which are laid out contiguously in memory. This function allows direct access to those scalars.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<T: Packable, const WIDTH: usize> PackedValue for [T; WIDTH]

Source§

const WIDTH: usize = WIDTH

Source§

type Value = T

Source§

fn from_slice(slice: &[Self::Value]) -> &Self

Source§

fn from_slice_mut(slice: &mut [Self::Value]) -> &mut Self

Source§

fn from_fn<F>(f: F) -> Self
where F: FnMut(usize) -> Self::Value,

Source§

fn as_slice(&self) -> &[Self::Value]

Source§

fn as_slice_mut(&mut self) -> &mut [Self::Value]

Implementors§

Source§

impl<F: Field, const N: usize> PackedValue for FieldArray<F, N>

Source§

const WIDTH: usize = N

Source§

type Value = F

Source§

impl<T: Packable> PackedValue for T

Source§

const WIDTH: usize = 1usize

Source§

type Value = T