pnm decoding and encoding
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
pub trait P<T: Copy> {
    unsafe fn put<const N: usize>(&mut self, x: [T; N]);
    #[cfg_attr(debug_assertions, track_caller)]
    unsafe fn push(&mut self, x: T) {
        self.put([x]);
    }
}

impl<T: Copy> P<T> for *mut T {
    #[cfg_attr(debug_assertions, track_caller)]
    unsafe fn put<const N: usize>(&mut self, x: [T; N]) {
        self.copy_from(x.as_ptr(), N);
        *self = self.add(N);
    }
}

pub const fn encode_bool(x: bool) -> u8 {
    (x as u8) + b'0'
}

const MAGIC: [u32; 256] = [
    538976304, 538976305, 538976306, 538976307, 538976308, 538976309, 538976310, 538976311,
    538976312, 538976313, 538980401, 538980657, 538980913, 538981169, 538981425, 538981681,
    538981937, 538982193, 538982449, 538982705, 538980402, 538980658, 538980914, 538981170,
    538981426, 538981682, 538981938, 538982194, 538982450, 538982706, 538980403, 538980659,
    538980915, 538981171, 538981427, 538981683, 538981939, 538982195, 538982451, 538982707,
    538980404, 538980660, 538980916, 538981172, 538981428, 538981684, 538981940, 538982196,
    538982452, 538982708, 538980405, 538980661, 538980917, 538981173, 538981429, 538981685,
    538981941, 538982197, 538982453, 538982709, 538980406, 538980662, 538980918, 538981174,
    538981430, 538981686, 538981942, 538982198, 538982454, 538982710, 538980407, 538980663,
    538980919, 538981175, 538981431, 538981687, 538981943, 538982199, 538982455, 538982711,
    538980408, 538980664, 538980920, 538981176, 538981432, 538981688, 538981944, 538982200,
    538982456, 538982712, 538980409, 538980665, 538980921, 538981177, 538981433, 538981689,
    538981945, 538982201, 538982457, 538982713, 540028977, 540094513, 540160049, 540225585,
    540291121, 540356657, 540422193, 540487729, 540553265, 540618801, 540029233, 540094769,
    540160305, 540225841, 540291377, 540356913, 540422449, 540487985, 540553521, 540619057,
    0x20303231, 540095025, 540160561, 540226097, 540291633, 540357169, 540422705, 540488241,
    540553777, 540619313, 540029745, 540095281, 540160817, 540226353, 540291889, 540357425,
    540422961, 540488497, 540554033, 540619569, 540030001, 540095537, 540161073, 540226609,
    540292145, 540357681, 540423217, 540488753, 540554289, 540619825, 540030257, 540095793,
    540161329, 540226865, 540292401, 540357937, 540423473, 540489009, 540554545, 540620081,
    540030513, 540096049, 540161585, 540227121, 540292657, 540358193, 540423729, 540489265,
    540554801, 540620337, 540030769, 540096305, 540161841, 540227377, 540292913, 540358449,
    540423985, 540489521, 540555057, 540620593, 540031025, 540096561, 540162097, 540227633,
    540293169, 540358705, 540424241, 540489777, 540555313, 540620849, 540031281, 540096817,
    540162353, 540227889, 540293425, 540358961, 540424497, 540490033, 540555569, 540621105,
    540028978, 540094514, 540160050, 540225586, 540291122, 540356658, 540422194, 540487730,
    540553266, 540618802, 540029234, 540094770, 540160306, 540225842, 540291378, 540356914,
    540422450, 540487986, 540553522, 540619058, 540029490, 540095026, 540160562, 540226098,
    540291634, 540357170, 540422706, 540488242, 540553778, 540619314, 540029746, 540095282,
    540160818, 540226354, 540291890, 540357426, 540422962, 540488498, 540554034, 540619570,
    540030002, 540095538, 540161074, 540226610, 540292146, 540357682, 540423218, 540488754,
    540554290, 540619826, 540030258, 540095794, 540161330, 540226866, 540292402, 540357938,
];

/// Has a space. (_)
pub const fn encode_(x: u8) -> [u8; 4] {
    MAGIC[x as usize].to_le_bytes()
}

pub unsafe fn encodeu32(mut x: u32, buf: &mut *mut u8) {
    let mut tmp = [0; 10];
    let mut tp = tmp.as_mut_ptr();
    while x >= 10 {
        tp.write((x % 10) as u8 + b'0');
        tp = tp.add(1);
        x /= 10;
    }
    tp.write(x as u8 + b'0');
    for b in tmp.into_iter().rev().skip_while(|&b| b == 0) {
        buf.push(b);
    }
}