compact_str/repr/
last_utf8_char.rs

1use alloc::string::String;
2
3/// [`LastUtf8Char`] is an unsigned 8-bit integer data type that has a valid range of `[0, 216]`.
4/// Excluding `[217, 255]` allows the Rust compiler to use these values as niches.
5///
6/// Specifically the compiler can use a value in this range to encode the `None` variant of
7/// `Option<NonMaxU8>` allowing
8/// `std::mem::size_of::<NonMaxU8> == std::mem::size_of::<Option<NonMaxU8>>()`
9#[allow(dead_code)]
10#[derive(Copy, Clone, Debug)]
11#[repr(u8)]
12pub enum LastUtf8Char {
13    // single character, ASCII:
14    V0 = 0,
15    V1 = 1,
16    V2 = 2,
17    V3 = 3,
18    V4 = 4,
19    V5 = 5,
20    V6 = 6,
21    V7 = 7,
22    V8 = 8,
23    V9 = 9,
24    V10 = 10,
25    V11 = 11,
26    V12 = 12,
27    V13 = 13,
28    V14 = 14,
29    V15 = 15,
30    V16 = 16,
31    V17 = 17,
32    V18 = 18,
33    V19 = 19,
34    V20 = 20,
35    V21 = 21,
36    V22 = 22,
37    V23 = 23,
38    V24 = 24,
39    V25 = 25,
40    V26 = 26,
41    V27 = 27,
42    V28 = 28,
43    V29 = 29,
44    V30 = 30,
45    V31 = 31,
46    V32 = 32,
47    V33 = 33,
48    V34 = 34,
49    V35 = 35,
50    V36 = 36,
51    V37 = 37,
52    V38 = 38,
53    V39 = 39,
54    V40 = 40,
55    V41 = 41,
56    V42 = 42,
57    V43 = 43,
58    V44 = 44,
59    V45 = 45,
60    V46 = 46,
61    V47 = 47,
62    V48 = 48,
63    V49 = 49,
64    V50 = 50,
65    V51 = 51,
66    V52 = 52,
67    V53 = 53,
68    V54 = 54,
69    V55 = 55,
70    V56 = 56,
71    V57 = 57,
72    V58 = 58,
73    V59 = 59,
74    V60 = 60,
75    V61 = 61,
76    V62 = 62,
77    V63 = 63,
78    V64 = 64,
79    V65 = 65,
80    V66 = 66,
81    V67 = 67,
82    V68 = 68,
83    V69 = 69,
84    V70 = 70,
85    V71 = 71,
86    V72 = 72,
87    V73 = 73,
88    V74 = 74,
89    V75 = 75,
90    V76 = 76,
91    V77 = 77,
92    V78 = 78,
93    V79 = 79,
94    V80 = 80,
95    V81 = 81,
96    V82 = 82,
97    V83 = 83,
98    V84 = 84,
99    V85 = 85,
100    V86 = 86,
101    V87 = 87,
102    V88 = 88,
103    V89 = 89,
104    V90 = 90,
105    V91 = 91,
106    V92 = 92,
107    V93 = 93,
108    V94 = 94,
109    V95 = 95,
110    V96 = 96,
111    V97 = 97,
112    V98 = 98,
113    V99 = 99,
114    V100 = 100,
115    V101 = 101,
116    V102 = 102,
117    V103 = 103,
118    V104 = 104,
119    V105 = 105,
120    V106 = 106,
121    V107 = 107,
122    V108 = 108,
123    V109 = 109,
124    V110 = 110,
125    V111 = 111,
126    V112 = 112,
127    V113 = 113,
128    V114 = 114,
129    V115 = 115,
130    V116 = 116,
131    V117 = 117,
132    V118 = 118,
133    V119 = 119,
134    V120 = 120,
135    V121 = 121,
136    V122 = 122,
137    V123 = 123,
138    V124 = 124,
139    V125 = 125,
140    V126 = 126,
141    V127 = 127,
142
143    // trailing byte in a multi-byte UTF-8 sequence
144    V128 = 128,
145    V129 = 129,
146    V130 = 130,
147    V131 = 131,
148    V132 = 132,
149    V133 = 133,
150    V134 = 134,
151    V135 = 135,
152    V136 = 136,
153    V137 = 137,
154    V138 = 138,
155    V139 = 139,
156    V140 = 140,
157    V141 = 141,
158    V142 = 142,
159    V143 = 143,
160    V144 = 144,
161    V145 = 145,
162    V146 = 146,
163    V147 = 147,
164    V148 = 148,
165    V149 = 149,
166    V150 = 150,
167    V151 = 151,
168    V152 = 152,
169    V153 = 153,
170    V154 = 154,
171    V155 = 155,
172    V156 = 156,
173    V157 = 157,
174    V158 = 158,
175    V159 = 159,
176    V160 = 160,
177    V161 = 161,
178    V162 = 162,
179    V163 = 163,
180    V164 = 164,
181    V165 = 165,
182    V166 = 166,
183    V167 = 167,
184    V168 = 168,
185    V169 = 169,
186    V170 = 170,
187    V171 = 171,
188    V172 = 172,
189    V173 = 173,
190    V174 = 174,
191    V175 = 175,
192    V176 = 176,
193    V177 = 177,
194    V178 = 178,
195    V179 = 179,
196    V180 = 180,
197    V181 = 181,
198    V182 = 182,
199    V183 = 183,
200    V184 = 184,
201    V185 = 185,
202    V186 = 186,
203    V187 = 187,
204    V188 = 188,
205    V189 = 189,
206    V190 = 190,
207    V191 = 191,
208
209    // Cannot be last character of a UTF-8 sequence (leading byte of a sequence)
210    // V192 .. V244,
211    // Can never occur in UTF-8 (start for a codepoint > U+10FFFF)
212    // V245 .. 255,
213
214    // length marker:
215    L0 = 192,
216    L1 = 193,
217    L2 = 194,
218    L3 = 195,
219    L4 = 196,
220    L5 = 197,
221    L6 = 198,
222    L7 = 199,
223    L8 = 200,
224    L9 = 201,
225    L10 = 202,
226    L11 = 203,
227    L12 = 204,
228    L13 = 205,
229    L14 = 206,
230    L15 = 207,
231    L16 = 208,
232    L17 = 209,
233    L18 = 210,
234    L19 = 211,
235    L20 = 212,
236    L21 = 213,
237    L22 = 214,
238    L23 = 215,
239
240    Heap = 216,
241    Static = 217,
242}
243
244static_assertions::assert_eq_size!(LastUtf8Char, Option<LastUtf8Char>, u8);
245static_assertions::const_assert!(core::mem::size_of::<String>() <= 24);