crc/
table.rs

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    // Generate first table (lane 0) directly
18    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    // Generate subsequent lanes based on lane 0
25    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    // Generate first table (lane 0) directly
56    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    // Generate subsequent lanes based on lane 0
63    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    // Generate first table (lane 0) directly
98    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    // Generate subsequent lanes based on lane 0
105    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    // Generate first table (lane 0) directly
140    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    // Generate subsequent lanes based on lane 0
147    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    // Generate first table (lane 0) directly
182    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    // Generate subsequent lanes based on lane 0
189    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}