tasm_lib/rust_shadowing_helper_functions/
array.rs1use std::collections::HashMap;
2
3use num::Zero;
4use twenty_first::prelude::*;
5
6use crate::prelude::*;
7
8pub fn insert_random_array(
9 element_type: &DataType,
10 mut array_pointer: BFieldElement,
11 array_length: usize,
12 memory: &mut HashMap<BFieldElement, BFieldElement>,
13) {
14 let random_values = element_type.random_elements(array_length);
15
16 for element in random_values {
17 for word in element {
18 memory.insert(array_pointer, word);
19 array_pointer.increment();
20 }
21 }
22}
23
24pub fn insert_as_array<T: BFieldCodec>(
26 mut array_pointer: BFieldElement,
27 memory: &mut HashMap<BFieldElement, BFieldElement>,
28 array: Vec<T>,
29) {
30 for element in array {
31 for word in element.encode() {
32 memory.insert(array_pointer, word);
33 array_pointer.increment();
34 }
35 }
36}
37
38pub fn array_get(
40 pointer: BFieldElement,
41 index: usize,
42 memory: &HashMap<BFieldElement, BFieldElement>,
43 element_length: usize,
44) -> Vec<BFieldElement> {
45 let read_word = |i| {
46 let word_offset = (element_length * index + i) as u64;
47 let word_index = pointer + BFieldElement::new(word_offset);
48 memory[&word_index]
49 };
50
51 (0..element_length).map(read_word).collect()
52}
53
54pub fn array_from_memory<T: BFieldCodec + Clone>(
55 mut pointer: BFieldElement,
56 array_length: usize,
57 memory: &HashMap<BFieldElement, BFieldElement>,
58) -> Vec<T> {
59 let mut ret = vec![];
60 let element_length = T::static_length().unwrap();
61 for _ in 0..array_length {
62 let mut element = vec![BFieldElement::zero(); element_length];
63 for word in element.iter_mut() {
64 *word = *memory.get(&pointer).unwrap_or(&BFieldElement::zero());
65 pointer.increment();
66 }
67
68 ret.push(*T::decode(&element).unwrap());
69 }
70
71 ret
72}