scsys_crypto/hash/h256/
impl_ops.rs

1/*
2    Appellation: impl_ops <module>
3    Contrib: @FL03
4*/
5use super::H256;
6
7impl core::ops::Add<Self> for H256 {
8    type Output = Self;
9
10    fn add(self, rhs: Self) -> Self {
11        let mut result_bytes = [0; 32];
12        for n in 1..9 {
13            let results: [u8; 4] = {
14                let val = u32::from_be_bytes(self.0[4 * (n - 1)..4 * n].try_into().unwrap());
15                let rhs = u32::from_be_bytes(rhs.0[4 * (n - 1)..4 * n].try_into().unwrap());
16                let tmp = ((val as u64) + (rhs as u64)) as u32;
17                tmp.to_be_bytes()
18            };
19            result_bytes[4 * (n - 1)] = results[0];
20            result_bytes[4 * (n - 1) + 1] = results[1];
21            result_bytes[4 * (n - 1) + 2] = results[2];
22            result_bytes[4 * (n - 1) + 3] = results[3];
23        }
24        Self(result_bytes)
25    }
26}
27
28impl core::ops::AddAssign<Self> for H256 {
29    fn add_assign(&mut self, rhs: Self) {
30        for n in 1..9 {
31            let results: [u8; 4] = {
32                let val = u32::from_be_bytes(self.0[4 * (n - 1)..4 * n].try_into().unwrap());
33                let rhs = u32::from_be_bytes(rhs.0[4 * (n - 1)..4 * n].try_into().unwrap());
34                let tmp = ((val as u64) + (rhs as u64)) as u32;
35                tmp.to_be_bytes()
36            };
37            self[4 * (n - 1)] = results[0];
38            self[4 * (n - 1) + 1] = results[1];
39            self[4 * (n - 1) + 2] = results[2];
40            self[4 * (n - 1) + 3] = results[3];
41        }
42    }
43}
44
45impl core::ops::Add<f64> for H256 {
46    type Output = Self;
47
48    fn add(self, rhs: f64) -> Self {
49        let mut result_bytes = [0; 32];
50        for n in 1..9 {
51            let results: [u8; 4] = {
52                let v = u32::from_be_bytes(self.0[4 * (n - 1)..4 * n].try_into().unwrap());
53                let tmp = ((v as f64) + rhs) as u32;
54                tmp.to_be_bytes()
55            };
56            result_bytes[4 * (n - 1)] = results[0];
57            result_bytes[4 * (n - 1) + 1] = results[1];
58            result_bytes[4 * (n - 1) + 2] = results[2];
59            result_bytes[4 * (n - 1) + 3] = results[3];
60        }
61        Self(result_bytes)
62    }
63}
64
65impl core::ops::AddAssign<f64> for H256 {
66    fn add_assign(&mut self, rhs: f64) {
67        for n in 1..9 {
68            let results: [u8; 4] = {
69                let v = u32::from_be_bytes(self.0[4 * (n - 1)..4 * n].try_into().unwrap());
70                let tmp = ((v as f64) + rhs) as u32;
71                tmp.to_be_bytes()
72            };
73            self[4 * (n - 1)] = results[0];
74            self[4 * (n - 1) + 1] = results[1];
75            self[4 * (n - 1) + 2] = results[2];
76            self[4 * (n - 1) + 3] = results[3];
77        }
78    }
79}
80
81impl core::ops::Div<f64> for H256 {
82    type Output = Self;
83
84    fn div(self, rhs: f64) -> Self {
85        let mut result_bytes = [0; 32];
86        for n in 1..9 {
87            let results: [u8; 4] = {
88                let v = u32::from_be_bytes(self.0[4 * (n - 1)..4 * n].try_into().unwrap());
89                let tmp = ((v as f64) / rhs) as u32;
90                tmp.to_be_bytes()
91            };
92            result_bytes[4 * (n - 1)] = results[0];
93            result_bytes[4 * (n - 1) + 1] = results[1];
94            result_bytes[4 * (n - 1) + 2] = results[2];
95            result_bytes[4 * (n - 1) + 3] = results[3];
96        }
97        Self(result_bytes)
98    }
99}
100
101impl core::ops::DivAssign<f64> for H256 {
102    fn div_assign(&mut self, rhs: f64) {
103        for n in 1..9 {
104            let results: [u8; 4] = {
105                let v = u32::from_be_bytes(self.0[4 * (n - 1)..4 * n].try_into().unwrap());
106                let tmp = ((v as f64) / rhs) as u32;
107                tmp.to_be_bytes()
108            };
109            self[4 * (n - 1)] = results[0];
110            self[4 * (n - 1) + 1] = results[1];
111            self[4 * (n - 1) + 2] = results[2];
112            self[4 * (n - 1) + 3] = results[3];
113        }
114    }
115}
116
117impl core::ops::Mul<f64> for H256 {
118    type Output = Self;
119
120    fn mul(self, rhs: f64) -> Self {
121        let mut result_bytes = [0; 32];
122        for n in 1..9 {
123            let results: [u8; 4] = {
124                let v = u32::from_be_bytes(self.0[4 * (n - 1)..4 * n].try_into().unwrap());
125                let tmp = ((v as f64) * rhs) as u32;
126                tmp.to_be_bytes()
127            };
128            result_bytes[4 * (n - 1)] = results[0];
129            result_bytes[4 * (n - 1) + 1] = results[1];
130            result_bytes[4 * (n - 1) + 2] = results[2];
131            result_bytes[4 * (n - 1) + 3] = results[3];
132        }
133        Self(result_bytes)
134    }
135}
136
137impl core::ops::MulAssign<f64> for H256 {
138    fn mul_assign(&mut self, rhs: f64) {
139        for n in 1..9 {
140            let results: [u8; 4] = {
141                let v = u32::from_be_bytes(self.0[4 * (n - 1)..4 * n].try_into().unwrap());
142                let tmp = ((v as f64) * rhs) as u32;
143                tmp.to_be_bytes()
144            };
145            self[4 * (n - 1)] = results[0];
146            self[4 * (n - 1) + 1] = results[1];
147            self[4 * (n - 1) + 2] = results[2];
148            self[4 * (n - 1) + 3] = results[3];
149        }
150    }
151}
152
153impl core::ops::Index<usize> for H256 {
154    type Output = u8;
155
156    fn index(&self, index: usize) -> &Self::Output {
157        &self.0[index]
158    }
159}
160
161impl core::ops::IndexMut<usize> for H256 {
162    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
163        &mut self.0[index]
164    }
165}
166
167impl core::ops::Index<core::ops::Range<usize>> for H256 {
168    type Output = [u8];
169
170    fn index(&self, index: core::ops::Range<usize>) -> &Self::Output {
171        &self.0[index]
172    }
173}
174
175impl core::ops::IndexMut<core::ops::Range<usize>> for H256 {
176    fn index_mut(&mut self, index: core::ops::Range<usize>) -> &mut Self::Output {
177        &mut self.0[index]
178    }
179}