miden_stdlib_sys/intrinsics/
word.rs

1use core::ops::{Index, IndexMut};
2
3use super::felt::Felt;
4
5#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
6#[repr(C, align(32))]
7pub struct Word {
8    pub inner: (Felt, Felt, Felt, Felt),
9}
10impl Word {
11    pub const fn new(word: [Felt; 4]) -> Self {
12        Self {
13            inner: (word[0], word[1], word[2], word[3]),
14        }
15    }
16}
17impl From<[Felt; 4]> for Word {
18    fn from(word: [Felt; 4]) -> Self {
19        Self {
20            inner: (word[0], word[1], word[2], word[3]),
21        }
22    }
23}
24impl From<Word> for [Felt; 4] {
25    #[inline(always)]
26    fn from(word: Word) -> Self {
27        [word.inner.0, word.inner.1, word.inner.2, word.inner.3]
28    }
29}
30impl Index<usize> for Word {
31    type Output = Felt;
32
33    #[inline(always)]
34    fn index(&self, index: usize) -> &Self::Output {
35        match index {
36            0 => &self.inner.0,
37            1 => &self.inner.1,
38            2 => &self.inner.2,
39            3 => &self.inner.3,
40            _ => unreachable!(),
41        }
42    }
43}
44impl IndexMut<usize> for Word {
45    #[inline(always)]
46    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
47        match index {
48            0 => &mut self.inner.0,
49            1 => &mut self.inner.1,
50            2 => &mut self.inner.2,
51            3 => &mut self.inner.3,
52            _ => unreachable!(),
53        }
54    }
55}