miden_stdlib_sys/intrinsics/
word.rs1use 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}