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