Skip to main content

miden_stdlib_sys/intrinsics/
word.rs

1use core::ops::{Index, IndexMut};
2
3use super::felt::Felt;
4use crate::felt;
5
6#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
7#[repr(C, align(16))]
8pub struct Word {
9    pub inner: (Felt, Felt, Felt, Felt),
10}
11impl Word {
12    pub const fn new(word: [Felt; 4]) -> Self {
13        Self {
14            inner: (word[0], word[1], word[2], word[3]),
15        }
16    }
17
18    /// Converts each of the `values` to `Felt`.
19    ///
20    /// # Panics
21    ///
22    /// Panics if a value is larger than `Felt::M`.
23    #[inline(always)]
24    pub fn from_u64_unchecked(a: u64, b: u64, c: u64, d: u64) -> Self {
25        Self {
26            inner: (
27                Felt::from_u64_unchecked(a),
28                Felt::from_u64_unchecked(b),
29                Felt::from_u64_unchecked(c),
30                Felt::from_u64_unchecked(d),
31            ),
32        }
33    }
34
35    #[inline(always)]
36    pub fn reverse(&self) -> Word {
37        Word {
38            inner: (self.inner.3, self.inner.2, self.inner.1, self.inner.0),
39        }
40    }
41}
42impl From<(Felt, Felt, Felt, Felt)> for Word {
43    fn from(word: (Felt, Felt, Felt, Felt)) -> Self {
44        Self { inner: word }
45    }
46}
47impl From<[Felt; 4]> for Word {
48    fn from(word: [Felt; 4]) -> Self {
49        Self {
50            inner: (word[0], word[1], word[2], word[3]),
51        }
52    }
53}
54impl From<Word> for (Felt, Felt, Felt, Felt) {
55    #[inline(always)]
56    fn from(word: Word) -> Self {
57        word.inner
58    }
59}
60impl From<Word> for [Felt; 4] {
61    #[inline(always)]
62    fn from(word: Word) -> Self {
63        [word.inner.0, word.inner.1, word.inner.2, word.inner.3]
64    }
65}
66impl From<&Word> for [Felt; 4] {
67    #[inline(always)]
68    fn from(word: &Word) -> Self {
69        [word.inner.0, word.inner.1, word.inner.2, word.inner.3]
70    }
71}
72impl From<Felt> for Word {
73    fn from(value: Felt) -> Self {
74        Word {
75            inner: (felt!(0), felt!(0), felt!(0), value),
76        }
77    }
78}
79impl From<Word> for Felt {
80    fn from(value: Word) -> Self {
81        value.inner.3
82    }
83}
84impl Index<usize> for Word {
85    type Output = Felt;
86
87    #[inline(always)]
88    fn index(&self, index: usize) -> &Self::Output {
89        match index {
90            0 => &self.inner.0,
91            1 => &self.inner.1,
92            2 => &self.inner.2,
93            3 => &self.inner.3,
94            _ => unreachable!(),
95        }
96    }
97}
98impl IndexMut<usize> for Word {
99    #[inline(always)]
100    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
101        match index {
102            0 => &mut self.inner.0,
103            1 => &mut self.inner.1,
104            2 => &mut self.inner.2,
105            3 => &mut self.inner.3,
106            _ => unreachable!(),
107        }
108    }
109}
110
111impl AsRef<Word> for Word {
112    fn as_ref(&self) -> &Word {
113        self
114    }
115}