1pub trait Word:
2 std::cmp::PartialEq
3 + std::fmt::Debug
4 + Copy
5 + num::traits::WrappingAdd
6 + num::traits::WrappingSub
7 + num::traits::WrappingShl
8 + num::traits::WrappingShr
9 + std::ops::BitAnd<Output = Self>
10 + std::ops::BitOr<Output = Self>
11 + std::ops::BitXor<Output = Self>
12 + std::ops::Shl<Output = Self>
13 + std::ops::Shr<Output = Self>
14{
15 const ZERO: Self;
16 const BYTES: usize;
17 const P: Self;
18 const Q: Self;
19
20 fn from_usize(val: usize) -> Self;
21 fn from_u8(val: u8) -> Self;
22}
23
24impl Word for u8 {
25 const ZERO: Self = 0u8;
26 const BYTES: usize = 1;
27 const P: Self = 0xB7u8;
28 const Q: Self = 0x9Fu8;
29
30 fn from_usize(val: usize) -> Self {
31 val as Self
32 }
33
34 fn from_u8(val: u8) -> Self {
35 val as Self
36 }
37}
38
39impl Word for u16 {
40 const ZERO: Self = 0u16;
41 const BYTES: usize = 2;
42 const P: Self = 0xB7E1u16;
43 const Q: Self = 0x9E37u16;
44
45 fn from_usize(val: usize) -> Self {
46 val as Self
47 }
48
49 fn from_u8(val: u8) -> Self {
50 val as Self
51 }
52}
53
54impl Word for u32 {
55 const ZERO: Self = 0u32;
56 const BYTES: usize = 4;
57 const P: Self = 0xB7E15163u32;
58 const Q: Self = 0x9E3779B9u32;
59
60 fn from_usize(val: usize) -> Self {
61 val as Self
62 }
63
64 fn from_u8(val: u8) -> Self {
65 val as Self
66 }
67}
68
69impl Word for u64 {
70 const ZERO: Self = 0u64;
71 const BYTES: usize = 8;
72 const P: Self = 0xB7E151628AED2A6Bu64;
73 const Q: Self = 0x9E3779B97F4A7C15u64;
74
75 fn from_usize(val: usize) -> Self {
76 val as Self
77 }
78
79 fn from_u8(val: u8) -> Self {
80 val as Self
81 }
82}
83
84impl Word for u128 {
85 const ZERO: Self = 0u128;
86 const BYTES: usize = 16;
87 const P: Self = 0xB7E151628AED2A6ABF7158809CF4F3C7u128;
88 const Q: Self = 0x9E3779B97F4A7C15F39CC0605CEDC835u128;
89
90 fn from_usize(val: usize) -> Self {
91 val as Self
92 }
93
94 fn from_u8(val: u8) -> Self {
95 val as Self
96 }
97}