1#[allow(dead_code)] const X: u16 = 0xffff;
12
13const FORWARD_TABLE: &[u16] = &[
14 X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,
15 160, X, 1415, 1417, 41, 40, 187, 171, 8212, 46, 1373, 44, 45, 1418, 8230, 1372, 1371, 1374,
16 1329, 1377, 1330, 1378, 1331, 1379, 1332, 1380, 1333, 1381, 1334, 1382, 1335, 1383, 1336, 1384,
17 1337, 1385, 1338, 1386, 1339, 1387, 1340, 1388, 1341, 1389, 1342, 1390, 1343, 1391, 1344, 1392,
18 1345, 1393, 1346, 1394, 1347, 1395, 1348, 1396, 1349, 1397, 1350, 1398, 1351, 1399, 1352, 1400,
19 1353, 1401, 1354, 1402, 1355, 1403, 1356, 1404, 1357, 1405, 1358, 1406, 1359, 1407, 1360, 1408,
20 1361, 1409, 1362, 1410, 1363, 1411, 1364, 1412, 1365, 1413, 1366, 1414, 1370, X,
21]; #[inline]
25pub fn forward(code: u8) -> u16 {
26 FORWARD_TABLE[(code - 0x80) as usize]
27}
28
29#[cfg(not(feature = "no-optimized-legacy-encoding"))]
30const BACKWARD_TABLE_LOWER: &[u8] = &[
31 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
33 241, 243, 245, 247, 249, 251, 253, 162, 0, 163, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35 0, 0, 0, 0, 0, 0, 0, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206,
36 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
37 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
38 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 164, 0, 0, 171, 172, 169, 0, 0, 0, 0,
39 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0,
40 0, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 208,
41 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246,
42 248, 250, 252, 0, 0, 0, 254, 176, 175, 170, 177, 0, 0, 179, 181, 183, 185, 187, 189, 191, 193,
43 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231,
44 233, 235, 237, 239,
45]; #[cfg(not(feature = "no-optimized-legacy-encoding"))]
48const BACKWARD_TABLE_UPPER: &[u16] = &[
49 182, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 293, 64, 0, 0, 0, 0, 0, 0,
50 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
51 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53 0, 0, 0, 143,
54]; #[inline]
58#[cfg(not(feature = "no-optimized-legacy-encoding"))]
59pub fn backward(code: u32) -> u8 {
60 let offset = (code >> 6) as usize;
61 let offset = if offset < 129 {BACKWARD_TABLE_UPPER[offset] as usize} else {0};
62 BACKWARD_TABLE_LOWER[offset + ((code & 63) as usize)]
63}
64
65#[cfg(feature = "no-optimized-legacy-encoding")]
67pub fn backward(code: u32) -> u8 {
68 if code > 8230 || ((0x10005u32 >> (code >> 9)) & 1) == 0 { return 0; }
69 let code = code as u16;
70 for i in 0..0x80 {
71 if FORWARD_TABLE[i as usize] == code { return 0x80 + i; }
72 }
73 0
74}
75
76#[cfg(test)]
77encoding_index_tests::single_byte_tests! {
78}