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