1use cai_cyclic;
7
8pub fn encode(data: u8) -> u16 {
10 cai_cyclic::encode(data as u16) as u16
11}
12
13pub fn decode(word: u16) -> Option<(u8, usize)> {
20 cai_cyclic::decode(word as u32).and_then(|(word, err)| {
21 if word >> 8 == 0 {
22 Some((word as u8, err))
23 } else {
24 None
25 }
26 })
27}
28
29#[cfg(test)]
30mod test {
31 use super::*;
32
33 #[test]
34 fn test_decode() {
35 let w = 0b10101011;
36 let e = encode(w);
37 assert_eq!(e, 0b1010_1011_0111_1011);
38
39 assert_eq!(Some((w, 0)), decode(e ^ 0b0000000000000000));
40 assert_eq!(Some((w, 2)), decode(e ^ 0b1000000000000001));
41 assert_eq!(Some((w, 1)), decode(e ^ 0b0001000000000000));
42 assert_eq!(Some((w, 2)), decode(e ^ 0b0011000000000000));
43
44 assert_eq!(Some((w, 1)), decode(e ^ 0b1000000000000000));
45 assert_eq!(Some((w, 1)), decode(e ^ 0b0100000000000000));
46 assert_eq!(Some((w, 2)), decode(e ^ 0b0010000000000001));
47 assert_eq!(Some((w, 2)), decode(e ^ 0b0001000000000010));
48 assert_eq!(Some((w, 2)), decode(e ^ 0b0000100000000100));
49 assert_eq!(Some((w, 2)), decode(e ^ 0b0000010000001000));
50 assert_eq!(Some((w, 2)), decode(e ^ 0b0000001000010000));
51 assert_eq!(Some((w, 2)), decode(e ^ 0b0000000100100000));
52 assert_eq!(Some((w, 2)), decode(e ^ 0b0000000011000000));
53 assert_eq!(Some((w, 2)), decode(e ^ 0b0000000001010000));
54 assert_eq!(Some((w, 2)), decode(e ^ 0b0000000010001000));
55 assert_eq!(Some((w, 2)), decode(e ^ 0b0000000100000100));
56 assert_eq!(Some((w, 2)), decode(e ^ 0b0000001000000010));
57 assert_eq!(Some((w, 2)), decode(e ^ 0b0000010000000001));
58 assert_eq!(Some((w, 1)), decode(e ^ 0b0000100000000000));
59 assert_eq!(Some((w, 1)), decode(e ^ 0b0001000000000000));
60 assert_eq!(Some((w, 2)), decode(e ^ 0b0010000000000001));
61 assert_eq!(Some((w, 2)), decode(e ^ 0b0100000000000100));
62 assert_eq!(Some((w, 2)), decode(e ^ 0b1000000000001000));
63
64 for w in 0..=(!0u8) {
65 assert_eq!(decode(encode(w as u8)), Some((w, 0)));
66 }
67 }
68}