1#![allow(dead_code)]
2#![cfg_attr(not(feature = "std"), no_std)]
3
4use core::convert::Infallible;
5use std::fmt::Display;
6
7pub trait UnwrapInfallible {
10 type Ok;
12
13 fn unwrap_infallible(self) -> Self::Ok;
21}
22impl<T> UnwrapInfallible for Result<T, Infallible> {
23 type Ok = T;
24 fn unwrap_infallible(self) -> T {
25 self.unwrap_or_else(|never| match never {})
26 }
27}
28
29#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
30pub struct MoreInputExpected {
31}
32impl std::error::Error for MoreInputExpected {
33}
34impl Display for MoreInputExpected {
35 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
36 write!(f, "MoreInputExpected")
37 }
38}
39
40#[derive(Debug, Copy, Clone, PartialEq, Eq)]
41pub struct EncodingError {
42 pub line_nr: u32,
43}
44#[allow(clippy::new_without_default)]
45impl EncodingError {
46 #[track_caller]
47 pub fn new() -> Self {
48 let location = core::panic::Location::caller();
49 Self {
50 line_nr: location.line(),
51 }
52 }
53}
54impl std::error::Error for EncodingError {
55}
56impl Display for EncodingError {
57 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
58 write!(f, "EncodingError at line {}", self.line_nr)
59 }
60}
61
62impl From<MoreInputExpected> for EncodingError {
63 #[track_caller]
64 fn from(_: MoreInputExpected) -> Self {
65 let location = core::panic::Location::caller();
66 Self {
67 line_nr: location.line(),
68 }
69 }
70}
71
72fn raw_read_bytes(reader: &[u8], size: usize) -> Result<(&[u8], &[u8]), MoreInputExpected> {
73 if reader.len() < size {
74 return Err(MoreInputExpected::default());
75 }
76 let value = &reader[0..size];
77 Ok((value, &reader[size..]))
78}
79fn raw_read_f32(reader: &[u8]) -> Result<(f32, &[u8]), MoreInputExpected> {
80 if reader.len() < 4 {
81 return Err(MoreInputExpected::default());
82 }
83 let mut array : [u8; 4] = reader[0..4]
84 .try_into()
85 .expect("not enough bytes for 4-byte float");
86 array.reverse();
87 let f = f32::from_le_bytes(array);
88 Ok((f, &reader[4..]))
89}
90fn raw_read_f64(reader: &[u8]) -> Result<(f64, &[u8]), MoreInputExpected> {
91 if reader.len() < 8 {
92 return Err(MoreInputExpected::default());
93 }
94 let mut array : [u8; 8] = reader[0..8]
95 .try_into()
96 .expect("not enough bytes for 8-byte float");
97 array.reverse();
98 let f = f64::from_le_bytes(array);
99 Ok((f, &reader[8..]))
100}
101fn raw_read_u8(reader: &[u8]) -> Result<(u8, &[u8]), MoreInputExpected> {
102 if reader.is_empty() {
103 return Err(MoreInputExpected::default());
104 }
105 let value = reader[0];
106 Ok((value, &reader[1..]))
107}
108pub fn remaining_length_of_var_int(first: u8) -> usize {
109 if (first & 0b10000000) == 0 {
110 return 0;
111 }
112 if (first & 0b11000000) == 0b10000000 {
113 return 1;
114 }
115 if (first & 0b11100000) == 0b11000000 {
116 return 2;
117 }
118 if (first & 0b11110000) == 0b11100000 {
119 return 3;
120 }
121 if (first & 0b11111000) == 0b11110000 {
122 return 4;
123 }
124 if (first & 0b11111100) == 0b11111000 {
125 return 5;
126 }
127 if (first & 0b11111110) == 0b11111100 {
128 return 6;
129 }
130 if first == 0b11111110 {
131 return 7;
132 }
133 8
134}
135pub fn raw_read_var_u64(reader: &[u8]) -> Result<(u64,&[u8]), MoreInputExpected> {
136 let first = if let Some(first) = reader.first() {
162 *first as u64
163 } else {
164 return Err(MoreInputExpected::default());
165 };
166 if (first & 0b10000000) == 0 {
173 return Ok((first,&reader[1..]));
174 }
175 if (first & 0b11000000) == 0b10000000 {
179 if reader.len() < 2 {
180 return Err(MoreInputExpected::default());
181 }
182 let value = ((first & 0b00111111) << 8) | reader[1] as u64;
183 return Ok((value,&reader[2..]));
184 }
185 if (first & 0b11100000) == 0b11000000 {
189 if reader.len() < 3 {
190 return Err(MoreInputExpected::default());
191 }
192 let value = ((first & 0b00011111) << 16) | (reader[1] as u64) << 8 | (reader[2] as u64);
193 return Ok((value,&reader[3..]));
194 }
195 if (first & 0b11110000) == 0b11100000 {
196 if reader.len() < 4 {
197 return Err(MoreInputExpected::default());
198 }
199 let value = ((first & 0b00001111) << 24)
200 | (reader[1] as u64) << 16
201 | (reader[2] as u64) << 8
202 | (reader[3] as u64);
203 return Ok((value,&reader[4..]));
204 }
205 if (first & 0b11111000) == 0b11110000 {
209 if reader.len() < 5 {
210 return Err(MoreInputExpected::default());
211 }
212 let value = ((first & 0b00000111) << 32)
213 | (reader[1] as u64) << 24
214 | (reader[2] as u64) << 16
215 | (reader[3] as u64) << 8
216 | (reader[4] as u64);
217 return Ok((value,&reader[5..]));
218 }
219 if (first & 0b11111100) == 0b11111000 {
220 if reader.len() < 6 {
221 return Err(MoreInputExpected::default());
222 }
223 let value = ((first & 0b00000011) << 40)
224 | (reader[1] as u64) << 32
225 | (reader[2] as u64) << 24
226 | (reader[3] as u64) << 16
227 | (reader[4] as u64) << 8
228 | (reader[5] as u64);
229 return Ok((value,&reader[6..]));
230 }
231 if (first & 0b11111110) == 0b11111100 {
232 if reader.len() < 7 {
233 return Err(MoreInputExpected::default());
234 }
235 let value = ((first & 0b00000001) << 48)
236 | (reader[1] as u64) << 40
237 | (reader[2] as u64) << 32
238 | (reader[3] as u64) << 24
239 | (reader[4] as u64) << 16
240 | (reader[5] as u64) << 8
241 | (reader[6] as u64);
242 return Ok((value,&reader[7..]));
243 }
244 if first == 0b11111110 {
245 if reader.len() < 8 {
246 return Err(MoreInputExpected::default());
247 }
248 let value = (reader[1] as u64) << 48
249 | (reader[2] as u64) << 40
250 | (reader[3] as u64) << 32
251 | (reader[4] as u64) << 24
252 | (reader[5] as u64) << 16
253 | (reader[6] as u64) << 8
254 | (reader[7] as u64);
255 return Ok((value,&reader[8..]));
256 }
257 if reader.len() < 9 {
258 return Err(MoreInputExpected::default());
259 }
260 let value = u64::from_be_bytes(reader[1..9].try_into().unwrap());
261 Ok((value,&reader[9..]))
262}
263
264fn raw_read_u64(reader: &[u8], size: usize) -> Result<(u64,&[u8]), MoreInputExpected> {
265 if size > 8 || reader.len() < size {
266 return Err(MoreInputExpected::default());
267 }
268 let mut copy = [0u8; 8];
269 let offset = 8 - size;
270 copy[offset..8].copy_from_slice(&reader[0..size]);
271 let value = u64::from_be_bytes(copy);
272 Ok((value,&reader[size..]))
273}
274
275fn sign_extend(x: i64, nbits: u32) -> i64 {
276 debug_assert!(nbits <= 64);
277 let notherbits = core::mem::size_of_val(&x) as u32 * 8 - nbits;
278 x.wrapping_shl(notherbits).wrapping_shr(notherbits)
279}
280
281fn raw_read_i64(reader: &[u8], size: usize) -> Result<(i64,&[u8]), MoreInputExpected> {
282 if size > 8 || reader.len() < size {
283 return Err(MoreInputExpected::default());
284 }
285 let mut copy = [0u8; 8];
286 let offset = 8 - size;
287 copy[offset..8].copy_from_slice(&reader[0..size]);
288 let value = i64::from_be_bytes(copy);
289 Ok((sign_extend(value, (size as u32) * 8),&reader[size..]))
290}
291
292fn raw_read_var_i64(reader: &[u8]) -> Result<(i64, &[u8]), MoreInputExpected> {
293 let first = reader[0] as u64;
294 let (v,reader) = raw_read_var_u64(reader)?;
295 let bits = if (first & 0b10000000) == 0 {
296 7
297 } else if (first & 0b11000000) == 0b10000000 {
298 14
299 } else if (first & 0b11100000) == 0b11000000 {
300 21
301 } else if (first & 0b11110000) == 0b11100000 {
302 28
303 } else if (first & 0b11111000) == 0b11110000 {
304 35
305 } else if (first & 0b11111100) == 0b11111000 {
306 42
307 } else if (first & 0b11111110) == 0b11111100 {
308 49
309 } else if (first & 0b11111111) == 0b11111110 {
310 56
311 } else {
312 64
313 };
314 Ok((sign_extend(v as i64, bits),reader))
315}
316
317#[derive(Eq, PartialEq, Copy, Clone)]
320pub struct RawReader<'a> {
321 data: &'a [u8],
322}
323
324impl<'a> RawReader<'a> {
325 pub fn with<'b>(data: &'b [u8]) -> Self where 'b: 'a {
326 Self { data, }
327 }
328
329 pub fn read_u8(&mut self) -> Result<u8,MoreInputExpected> {
330 let (v,r) = raw_read_u8(self.data)?;
331 self.data = r;
332 Ok(v)
333 }
334
335 pub fn read_u64(&mut self, len: usize) -> Result<u64,MoreInputExpected> {
336 let (v,r) = raw_read_u64(self.data, len)?;
337 self.data = r;
338 Ok(v)
339 }
340 pub fn read_i64(&mut self, len: usize) -> Result<i64,MoreInputExpected> {
341 let (v,r) = raw_read_i64(self.data, len)?;
342 self.data = r;
343 Ok(v)
344 }
345 pub fn read_var_u64(&mut self) -> Result<u64,MoreInputExpected> {
346 let (v,r) = raw_read_var_u64(self.data)?;
347 self.data = r;
348 Ok(v)
349 }
350
351 pub fn read_var_i64(&mut self) -> Result<i64,MoreInputExpected> {
352 let (v,r) = raw_read_var_i64(self.data)?;
353 self.data = r;
354 Ok(v)
355 }
356
357 pub fn read_bytes(&mut self, len: usize) -> Result<&'a [u8],MoreInputExpected> {
358 let (v,r) = raw_read_bytes(self.data, len)?;
359 self.data = r;
360 Ok(v)
361 }
362
363 pub fn len(&self) -> usize {
364 self.data.len()
365 }
366
367 pub fn is_empty(&self) -> bool {
368 self.data.is_empty()
369 }
370
371 pub fn read_f32(&mut self) -> Result<f32,MoreInputExpected> {
372 let (v,r) = raw_read_f32(self.data)?;
373 self.data = r;
374 Ok(v)
375 }
376
377 pub fn read_f64(&mut self) -> Result<f64,MoreInputExpected> {
378 let (v,r) = raw_read_f64(self.data)?;
379 self.data = r;
380 Ok(v)
381 }
382
383 pub fn read_var_bytes(&mut self) -> Result<&'a [u8],MoreInputExpected> {
384 let length = self.read_var_u64()?;
385 self.read_bytes(length as usize)
386 }
387
388 pub fn skip(&mut self, length: usize) -> Result<(), MoreInputExpected> {
389 if length > self.data.len() {
390 return Err(MoreInputExpected::default());
391 }
392 self.data = &self.data[length..];
393 Ok(())
394 }
395
396 pub fn data(&self) -> &'a [u8] {
397 self.data
398 }
399
400 pub fn truncate(&mut self, max: usize) {
401 if self.data.len() > max {
402 self.data = &self.data[0..max];
403 }
404 }
405}
406
407pub const fn size_of_i64(i: i64) -> usize {
408 if -0x80 <= i && i <= 0x7F {
409 return 1;
410 }
411 if -0x8000 <= i && i <= 0x7FFF {
412 return 2;
413 }
414 if -0x800000 <= i && i <= 0x7FFFFF {
415 return 3;
416 }
417 if -0x80000000 <= i && i <= 0x7FFFFFFF {
418 return 4;
419 }
420 if -0x8000000000 <= i && i <= 0x7FFFFFFFFF {
421 return 5;
422 }
423 if -0x800000000000 <= i && i <= 0x7FFFFFFFFFFF {
424 return 6;
425 }
426 if -0x80000000000000 <= i && i <= 0x7FFFFFFFFFFFFF {
427 return 7;
428 }
429 8
430}
431
432pub const fn size_of_var_i64(i: i64) -> usize {
433 if -0x40 <= i && i <= 0x3F {
434 return 1;
435 }
436 if -0x2000 <= i && i <= 0x1FFF {
437 return 2;
438 }
439 if -0x100000 <= i && i <= 0x0FFFFF {
440 return 3;
441 }
442 if -0x08000000 <= i && i <= 0x07FFFFFF {
443 return 4;
444 }
445 if -0x0400000000 <= i && i <= 0x03FFFFFFFF {
446 return 5;
447 }
448 if -0x020000000000 <= i && i <= 0x01FFFFFFFFFF {
449 return 6;
450 }
451 if -0x01000000000000 <= i && i <= 0x00FFFFFFFFFFFF {
452 return 7;
453 }
454 if -0x0080000000000000 <= i && i <= 0x007FFFFFFFFFFFFF {
455 return 8;
456 }
457 9
458}
459
460pub const fn size_of_var_u64(i: u64) -> usize {
461 if i <= 0x7F {
462 return 1;
463 }
464 if i <= 0x3FFF {
465 return 2;
466 }
467 if i <= 0x1FFFFF {
468 return 3;
469 }
470 if i <= 0x0FFFFFFF {
471 return 4;
472 }
473 if i <= 0x07FFFFFFFF {
474 return 5;
475 }
476 if i <= 0x03FFFFFFFFFF {
477 return 6;
478 }
479 if i <= 0x01FFFFFFFFFFFF {
480 return 7;
481 }
482 if i <= 0x00FFFFFFFFFFFFFF {
483 return 8;
484 }
485 9
486}
487
488pub fn size_of_var_bytes(s: &[u8]) -> usize {
489 size_of_var_u64(s.len() as u64) + s.len()
490}
491
492fn write_var_u64(data: &mut [u8], i: u64) {
493 let len = data.len();
494 match len {
495 1 => {
496 data[0] = i as u8;
497 return;
498 },
499 2 => {
500 data[0] = (i >> 8) as u8 | 0b10000000;
501 },
502 3 => {
503 data[0] = (i >> 16) as u8 | 0b11000000;
504 },
505 4 => {
506 data[0] = (i >> 24) as u8 | 0b11100000;
507 },
508 5 => {
509 data[0] = (i >> 32) as u8 | 0b11110000;
510 },
511 6 => {
512 data[0] = (i >> 40) as u8 | 0b11111000;
513 },
514 7 => {
515 data[0] = (i >> 48) as u8 | 0b11111100;
516 },
517 8 => {
518 data[0] = (i >> 56) as u8 | 0b11111110;
519 },
520 9 => {
521 data[0] = 0xFF;
522 },
523 _ => {
524 panic!("write_var_u64() should always be called with 1 <= len <= 9");
525 },
526 }
527 data[1..len].copy_from_slice(&i.to_be_bytes()[9-len..8]);
528}
529
530pub struct ToRawUnsignedVar {
531 data: [u8; 9],
532 len: u8,
533}
534
535impl ToRawUnsignedVar {
536 pub fn with(number: u64) -> Self {
537 let mut data = [0; 9];
538 let len = size_of_var_u64(number);
539 write_var_u64(&mut data[0..len], number);
540 Self { data, len: len as u8 }
541 }
542}
543
544impl core::ops::Deref for ToRawUnsignedVar {
545 type Target = [u8];
546
547 fn deref(&self) -> &Self::Target {
548 &self.data[0..self.len as usize]
549 }
550}
551
552pub trait RawOutput<E> {
553 fn write_u8(&mut self, n: u8) -> Result<(),E>;
554 fn write_i64(&mut self, n: i64, size: usize) -> Result<(),E>;
555 fn write_u64(&mut self, i: u64, size: usize) -> Result<(),E>;
556 fn write_var_i64(&mut self, i: i64) -> Result<(),E>;
557 fn write_var_u64(&mut self, i: u64) -> Result<(),E>;
558 fn write_f32(&mut self, f: f32) -> Result<(),E>;
559 fn write_f64(&mut self, f: f64) -> Result<(),E>;
560 fn write_bytes(&mut self, s: &[u8]) -> Result<(),E>;
561 fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),E>;
562 fn swap_range(&mut self, a: usize, b: usize) -> Result<(),E>;
563 fn pos(&self) -> usize;
564}
565
566pub fn write_with_header<T,E,E2,Output,Header,Body>(writer: &mut Output, header: Header, body: Body) -> Result<T,E2>
567where
568 Output: RawOutput<E>,
569 Header: FnOnce(&mut Output, u64) -> Result<(),E>,
570 Body: FnOnce(&mut Output) -> Result<T,E2>,
571 E2: std::convert::From<E>,
572{
573 let start = writer.pos();
574 let retval = body(writer)?;
575 let end = writer.pos();
576 let length = end - start;
577 header(writer, length as u64)?;
578 writer.swap_range(start, end)?;
579 Ok(retval)
580}
581
582
583pub struct RawWriterLength {
584 len: usize,
585}
586
587impl RawWriterLength {
588 pub const fn new() -> Self { Self { len: 0 } }
589
590 pub const fn length(&self) -> usize {
591 self.len
592 }
593}
594
595impl Default for RawWriterLength {
596 fn default() -> Self {
597 Self::new()
598 }
599}
600
601impl RawOutput<Infallible> for RawWriterLength {
602 fn write_u8(&mut self, _: u8) -> Result<(),Infallible> {
603 self.len += 1;
604 Ok(())
605 }
606 fn write_i64(&mut self, _: i64, size: usize) -> Result<(),Infallible> {
607 self.len += size;
608 Ok(())
609 }
610
611 fn write_u64(&mut self, _: u64, size: usize) -> Result<(),Infallible> {
612 self.len += size;
613 Ok(())
614 }
615
616 fn write_var_i64(&mut self, i: i64) -> Result<(),Infallible> {
617 self.len += size_of_var_i64(i);
618 Ok(())
619 }
620
621 fn write_var_u64(&mut self, i: u64) -> Result<(),Infallible> {
622 self.len += size_of_var_u64(i);
623 Ok(())
624 }
625
626 fn write_f32(&mut self, _: f32) -> Result<(),Infallible> {
627 self.len += 4;
628 Ok(())
629 }
630
631 fn write_f64(&mut self, _: f64) -> Result<(),Infallible> {
632 self.len += 8;
633 Ok(())
634 }
635
636 fn write_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
637 self.len += s.len();
638 Ok(())
639 }
640
641 fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
642 self.len += size_of_var_u64(s.len() as u64) + s.len();
643 Ok(())
644 }
645
646 fn swap_range(&mut self, _a: usize, _b: usize) -> Result<(),Infallible> {
647 Ok(())
648 }
649
650 fn pos(&self) -> usize {
651 self.len
652 }
653}
654
655
656pub struct RawWriter<'a> {
659 data: &'a mut [u8],
660 pos: usize,
661}
662
663impl<'a> RawOutput<EncodingError> for RawWriter<'a> {
664 fn write_u8(&mut self, n: u8) -> Result<(),EncodingError> {
665 self.check(1)?;
666 self.data[self.pos] = n;
667 self.skip(1)
668 }
669
670 fn write_i64(&mut self, i: i64, size: usize) -> Result<(),EncodingError> {
671 self.check(size)?;
672 let i = i.to_be_bytes();
673 let offset = 8 - size;
674 for p in 0 .. size {
675 self.data[self.pos + p] = i[offset + p];
676 }
677 self.skip(size)
678 }
679
680 fn write_u64(&mut self, i: u64, size: usize) -> Result<(),EncodingError> {
681 self.check(size)?;
682 self.data[self.pos .. self.pos + size].copy_from_slice(&i.to_be_bytes()[8-size..8]);
683 self.skip(size)
684 }
685
686 fn write_var_i64(&mut self, i: i64) -> Result<(),EncodingError> {
687 if (-0x40..=0x3F).contains(&i) { return self.write_u8((i as u8) & 0x7F);
689 }
690 if (-0x2000..=0x1FFF).contains(&i) { return self.write_u64(((i as u64) & 0x3FFF) | (0b10000000 << 8), 2);
692 }
693 if (-0x100000..=0x0FFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x1FFFFF) | (0b11000000 << 16), 3);
695 }
696 if (-0x08000000..=0x07FFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x0FFFFFFF) | (0b11100000 << 24), 4);
698 }
699 if (-0x0400000000..=0x03FFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x07FFFFFFFF) | (0b11110000 << 32), 5);
701 }
702 if (-0x020000000000..=0x01FFFFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x03FFFFFFFFFF) | (0b11111000 << 40), 6);
704 }
705 if (-0x01000000000000..=0x00FFFFFFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x01FFFFFFFFFFFF) | (0b11111100 << 48), 7);
707 }
708 if (-0x0080000000000000..=0x007FFFFFFFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x00FFFFFFFFFFFFFF) | (0b11111110 << 56), 8);
710 }
711 self.check(9)?;
712 self.data[self.pos] = 0xFF;
713 self.data[self.pos + 1..self.pos + 9].copy_from_slice(&i.to_be_bytes());
714 self.skip(9)
715 }
716
717 fn write_var_u64(&mut self, i: u64) -> Result<(),EncodingError> {
718 let len = size_of_var_u64(i);
719 self.check(len)?;
720 write_var_u64(&mut self.data[self.pos..self.pos + len], i);
721 self.skip(len)
722 }
723
724 fn write_f32(&mut self, f: f32) -> Result<(),EncodingError> {
725 self.check(4)?;
726 let mut f = f.to_le_bytes();
727 f.reverse();
728 self.data[self.pos..self.pos + 4].copy_from_slice(&f);
729 self.skip(4)
730 }
731
732 fn write_f64(&mut self, f: f64) -> Result<(),EncodingError> {
733 self.check(8)?;
734 let mut f = f.to_le_bytes();
735 f.reverse();
736 self.data[self.pos..self.pos + 8].copy_from_slice(&f);
737 self.skip(8)
738 }
739
740 fn write_bytes(&mut self, s: &[u8]) -> Result<(),EncodingError> {
741 self.check(s.len())?;
742 self.data[self.pos..self.pos + s.len()].copy_from_slice(s);
743 self.skip(s.len())
744 }
745
746 fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),EncodingError> {
747 self.write_var_u64(s.len() as u64)?;
748 self.write_bytes(s)
749 }
750
751 fn swap_range(&mut self, a: usize, b: usize) -> Result<(),EncodingError> {
752 if a >= self.pos || b >= self.pos || a > b {
753 return Err(EncodingError{ line_nr: line!(), });
754 }
755 self.data[a..self.pos].rotate_left(b - a);
756 Ok(())
757 }
758
759 fn pos(&self) -> usize {
760 self.pos
761 }
762}
763
764impl<'a> RawWriter<'a> {
765 pub fn with_uninit(data: &'a mut [std::mem::MaybeUninit<u8>]) -> Self {
766 unsafe {
767 Self { data: crate::memorypool::MemoryScope::slice_assume_init_mut(data), pos: 0, }
768 }
769 }
770 pub fn with(data: &'a mut [u8]) -> Self {
771 Self { data, pos: 0, }
772 }
773 pub fn check(&mut self, len: usize) -> Result<(),EncodingError> {
774 if self.pos + len <= self.data.len() {
775 Ok(())
776 } else {
777 Err(EncodingError { line_nr: line!()})
778 }
779 }
780 pub fn left(&self) -> usize {
781 self.data.len() - self.pos
782 }
783 fn skip(&mut self, n: usize) -> Result<(), EncodingError> {
784 self.pos += n;
785 Ok(())
786 }
787 pub fn build(self) -> &'a mut [u8] {
788 &mut self.data[0..self.pos]
789 }
790}
791
792pub struct RawScopedArrayBuilder<'a,'c> {
793 pub data: crate::memorypool::ScopedArrayBuilder<'a,'c,u8>,
794 pos: usize,
795}
796
797impl<'a,'c> RawOutput<Infallible> for RawScopedArrayBuilder<'a,'c> {
798 fn write_u8(&mut self, n: u8) -> Result<(),Infallible> {
799 self.extend(1);
800 self.data.as_mut_slice()[self.pos] = n;
801 self.skip(1)
802 }
803
804 fn write_i64(&mut self, i: i64, size: usize) -> Result<(),Infallible> {
805 self.extend(size);
806 let i = i.to_be_bytes();
807 let offset = 8 - size;
808 for p in 0 .. size {
809 self.data.as_mut_slice()[self.pos + p] = i[offset + p];
810 }
811 self.skip(size)
812 }
813
814 fn write_u64(&mut self, i: u64, size: usize) -> Result<(),Infallible> {
815 self.extend(size);
816 self.data.as_mut_slice()[self.pos .. self.pos + size].copy_from_slice(&i.to_be_bytes()[8-size..8]);
817 self.skip(size)
818 }
819
820 fn write_var_i64(&mut self, i: i64) -> Result<(),Infallible> {
821 if (-0x40..=0x3F).contains(&i) { return self.write_u8((i as u8) & 0x7F);
823 }
824 if (-0x2000..=0x1FFF).contains(&i) { return self.write_u64(((i as u64) & 0x3FFF) | (0b10000000 << 8), 2);
826 }
827 if (-0x100000..=0x0FFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x1FFFFF) | (0b11000000 << 16), 3);
829 }
830 if (-0x08000000..=0x07FFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x0FFFFFFF) | (0b11100000 << 24), 4);
832 }
833 if (-0x0400000000..=0x03FFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x07FFFFFFFF) | (0b11110000 << 32), 5);
835 }
836 if (-0x020000000000..=0x01FFFFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x03FFFFFFFFFF) | (0b11111000 << 40), 6);
838 }
839 if (-0x01000000000000..=0x00FFFFFFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x01FFFFFFFFFFFF) | (0b11111100 << 48), 7);
841 }
842 if (-0x0080000000000000..=0x007FFFFFFFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x00FFFFFFFFFFFFFF) | (0b11111110 << 56), 8);
844 }
845 self.extend(9);
846 self.data.as_mut_slice()[self.pos] = 0xFF;
847 self.data.as_mut_slice()[self.pos + 1..self.pos + 9].copy_from_slice(&i.to_be_bytes());
848 self.skip(9)
849 }
850
851 fn write_var_u64(&mut self, i: u64) -> Result<(),Infallible> {
852 let len = size_of_var_u64(i);
853 self.extend(len);
854 write_var_u64(&mut self.data.as_mut_slice()[self.pos..self.pos + len], i);
855 self.skip(len)
856 }
857
858 fn write_f32(&mut self, f: f32) -> Result<(),Infallible> {
859 self.extend(4);
860 let mut f = f.to_le_bytes();
861 f.reverse();
862 self.data.as_mut_slice()[self.pos..self.pos + 4].copy_from_slice(&f);
863 self.skip(4)
864 }
865
866 fn write_f64(&mut self, f: f64) -> Result<(),Infallible> {
867 self.extend(8);
868 let mut f = f.to_le_bytes();
869 f.reverse();
870 self.data.as_mut_slice()[self.pos..self.pos + 8].copy_from_slice(&f);
871 self.skip(8)
872 }
873
874 fn write_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
875 self.extend(s.len());
876 self.data.as_mut_slice()[self.pos..self.pos + s.len()].copy_from_slice(s);
877 self.skip(s.len())
878 }
879
880 fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
881 self.write_var_u64(s.len() as u64)?;
882 self.write_bytes(s)
883 }
884
885 fn swap_range(&mut self, a: usize, b: usize) -> Result<(),Infallible> {
886 self.data.as_mut_slice()[a..self.pos].rotate_left(b - a);
890 Ok(())
891 }
892
893 fn pos(&self) -> usize {
894 self.pos
895 }
896}
897
898impl<'a,'c> RawScopedArrayBuilder<'a,'c> {
899 pub fn new(scope: &'a mut crate::memorypool::MemoryScope<'c>) -> Self {
900 Self { data: crate::memorypool::ScopedArrayBuilder::new(scope), pos: 0 }
901 }
902 pub fn with_capacity(scope: &'a mut crate::memorypool::MemoryScope<'c>, capacity: usize) -> Self {
903 Self { data: crate::memorypool::ScopedArrayBuilder::with_capacity(scope, capacity), pos: 0 }
904 }
905 pub fn extend(&mut self, len: usize) {
906 self.data.extend(len, 0u8);
907 }
908 fn skip(&mut self, n: usize) -> Result<(),Infallible> {
909 self.pos += n;
910 Ok(())
911 }
912 pub fn build(self) -> &'c mut [u8] {
913 self.data.build()
914 }
915 pub fn len(&self) -> usize {
916 self.pos
917 }
918 pub fn is_empty(&self) -> bool {
919 self.pos == 0
920 }
921 pub fn as_slice(&self) -> &[u8] {
922 &self.data.as_slice()[..self.pos]
923 }
924}
925#[derive(Clone,Debug)]
926pub struct RawString {
927 pub data: Vec<u8>,
928}
929
930impl RawOutput<Infallible> for RawString {
931 fn write_u8(&mut self, n: u8) -> Result<(),Infallible> {
932 self.data.push(n);
933 Ok(())
934 }
935
936 fn write_i64(&mut self, i: i64, size: usize) -> Result<(),Infallible> {
937 let i = i.to_be_bytes();
938 let offset = 8 - size;
939 self.data.extend_from_slice(&i[offset..8]);
940 Ok(())
941 }
942
943 fn write_u64(&mut self, i: u64, size: usize) -> Result<(),Infallible> {
944 self.data.extend_from_slice(&i.to_be_bytes()[8-size..8]);
945 Ok(())
946 }
947
948 fn write_var_i64(&mut self, i: i64) -> Result<(),Infallible> {
949 if (-0x40..=0x3F).contains(&i) { return self.write_u8((i as u8) & 0x7F);
951 }
952 if (-0x2000..=0x1FFF).contains(&i) { return self.write_u64(((i as u64) & 0x3FFF) | (0b10000000 << 8), 2);
954 }
955 if (-0x100000..=0x0FFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x1FFFFF) | (0b11000000 << 16), 3);
957 }
958 if (-0x08000000..=0x07FFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x0FFFFFFF) | (0b11100000 << 24), 4);
960 }
961 if (-0x0400000000..=0x03FFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x07FFFFFFFF) | (0b11110000 << 32), 5);
963 }
964 if (-0x020000000000..=0x01FFFFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x03FFFFFFFFFF) | (0b11111000 << 40), 6);
966 }
967 if (-0x01000000000000..=0x00FFFFFFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x01FFFFFFFFFFFF) | (0b11111100 << 48), 7);
969 }
970 if (-0x0080000000000000..=0x007FFFFFFFFFFFFF).contains(&i) { return self.write_u64(((i as u64) & 0x00FFFFFFFFFFFFFF) | (0b11111110 << 56), 8);
972 }
973 self.data.push(0xFF);
974 self.data.extend_from_slice(&i.to_be_bytes());
975 Ok(())
976 }
977
978 fn write_var_u64(&mut self, i: u64) -> Result<(),Infallible> {
979 let len = size_of_var_u64(i);
980 let pos = self.data.len();
981 self.data.resize_with(self.data.len() + len, || 0u8);
982 write_var_u64(&mut self.data.as_mut_slice()[pos..pos + len], i);
983 Ok(())
984 }
985
986 fn write_f32(&mut self, f: f32) -> Result<(),Infallible> {
987 let mut f = f.to_le_bytes();
988 f.reverse();
989 self.data.extend_from_slice(&f);
990 Ok(())
991 }
992
993 fn write_f64(&mut self, f: f64) -> Result<(),Infallible> {
994 let mut f = f.to_le_bytes();
995 f.reverse();
996 self.data.extend_from_slice(&f);
997 Ok(())
998 }
999
1000 fn write_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
1001 self.data.extend_from_slice(s);
1002 Ok(())
1003 }
1004
1005 fn write_var_bytes(&mut self, s: &[u8]) -> Result<(),Infallible> {
1006 self.write_var_u64(s.len() as u64)?;
1007 self.write_bytes(s)
1008 }
1009
1010 fn swap_range(&mut self, a: usize, b: usize) -> Result<(),Infallible> {
1011 let len = self.data.len();
1015 self.data[a..len].rotate_left(b - a);
1016 Ok(())
1017 }
1018
1019 fn pos(&self) -> usize {
1020 self.data.len()
1021 }
1022}
1023
1024impl RawString {
1025 pub fn new() -> Self {
1026 Self { data: Vec::new(), }
1027 }
1028 pub fn with_capacity(capacity: usize) -> Self {
1029 Self { data: Vec::with_capacity(capacity), }
1030 }
1031 pub fn shrink_to_fit(&mut self) {
1032 self.data.shrink_to_fit();
1033 }
1034 pub fn build(self) -> Vec<u8> {
1035 self.data
1036 }
1037 pub fn len(&self) -> usize {
1038 self.data.len()
1039 }
1040 pub fn is_empty(&self) -> bool {
1041 self.data.is_empty()
1042 }
1043 pub fn as_slice(&self) -> &[u8] {
1044 &self.data.as_slice()[..self.len()]
1045 }
1046 pub fn truncate(&mut self, len: usize) {
1047 self.data.truncate(len);
1048 }
1049 pub fn clear(&mut self) {
1050 self.data.clear()
1051 }
1052}
1053
1054impl Default for RawString {
1055 fn default() -> Self {
1056 Self::new()
1057 }
1058}
1059
1060#[cfg(test)]
1061mod tests {
1062 use crate::*;
1063
1064 #[test]
1065 fn fixed_signed_int_test() {
1066 let mut buffer = [0u8; 9];
1067 for i in -16384..=16384 {
1068 println!("testing {}", i);
1069 let mut writer = RawWriter::with(&mut buffer[..]);
1070 writer.write_i64(i, 2).unwrap();
1071 let writer_len = writer.left();
1072 let mut reader = RawReader::with(&buffer[..]);
1073 let r = reader.read_i64(2).unwrap();
1074 assert_eq!(i, r);
1075 assert_eq!(writer_len, reader.len());
1076 }
1077 let i : i64 = 36028797018963968;
1078 println!("leading zeros of {} = {}", i, i.leading_zeros());
1079 let size = size_of_i64(i);
1080 println!("testing {} with size {}", i, size);
1081 let mut writer = RawWriter::with(&mut buffer[..]);
1082 writer.write_i64(i, size).unwrap();
1083 let writer_len = writer.left();
1084 let mut reader = RawReader::with(&buffer[..]);
1085 let r = reader.read_i64(size).unwrap();
1086 assert_eq!(i, r);
1087 assert_eq!(writer_len, reader.len());
1088 }
1089 #[quickcheck]
1090 fn quickcheck_fixed_signed(v: i64) -> bool {
1091 let mut buffer = [0u8; 9];
1092 let size = size_of_i64(v);
1093 let mut writer = RawWriter::with(&mut buffer[..]);
1094 writer.write_i64(v, size).unwrap();
1095 let writer_len = writer.left();
1096 let mut reader = RawReader::with(&buffer[..]);
1097 let r = reader.read_i64(size).unwrap();
1098 r == v && writer_len == reader.len()
1099 }
1100
1101 #[test]
1102 fn var_signed_int_test() {
1103 let mut buffer = [0u8; 9];
1104 for i in -65536..=65536 {
1105 let mut writer = RawWriter::with(&mut buffer[..]);
1106 writer.write_var_i64(i).unwrap();
1107 let writer_left = writer.left();
1108 let mut reader = RawReader::with(&buffer[..]);
1109 let r = reader.read_var_i64().unwrap();
1110 println!("checking {}: {:?}", i, r);
1111 assert_eq!(writer_left, reader.len());
1112 assert_eq!(i, r);
1113 }
1114 for i in [2199023255552_i64, 1048576_i64] {
1115 println!("testing {}", i);
1116 let expected_len = size_of_var_i64(i);
1117 let mut writer = RawWriter::with(&mut buffer[..]);
1118 writer.write_var_i64(i).unwrap();
1119 let writer_left = writer.left();
1120 assert_eq!(expected_len, buffer.len() - writer_left);
1121 let mut reader = RawReader::with(&buffer[..]);
1122 let r = reader.read_var_i64().unwrap();
1123 println!("buffer: {:x?}", &buffer[0..expected_len]);
1124 assert_eq!(reader.len(), writer_left);
1125 assert_eq!(i, r);
1126 }
1127 }
1128 #[quickcheck]
1129 fn quickcheck_i64_var(v: i64) -> bool {
1130 let mut buffer = [0u8; 9];
1131 let expected_len = size_of_var_i64(v);
1132 let mut writer = RawWriter::with(&mut buffer[..]);
1133 writer.write_var_i64(v).unwrap();
1134 let writer_left = writer.left();
1135 let mut reader = RawReader::with(&buffer[..]);
1136 let r = reader.read_var_i64().unwrap();
1137 expected_len == buffer.len() - writer_left && reader.len() == writer_left && r == v
1138 }
1139
1140 #[test]
1141 fn var_unsigned_int_test() {
1142 let mut buffer = [0u8; 9];
1143 for i in 0..=0x0FFFF {
1144 let mut writer = RawWriter::with(&mut buffer[..]);
1145 writer.write_var_u64(i).unwrap();
1146 let writer_left = writer.left();
1147 let mut reader = RawReader::with(&buffer[..]);
1148 let r = reader.read_var_u64().unwrap();
1149 assert_eq!(writer_left, reader.len());
1150 assert_eq!(r, i);
1151 }
1152 }
1153 #[quickcheck]
1154 fn quickcheck_u64_var(v: u64) -> bool {
1155 let mut buffer = [0u8; 9];
1156 let mut writer = RawWriter::with(&mut buffer[..]);
1157 writer.write_var_u64(v).unwrap();
1158 let writer_left = writer.left();
1159 let mut reader = RawReader::with(&buffer[..]);
1160 let r = reader.read_var_u64().unwrap();
1161 writer_left == reader.len() && r == v
1162 }
1163
1164}