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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
macro_rules! lookup_table {
    ($c:expr => $($set:ident;)* $($lit:literal),*) => {{
        const fn init_table() -> [bool; 128] {
            let mut v = [false; 128];

            $(
            lookup_table!(@inner v, $set);
            )*

            $(
            v[$lit as usize] = true;
            )*

            v
        }

        static LOOKUP_TABLE: [bool; 128] = init_table();

        $c.is_ascii() && {
            let c = $c as usize;

            LOOKUP_TABLE[c]
        }
    }};
    (@inner $v:ident, alpha) => {{
        $v[b'A' as usize] = true;
        $v[b'B' as usize] = true;
        $v[b'C' as usize] = true;
        $v[b'D' as usize] = true;
        $v[b'E' as usize] = true;
        $v[b'F' as usize] = true;
        $v[b'G' as usize] = true;
        $v[b'H' as usize] = true;
        $v[b'I' as usize] = true;
        $v[b'J' as usize] = true;
        $v[b'K' as usize] = true;
        $v[b'L' as usize] = true;
        $v[b'M' as usize] = true;
        $v[b'N' as usize] = true;
        $v[b'O' as usize] = true;
        $v[b'P' as usize] = true;
        $v[b'Q' as usize] = true;
        $v[b'R' as usize] = true;
        $v[b'S' as usize] = true;
        $v[b'T' as usize] = true;
        $v[b'U' as usize] = true;
        $v[b'V' as usize] = true;
        $v[b'W' as usize] = true;
        $v[b'X' as usize] = true;
        $v[b'Y' as usize] = true;
        $v[b'Z' as usize] = true;
        $v[b'a' as usize] = true;
        $v[b'b' as usize] = true;
        $v[b'c' as usize] = true;
        $v[b'd' as usize] = true;
        $v[b'e' as usize] = true;
        $v[b'f' as usize] = true;
        $v[b'g' as usize] = true;
        $v[b'h' as usize] = true;
        $v[b'i' as usize] = true;
        $v[b'j' as usize] = true;
        $v[b'k' as usize] = true;
        $v[b'l' as usize] = true;
        $v[b'm' as usize] = true;
        $v[b'n' as usize] = true;
        $v[b'o' as usize] = true;
        $v[b'p' as usize] = true;
        $v[b'q' as usize] = true;
        $v[b'r' as usize] = true;
        $v[b's' as usize] = true;
        $v[b't' as usize] = true;
        $v[b'u' as usize] = true;
        $v[b'v' as usize] = true;
        $v[b'w' as usize] = true;
        $v[b'x' as usize] = true;
        $v[b'y' as usize] = true;
        $v[b'z' as usize] = true;
    }};
    (@inner $v:ident, num) => {{
        $v[b'0' as usize] = true;
        $v[b'1' as usize] = true;
        $v[b'2' as usize] = true;
        $v[b'3' as usize] = true;
        $v[b'4' as usize] = true;
        $v[b'5' as usize] = true;
        $v[b'6' as usize] = true;
        $v[b'7' as usize] = true;
        $v[b'8' as usize] = true;
        $v[b'9' as usize] = true;
    }};
}

macro_rules! encode_set {
    ($fn:ident, $name:ident) => {
        lazy_static::lazy_static! {
            static ref $name: AsciiSet = {
                let mut set = percent_encoding::CONTROLS.add(0);

                for b in 0..=127u8 {
                    if !$fn(b as char) {
                        set = set.add(b);
                    }
                }

                set
            };
        }
    };
}