tasm_lib::list::higher_order::map

Struct ChainMap

Source
pub struct ChainMap<const NUM_INPUT_LISTS: usize> { /* private fields */ }
Expand description

Applies a given function f to every element of all given lists, collecting the new elements into a new list.

The given function f must produce elements of a type for which the encoded length is statically known. The input type may have either statically or dynamically known length:

  • In the static case, the entire element is placed on the stack before passing control to f.
  • In the dynamic case, a memory pointer to the encoded element and the item’s length is placed on the stack before passing control to f. The input list must be encoded according to BFieldCodec. Otherwise, behavior of ChainMap is undefined!

The stack layout is independent of the list currently being processed. This allows the InnerFunction f to use runtime parameters from the stack. Note that the chain map requires a certain number of stack registers for internal purposes. This number can be accessed through ChainMap::NUM_INTERNAL_REGISTERS. As mentioned above, the stack layout upon starting execution of f depends on the input type’s static length. In the static case, the stack layout is:

// _ <accessible> [_; ChainMap::<N>::NUM_INTERNAL_REGISTERS] [input_element; len]

In the case of input elements with a dynamic length, the stack layout is:

// _ <accessible> [_; ChainMap::<N>::NUM_INTERNAL_REGISTERS] *elem_i elem_i_len

Implementations§

Source§

impl<const NUM_INPUT_LISTS: usize> ChainMap<NUM_INPUT_LISTS>

Source

pub const NUM_INTERNAL_REGISTERS: usize = _

The number of registers required internally. See ChainMap for additional details.

Source

pub fn new(f: InnerFunction) -> Self

§Panics

Trait Implementations§

Source§

impl<const NUM_INPUT_LISTS: usize> BasicSnippet for ChainMap<NUM_INPUT_LISTS>

Source§

fn inputs(&self) -> Vec<(DataType, String)>

Source§

fn outputs(&self) -> Vec<(DataType, String)>

Source§

fn entrypoint(&self) -> String

Source§

fn code(&self, library: &mut Library) -> Vec<LabelledInstruction>

Source§

fn annotated_code(&self, library: &mut Library) -> Vec<LabelledInstruction>

Source§

fn init_stack_for_isolated_run(&self) -> Vec<BFieldElement>

Intial stack on program start, when the snippet runs in isolation.
Source§

fn stack_diff(&self) -> isize

Source§

impl<const NUM_INPUT_LISTS: usize> Function for ChainMap<NUM_INPUT_LISTS>

Source§

fn rust_shadow( &self, stack: &mut Vec<BFieldElement>, memory: &mut HashMap<BFieldElement, BFieldElement>, )

Source§

fn pseudorandom_initial_state( &self, seed: [u8; 32], bench: Option<BenchmarkCase>, ) -> FunctionInitialState

Return (init_stack, init_memory)
Source§

fn corner_case_initial_states(&self) -> Vec<FunctionInitialState>

Auto Trait Implementations§

§

impl<const NUM_INPUT_LISTS: usize> Freeze for ChainMap<NUM_INPUT_LISTS>

§

impl<const NUM_INPUT_LISTS: usize> !RefUnwindSafe for ChainMap<NUM_INPUT_LISTS>

§

impl<const NUM_INPUT_LISTS: usize> !Send for ChainMap<NUM_INPUT_LISTS>

§

impl<const NUM_INPUT_LISTS: usize> !Sync for ChainMap<NUM_INPUT_LISTS>

§

impl<const NUM_INPUT_LISTS: usize> Unpin for ChainMap<NUM_INPUT_LISTS>

§

impl<const NUM_INPUT_LISTS: usize> !UnwindSafe for ChainMap<NUM_INPUT_LISTS>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize = _

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V