fast32/base64/
encode_u128.rs

1// unsafe writing adapted from https://doc.rust-lang.org/src/alloc/vec/mod.rs.html#1878
2use core::ptr::write;
3
4use crate::shared::U8_MASK_BOT_6;
5
6use super::alphabet::{
7    BITS, WIDTH_1, WIDTH_10, WIDTH_11, WIDTH_12, WIDTH_13, WIDTH_14, WIDTH_15, WIDTH_16, WIDTH_17,
8    WIDTH_18, WIDTH_19, WIDTH_2, WIDTH_20, WIDTH_21, WIDTH_3, WIDTH_4, WIDTH_5, WIDTH_6, WIDTH_7,
9    WIDTH_8, WIDTH_9,
10};
11
12/// Capacity required in a `Vec<u8>` to encode this u128
13#[inline]
14pub const fn capacity_encode_u128(n: u128) -> usize {
15    if let Some(log) = n.checked_ilog2() {
16        1 + (log / 6) as usize
17    } else {
18        1
19    }
20}
21
22/// Encode u128 with given encoding, into a `String`
23///
24/// Examples:
25/// ```
26/// use fast32::base64::RFC4648_NOPAD;
27/// assert_eq!(RFC4648_NOPAD.encode_u128(111), "Bv");
28/// ```
29pub fn encode_u128(enc: &'static [u8; BITS], n: u128) -> String {
30    let cap = capacity_encode_u128(n);
31    let mut b = Vec::<u8>::with_capacity(cap);
32    encode_u128_inner(enc, n, &mut b, cap, 0, cap);
33    unsafe { String::from_utf8_unchecked(b) }
34}
35
36/// Encode u128 with given encoding, into an existing `Vec<u8>`
37///
38/// Example:
39/// ```
40/// use fast32::base64::RFC4648_NOPAD;
41/// let mut b = Vec::<u8>::with_capacity(2);
42/// RFC4648_NOPAD.encode_u128_into(111, &mut b);
43/// assert_eq!(&b, b"Bv");
44/// ```
45///
46/// Panics if not enough capacity in `b` for encoding -- see [`capacity_encode_u128`](self::capacity_encode_u128())
47pub fn encode_u128_into(enc: &'static [u8; BITS], n: u128, b: &mut Vec<u8>) {
48    let cap = capacity_encode_u128(n);
49    let len = b.len();
50    let new_len = len + cap;
51    assert!(b.capacity() >= new_len, "Missing capacity for encoding");
52    encode_u128_inner(enc, n, b, cap, len, new_len);
53}
54
55#[rustfmt::skip]
56#[inline(always)]
57fn encode_u128_inner(enc: &'static [u8; BITS], n: u128, b: &mut Vec<u8>, cap: usize, len: usize, new_len: usize) {
58    match cap {
59        22 => unsafe {
60            let end = b.as_mut_ptr().add(len);
61
62            // this top char is why u128 is diff output from normal bytes based base64
63            // (other than multiples of 3 byte numbers):
64            // for integer values (identifiers) we use remainder at the high bits, rather than low
65            write(end        , enc[((n >> WIDTH_21) as u8                ) as usize]);
66            write(end.add( 1), enc[((n >> WIDTH_20) as u8 & U8_MASK_BOT_6) as usize]);
67            write(end.add( 2), enc[((n >> WIDTH_19) as u8 & U8_MASK_BOT_6) as usize]);
68            write(end.add( 3), enc[((n >> WIDTH_18) as u8 & U8_MASK_BOT_6) as usize]);
69            write(end.add( 4), enc[((n >> WIDTH_17) as u8 & U8_MASK_BOT_6) as usize]);
70            write(end.add( 5), enc[((n >> WIDTH_16) as u8 & U8_MASK_BOT_6) as usize]);
71            write(end.add( 6), enc[((n >> WIDTH_15) as u8 & U8_MASK_BOT_6) as usize]);
72            write(end.add( 7), enc[((n >> WIDTH_14) as u8 & U8_MASK_BOT_6) as usize]);
73            write(end.add( 8), enc[((n >> WIDTH_13) as u8 & U8_MASK_BOT_6) as usize]);
74            write(end.add( 9), enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
75            write(end.add(10), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
76            write(end.add(11), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
77            write(end.add(12), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
78            write(end.add(13), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
79            write(end.add(14), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
80            write(end.add(15), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
81            write(end.add(16), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
82            write(end.add(17), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
83            write(end.add(18), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
84            write(end.add(19), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
85            write(end.add(20), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
86            write(end.add(21), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
87
88            b.set_len(new_len);
89        }
90
91        21 => unsafe {
92            let end = b.as_mut_ptr().add(len);
93
94            write(end        , enc[((n >> WIDTH_20) as u8 & U8_MASK_BOT_6) as usize]);
95            write(end.add( 1), enc[((n >> WIDTH_19) as u8 & U8_MASK_BOT_6) as usize]);
96            write(end.add( 2), enc[((n >> WIDTH_18) as u8 & U8_MASK_BOT_6) as usize]);
97            write(end.add( 3), enc[((n >> WIDTH_17) as u8 & U8_MASK_BOT_6) as usize]);
98            write(end.add( 4), enc[((n >> WIDTH_16) as u8 & U8_MASK_BOT_6) as usize]);
99            write(end.add( 5), enc[((n >> WIDTH_15) as u8 & U8_MASK_BOT_6) as usize]);
100            write(end.add( 6), enc[((n >> WIDTH_14) as u8 & U8_MASK_BOT_6) as usize]);
101            write(end.add( 7), enc[((n >> WIDTH_13) as u8 & U8_MASK_BOT_6) as usize]);
102            write(end.add( 8), enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
103            write(end.add( 9), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
104            write(end.add(10), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
105            write(end.add(11), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
106            write(end.add(12), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
107            write(end.add(13), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
108            write(end.add(14), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
109            write(end.add(15), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
110            write(end.add(16), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
111            write(end.add(17), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
112            write(end.add(18), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
113            write(end.add(19), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
114            write(end.add(20), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
115
116            b.set_len(new_len);
117        }
118
119        20 => unsafe {
120            let end = b.as_mut_ptr().add(len);
121
122            write(end        , enc[((n >> WIDTH_19) as u8 & U8_MASK_BOT_6) as usize]);
123            write(end.add( 1), enc[((n >> WIDTH_18) as u8 & U8_MASK_BOT_6) as usize]);
124            write(end.add( 2), enc[((n >> WIDTH_17) as u8 & U8_MASK_BOT_6) as usize]);
125            write(end.add( 3), enc[((n >> WIDTH_16) as u8 & U8_MASK_BOT_6) as usize]);
126            write(end.add( 4), enc[((n >> WIDTH_15) as u8 & U8_MASK_BOT_6) as usize]);
127            write(end.add( 5), enc[((n >> WIDTH_14) as u8 & U8_MASK_BOT_6) as usize]);
128            write(end.add( 6), enc[((n >> WIDTH_13) as u8 & U8_MASK_BOT_6) as usize]);
129            write(end.add( 7), enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
130            write(end.add( 8), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
131            write(end.add( 9), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
132            write(end.add(10), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
133            write(end.add(11), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
134            write(end.add(12), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
135            write(end.add(13), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
136            write(end.add(14), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
137            write(end.add(15), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
138            write(end.add(16), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
139            write(end.add(17), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
140            write(end.add(18), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
141            write(end.add(19), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
142
143            b.set_len(new_len);
144        }
145
146        19 => unsafe {
147            let end = b.as_mut_ptr().add(len);
148
149            write(end        , enc[((n >> WIDTH_18) as u8 & U8_MASK_BOT_6) as usize]);
150            write(end.add( 1), enc[((n >> WIDTH_17) as u8 & U8_MASK_BOT_6) as usize]);
151            write(end.add( 2), enc[((n >> WIDTH_16) as u8 & U8_MASK_BOT_6) as usize]);
152            write(end.add( 3), enc[((n >> WIDTH_15) as u8 & U8_MASK_BOT_6) as usize]);
153            write(end.add( 4), enc[((n >> WIDTH_14) as u8 & U8_MASK_BOT_6) as usize]);
154            write(end.add( 5), enc[((n >> WIDTH_13) as u8 & U8_MASK_BOT_6) as usize]);
155            write(end.add( 6), enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
156            write(end.add( 7), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
157            write(end.add( 8), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
158            write(end.add( 9), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
159            write(end.add(10), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
160            write(end.add(11), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
161            write(end.add(12), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
162            write(end.add(13), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
163            write(end.add(14), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
164            write(end.add(15), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
165            write(end.add(16), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
166            write(end.add(17), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
167            write(end.add(18), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
168
169            b.set_len(new_len);
170        }
171
172        18 => unsafe {
173            let end = b.as_mut_ptr().add(len);
174
175            write(end        , enc[((n >> WIDTH_17) as u8 & U8_MASK_BOT_6) as usize]);
176            write(end.add( 1), enc[((n >> WIDTH_16) as u8 & U8_MASK_BOT_6) as usize]);
177            write(end.add( 2), enc[((n >> WIDTH_15) as u8 & U8_MASK_BOT_6) as usize]);
178            write(end.add( 3), enc[((n >> WIDTH_14) as u8 & U8_MASK_BOT_6) as usize]);
179            write(end.add( 4), enc[((n >> WIDTH_13) as u8 & U8_MASK_BOT_6) as usize]);
180            write(end.add( 5), enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
181            write(end.add( 6), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
182            write(end.add( 7), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
183            write(end.add( 8), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
184            write(end.add( 9), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
185            write(end.add(10), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
186            write(end.add(11), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
187            write(end.add(12), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
188            write(end.add(13), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
189            write(end.add(14), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
190            write(end.add(15), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
191            write(end.add(16), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
192            write(end.add(17), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
193
194            b.set_len(new_len);
195        }
196
197        17 => unsafe {
198            let end = b.as_mut_ptr().add(len);
199
200            write(end        , enc[((n >> WIDTH_16) as u8 & U8_MASK_BOT_6) as usize]);
201            write(end.add( 1), enc[((n >> WIDTH_15) as u8 & U8_MASK_BOT_6) as usize]);
202            write(end.add( 2), enc[((n >> WIDTH_14) as u8 & U8_MASK_BOT_6) as usize]);
203            write(end.add( 3), enc[((n >> WIDTH_13) as u8 & U8_MASK_BOT_6) as usize]);
204            write(end.add( 4), enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
205            write(end.add( 5), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
206            write(end.add( 6), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
207            write(end.add( 7), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
208            write(end.add( 8), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
209            write(end.add( 9), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
210            write(end.add(10), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
211            write(end.add(11), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
212            write(end.add(12), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
213            write(end.add(13), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
214            write(end.add(14), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
215            write(end.add(15), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
216            write(end.add(16), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
217
218            b.set_len(new_len);
219        }
220
221        16 => unsafe {
222            let end = b.as_mut_ptr().add(len);
223
224            write(end        , enc[((n >> WIDTH_15) as u8 & U8_MASK_BOT_6) as usize]);
225            write(end.add( 1), enc[((n >> WIDTH_14) as u8 & U8_MASK_BOT_6) as usize]);
226            write(end.add( 2), enc[((n >> WIDTH_13) as u8 & U8_MASK_BOT_6) as usize]);
227            write(end.add( 3), enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
228            write(end.add( 4), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
229            write(end.add( 5), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
230            write(end.add( 6), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
231            write(end.add( 7), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
232            write(end.add( 8), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
233            write(end.add( 9), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
234            write(end.add(10), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
235            write(end.add(11), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
236            write(end.add(12), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
237            write(end.add(13), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
238            write(end.add(14), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
239            write(end.add(15), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
240
241            b.set_len(new_len);
242        }
243
244        15 => unsafe {
245            let end = b.as_mut_ptr().add(len);
246
247            write(end        , enc[((n >> WIDTH_14) as u8 & U8_MASK_BOT_6) as usize]);
248            write(end.add( 1), enc[((n >> WIDTH_13) as u8 & U8_MASK_BOT_6) as usize]);
249            write(end.add( 2), enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
250            write(end.add( 3), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
251            write(end.add( 4), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
252            write(end.add( 5), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
253            write(end.add( 6), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
254            write(end.add( 7), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
255            write(end.add( 8), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
256            write(end.add( 9), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
257            write(end.add(10), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
258            write(end.add(11), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
259            write(end.add(12), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
260            write(end.add(13), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
261            write(end.add(14), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
262
263            b.set_len(new_len);
264        }
265
266        14 => unsafe {
267            let end = b.as_mut_ptr().add(len);
268
269            write(end        , enc[((n >> WIDTH_13) as u8 & U8_MASK_BOT_6) as usize]);
270            write(end.add( 1), enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
271            write(end.add( 2), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
272            write(end.add( 3), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
273            write(end.add( 4), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
274            write(end.add( 5), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
275            write(end.add( 6), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
276            write(end.add( 7), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
277            write(end.add( 8), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
278            write(end.add( 9), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
279            write(end.add(10), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
280            write(end.add(11), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
281            write(end.add(12), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
282            write(end.add(13), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
283
284            b.set_len(new_len);
285        }
286
287        13 => unsafe {
288            let end = b.as_mut_ptr().add(len);
289
290            write(end        , enc[((n >> WIDTH_12) as u8 & U8_MASK_BOT_6) as usize]);
291            write(end.add( 1), enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
292            write(end.add( 2), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
293            write(end.add( 3), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
294            write(end.add( 4), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
295            write(end.add( 5), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
296            write(end.add( 6), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
297            write(end.add( 7), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
298            write(end.add( 8), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
299            write(end.add( 9), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
300            write(end.add(10), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
301            write(end.add(11), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
302            write(end.add(12), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
303
304            b.set_len(new_len);
305        }
306
307        12 => unsafe {
308            let end = b.as_mut_ptr().add(len);
309
310            write(end        , enc[((n >> WIDTH_11) as u8 & U8_MASK_BOT_6) as usize]);
311            write(end.add( 1), enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
312            write(end.add( 2), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
313            write(end.add( 3), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
314            write(end.add( 4), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
315            write(end.add( 5), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
316            write(end.add( 6), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
317            write(end.add( 7), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
318            write(end.add( 8), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
319            write(end.add( 9), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
320            write(end.add(10), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
321            write(end.add(11), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
322
323            b.set_len(new_len);
324        }
325
326        11 => unsafe {
327            let end = b.as_mut_ptr().add(len);
328
329            write(end        , enc[((n >> WIDTH_10) as u8 & U8_MASK_BOT_6) as usize]);
330            write(end.add( 1), enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
331            write(end.add( 2), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
332            write(end.add( 3), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
333            write(end.add( 4), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
334            write(end.add( 5), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
335            write(end.add( 6), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
336            write(end.add( 7), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
337            write(end.add( 8), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
338            write(end.add( 9), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
339            write(end.add(10), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
340
341            b.set_len(new_len);
342        }
343
344        10 => unsafe {
345            let end = b.as_mut_ptr().add(len);
346
347            write(end        , enc[((n >> WIDTH_9) as u8 & U8_MASK_BOT_6) as usize]);
348            write(end.add( 1), enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
349            write(end.add( 2), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
350            write(end.add( 3), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
351            write(end.add( 4), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
352            write(end.add( 5), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
353            write(end.add( 6), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
354            write(end.add( 7), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
355            write(end.add( 8), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
356            write(end.add( 9), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
357
358            b.set_len(new_len);
359        }
360
361        9 => unsafe {
362            let end = b.as_mut_ptr().add(len);
363
364            write(end        , enc[((n >> WIDTH_8) as u8 & U8_MASK_BOT_6) as usize]);
365            write(end.add( 1), enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
366            write(end.add( 2), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
367            write(end.add( 3), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
368            write(end.add( 4), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
369            write(end.add( 5), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
370            write(end.add( 6), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
371            write(end.add( 7), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
372            write(end.add( 8), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
373
374            b.set_len(new_len);
375        }
376
377        8 => unsafe {
378            let end = b.as_mut_ptr().add(len);
379
380            write(end        , enc[((n >> WIDTH_7) as u8 & U8_MASK_BOT_6) as usize]);
381            write(end.add( 1), enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
382            write(end.add( 2), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
383            write(end.add( 3), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
384            write(end.add( 4), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
385            write(end.add( 5), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
386            write(end.add( 6), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
387            write(end.add( 7), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
388
389            b.set_len(new_len);
390        }
391
392        7 => unsafe {
393            let end = b.as_mut_ptr().add(len);
394
395            write(end        , enc[((n >> WIDTH_6) as u8 & U8_MASK_BOT_6) as usize]);
396            write(end.add( 1), enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
397            write(end.add( 2), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
398            write(end.add( 3), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
399            write(end.add( 4), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
400            write(end.add( 5), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
401            write(end.add( 6), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
402
403            b.set_len(new_len);
404        }
405
406        6 => unsafe {
407            let end = b.as_mut_ptr().add(len);
408
409            write(end        , enc[((n >> WIDTH_5) as u8 & U8_MASK_BOT_6) as usize]);
410            write(end.add( 1), enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
411            write(end.add( 2), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
412            write(end.add( 3), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
413            write(end.add( 4), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
414            write(end.add( 5), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
415
416            b.set_len(new_len);
417        }
418
419        5 => unsafe {
420            let end = b.as_mut_ptr().add(len);
421
422            write(end        , enc[((n >> WIDTH_4) as u8 & U8_MASK_BOT_6) as usize]);
423            write(end.add( 1), enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
424            write(end.add( 2), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
425            write(end.add( 3), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
426            write(end.add( 4), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
427
428            b.set_len(new_len);
429        }
430
431        4 => unsafe {
432            let end = b.as_mut_ptr().add(len);
433
434            write(end        , enc[((n >> WIDTH_3) as u8 & U8_MASK_BOT_6) as usize]);
435            write(end.add( 1), enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
436            write(end.add( 2), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
437            write(end.add( 3), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
438
439            b.set_len(new_len);
440        }
441
442        3 => unsafe {
443            let end = b.as_mut_ptr().add(len);
444
445            write(end        , enc[((n >> WIDTH_2) as u8 & U8_MASK_BOT_6) as usize]);
446            write(end.add( 1), enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
447            write(end.add( 2), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
448
449            b.set_len(new_len);
450        }
451
452        2 => unsafe {
453            let end = b.as_mut_ptr().add(len);
454
455            write(end        , enc[((n >> WIDTH_1) as u8 & U8_MASK_BOT_6) as usize]);
456            write(end.add( 1), enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
457
458            b.set_len(new_len);
459        }
460
461        1 => unsafe {
462            let end = b.as_mut_ptr();
463
464            write(end        , enc[( n             as u8 & U8_MASK_BOT_6) as usize]);
465
466            b.set_len(new_len);
467        }
468
469        _ => panic!("Inconceivable! Impossible length for u128")
470    }
471}