1use crate::util::*;
2
3pub(crate) const fn crc8_table(width: u8, poly: u8, reflect: bool) -> [u8; 256] {
4 let poly = if reflect {
5 let poly = poly.reverse_bits();
6 poly >> (8u8 - width)
7 } else {
8 poly << (8u8 - width)
9 };
10
11 let mut table = [0u8; 256];
12 let mut i = 0;
13 while i < table.len() {
14 table[i] = crc8(poly, reflect, i as u8);
15 i += 1;
16 }
17 table
18}
19
20pub(crate) const fn crc8_table_slice_16(width: u8, poly: u8, reflect: bool) -> [[u8; 256]; 16] {
21 let poly = if reflect {
22 let poly = poly.reverse_bits();
23 poly >> (8u8 - width)
24 } else {
25 poly << (8u8 - width)
26 };
27
28 let mut table = [[0u8; 256]; 16];
29 let mut i = 0;
30 while i < 256 {
31 table[0][i] = crc8(poly, reflect, i as u8);
32 i += 1;
33 }
34
35 let mut i = 0;
36 while i < 256 {
37 let mut e = 1;
38 while e < 16 {
39 let one_lower = table[e - 1][i];
40 table[e][i] = table[0][one_lower as usize];
41 e += 1;
42 }
43 i += 1;
44 }
45 table
46}
47
48pub(crate) const fn crc16_table(width: u8, poly: u16, reflect: bool) -> [u16; 256] {
49 let poly = if reflect {
50 let poly = poly.reverse_bits();
51 poly >> (16u8 - width)
52 } else {
53 poly << (16u8 - width)
54 };
55
56 let mut table = [0u16; 256];
57 let mut i = 0;
58 while i < table.len() {
59 table[i] = crc16(poly, reflect, i as u16);
60 i += 1;
61 }
62 table
63}
64
65pub(crate) const fn crc16_table_slice_16(width: u8, poly: u16, reflect: bool) -> [[u16; 256]; 16] {
66 let poly = if reflect {
67 let poly = poly.reverse_bits();
68 poly >> (16u8 - width)
69 } else {
70 poly << (16u8 - width)
71 };
72
73 let mut table = [[0u16; 256]; 16];
74 let mut i = 0;
75 while i < 256 {
76 table[0][i] = crc16(poly, reflect, i as u16);
77 i += 1;
78 }
79
80 let mut i = 0;
81 while i < 256 {
82 let mut e = 1;
83 while e < 16 {
84 let one_lower = table[e - 1][i];
85 if reflect {
86 table[e][i] = (one_lower >> 8) ^ table[0][(one_lower & 0xFF) as usize];
87 } else {
88 table[e][i] = (one_lower << 8) ^ table[0][((one_lower >> 8) & 0xFF) as usize];
89 }
90 e += 1;
91 }
92 i += 1;
93 }
94 table
95}
96
97pub(crate) const fn crc32_table(width: u8, poly: u32, reflect: bool) -> [u32; 256] {
98 let poly = if reflect {
99 let poly = poly.reverse_bits();
100 poly >> (32u8 - width)
101 } else {
102 poly << (32u8 - width)
103 };
104
105 let mut table = [0u32; 256];
106 let mut i = 0;
107 while i < 256 {
108 table[i] = crc32(poly, reflect, i as u32);
109 i += 1;
110 }
111
112 table
113}
114
115pub(crate) const fn crc32_table_slice_16(width: u8, poly: u32, reflect: bool) -> [[u32; 256]; 16] {
116 let poly = if reflect {
117 let poly = poly.reverse_bits();
118 poly >> (32u8 - width)
119 } else {
120 poly << (32u8 - width)
121 };
122
123 let mut table = [[0u32; 256]; 16];
124 let mut i = 0;
125 while i < 256 {
126 table[0][i] = crc32(poly, reflect, i as u32);
127 i += 1;
128 }
129
130 let mut i = 0;
131 while i < 256 {
132 let mut e = 1;
133 while e < 16 {
134 let one_lower = table[e - 1][i];
135 if reflect {
136 table[e][i] = (one_lower >> 8) ^ table[0][(one_lower & 0xFF) as usize];
137 } else {
138 table[e][i] = (one_lower << 8) ^ table[0][((one_lower >> 24) & 0xFF) as usize];
139 }
140 e += 1;
141 }
142 i += 1;
143 }
144 table
145}
146
147pub(crate) const fn crc64_table(width: u8, poly: u64, reflect: bool) -> [u64; 256] {
148 let poly = if reflect {
149 let poly = poly.reverse_bits();
150 poly >> (64u8 - width)
151 } else {
152 poly << (64u8 - width)
153 };
154
155 let mut table = [0u64; 256];
156 let mut i = 0;
157 while i < table.len() {
158 table[i] = crc64(poly, reflect, i as u64);
159 i += 1;
160 }
161 table
162}
163
164pub(crate) const fn crc64_table_slice_16(width: u8, poly: u64, reflect: bool) -> [[u64; 256]; 16] {
165 let poly = if reflect {
166 let poly = poly.reverse_bits();
167 poly >> (64u8 - width)
168 } else {
169 poly << (64u8 - width)
170 };
171
172 let mut table = [[0u64; 256]; 16];
173 let mut i = 0;
174 while i < 256 {
175 table[0][i] = crc64(poly, reflect, i as u64);
176 i += 1;
177 }
178
179 let mut i = 0;
180 while i < 256 {
181 let mut e = 1;
182 while e < 16 {
183 let one_lower = table[e - 1][i];
184 if reflect {
185 table[e][i] = (one_lower >> 8) ^ table[0][(one_lower & 0xFF) as usize];
186 } else {
187 table[e][i] = (one_lower << 8) ^ table[0][((one_lower >> 56) & 0xFF) as usize];
188 }
189 e += 1;
190 }
191 i += 1;
192 }
193 table
194}
195
196pub(crate) const fn crc128_table(width: u8, poly: u128, reflect: bool) -> [u128; 256] {
197 let poly = if reflect {
198 let poly = poly.reverse_bits();
199 poly >> (128u8 - width)
200 } else {
201 poly << (128u8 - width)
202 };
203
204 let mut table = [0u128; 256];
205 let mut i = 0;
206 while i < table.len() {
207 table[i] = crc128(poly, reflect, i as u128);
208 i += 1;
209 }
210 table
211}
212
213pub(crate) const fn crc128_table_slice_16(
214 width: u8,
215 poly: u128,
216 reflect: bool,
217) -> [[u128; 256]; 16] {
218 let poly = if reflect {
219 let poly = poly.reverse_bits();
220 poly >> (128u8 - width)
221 } else {
222 poly << (128u8 - width)
223 };
224
225 let mut table = [[0u128; 256]; 16];
226 let mut i = 0;
227 while i < 256 {
228 table[0][i] = crc128(poly, reflect, i as u128);
229 i += 1;
230 }
231
232 let mut i = 0;
233 while i < 256 {
234 let mut e = 1;
235 while e < 16 {
236 let one_lower = table[e - 1][i];
237 if reflect {
238 table[e][i] = (one_lower >> 8) ^ table[0][(one_lower & 0xFF) as usize];
239 } else {
240 table[e][i] = (one_lower << 8) ^ table[0][((one_lower >> 120) & 0xFF) as usize];
241 }
242 e += 1;
243 }
244 i += 1;
245 }
246 table
247}